为什么wxBLACK_PEN是wxPen*

Why is wxBLACK_PEN a wxPen*?

本文关键字:wxPen PEN wxBLACK 为什么      更新时间:2023-10-16

这太难看了:

wxPaintDC dc(this);
dc.SetPen(*wxBLACK_PEN);
dc.SetBrush(*wxBLACK_BRUSH);

这是因为dc.SetPenconst wxPen& -,正如您所期望的那样。我通常在堆栈上创建笔,为什么这个宏扩展为指针?(我希望const wxPen&)

宏展开为:

wxStockGDI::GetPen(wxStockGDI::PEN_BLACK)

这是一个工厂吗?它被命名为"Get"而不是"Make"....

我应该删除这支笔吗?这将使它的使用更加混乱!

这不是一个支持"工厂"假设的const wxPen*。我可以改变它!

为什么返回一个指针?我应该删掉它吗?

这样我就不会显得很傻了:
我认为我应该删除它的原因是它不是const,如果我换了这支笔,我不想改变黑色的笔本身!所以它一定是一个副本!

我刚刚试过了(我不喜欢这样的实验),删除钢笔不是一个好主意!(崩溃)

我已经在谷歌上找到了GetPen的代码。

const wxPen* wxStockGDI::GetPen(Item item)
{
    wxPen* pen = static_cast<wxPen*>(ms_stockObject[item]);
    if (pen == NULL)
    {
        switch (item)
        {
        case PEN_BLACK:
            pen = new wxPen(*GetColour(COLOUR_BLACK), 1, wxPENSTYLE_SOLID);
            break;
        case PEN_BLACKDASHED:
            pen = new wxPen(*GetColour(COLOUR_BLACK), 1, wxPENSTYLE_SHORT_DASH);
            break;
        case PEN_BLUE:
            pen = new wxPen(*GetColour(COLOUR_BLUE), 1, wxPENSTYLE_SOLID);
            break;
        case PEN_CYAN:
            pen = new wxPen(*GetColour(COLOUR_CYAN), 1, wxPENSTYLE_SOLID);
            break;
        case PEN_GREEN:
            pen = new wxPen(*GetColour(COLOUR_GREEN), 1, wxPENSTYLE_SOLID);
            break;
        case PEN_YELLOW:
            pen = new wxPen(*GetColour(COLOUR_YELLOW), 1, wxPENSTYLE_SOLID);
            break;
        case PEN_GREY:
            pen = new wxPen(wxColour(wxT("GREY")), 1, wxPENSTYLE_SOLID);
            break;
        case PEN_LIGHTGREY:
            pen = new wxPen(*GetColour(COLOUR_LIGHTGREY), 1, wxPENSTYLE_SOLID);
            break;
        case PEN_MEDIUMGREY:
            pen = new wxPen(wxColour(wxT("MEDIUM GREY")), 1, wxPENSTYLE_SOLID);
            break;
        case PEN_RED:
            pen = new wxPen(*GetColour(COLOUR_RED), 1, wxPENSTYLE_SOLID);
            break;
        case PEN_TRANSPARENT:
            pen = new wxPen(*GetColour(COLOUR_BLACK), 1, wxPENSTYLE_TRANSPARENT);
            break;
        case PEN_WHITE:
            pen = new wxPen(*GetColour(COLOUR_WHITE), 1, wxPENSTYLE_SOLID);
            break;
        default:
            wxFAIL;
        }
        ms_stockObject[item] = pen;
    }
    return pen;
}

(离这里)

我想这是为了报告new呼叫失败。在古代,new返回NULL。(如你所知,现在new抛出std::bad_alloc如果分配失败。)

. .返回类型为const wxPen*。你没看错吗?

这是一个出于兼容性原因的指针。虽然不好看,但是使用wxBLACK_PEN破坏数百万行现有代码会更难看。