如何设置wxAuiToolBar背景?

时间:2014-04-29 14:03:01

标签: c++ wxwidgets wxauitoolbar

在wxWidgets3.0.0上,我想要更改wxAuiToolBar背景,所以我创建wxAuiToolBar使用wxAUI_TB_PLAIN_BACKGROUND样式。 但是,没有达到预期的效果。 例如:

// create some toolbars
wxAuiToolBar* tb1 = new wxAuiToolBar(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxAUI_TB_PLAIN_BACKGROUND);
tb1->SetToolBitmapSize(wxSize(48,48));
tb1->AddTool(ID_SampleItem+1, wxT("Test"), wxArtProvider::GetBitmap(wxART_ERROR));
tb1->AddSeparator();
tb1->AddTool(ID_SampleItem+2, wxT("Test"), wxArtProvider::GetBitmap(wxART_QUESTION));
tb1->AddTool(ID_SampleItem+3, wxT("Test"), wxArtProvider::GetBitmap(wxART_INFORMATION));
tb1->AddTool(ID_SampleItem+4, wxT("Test"), wxArtProvider::GetBitmap(wxART_WARNING));
tb1->AddTool(ID_SampleItem+5, wxT("Test"), wxArtProvider::GetBitmap(wxART_MISSING_IMAGE));
tb1->SetCustomOverflowItems(prepend_items, append_items);
tb1->Realize();

1 个答案:

答案 0 :(得分:0)

首先,wxAUI_TB_PLAIN_BACKGROUND除了改变背景是否会用一些花哨的渐变或者简单地绘制之外什么都不做。它与透明度没有任何关系,尽管文档中描述的内容如此。

如何使AUI工具栏以不同方式绘制?使用自定义“工具栏艺术提供程序”。 wxAuiToolBar有一个方法SetArtProvider(),它允许您设置从wxAuiToolBarArt派生的任何类的实例。正如您在其documentation中所看到的,它有很多方法可以绘制工具栏的各个部分。您可以创建自定义艺术品提供者,并以不同方式执行任何操作。

这并不完全是你想要的,你想改变背景的绘制方式(根本不涂漆,让它透明)。因此,创建一个继承自wxAuiDefaultToolBarArt的自定义类,默认情况下,在您未设置自定义艺术品提供者时使用该类,并仅覆盖所需的方法DrawPlainBackground()(或DrawBackground() - 调用其中一个函数是“普通背景标志”似乎唯一影响的事情:

class MyToolBarArt : public wxAuiDefaultToolBarArt {
  public:
    virtual wxAuiToolBarArt* Clone()
    {
        return new MyToolBarArt(*this);
    }

    virtual void DrawPlainBackground(wxDC& dc, wxWindow* wnd, const wxRect& rect)
    {
        // TODO
    }
};

...

tb1->SetArtProvider(new MyToolBarArtProvider);

如果您尝试这样,您会注意到灰色背景不再被绘制 - 但控件有黑色背景而不是透明!默认的黑色背景留在那里。我们需要使用一个技巧 - 使背景透明,我们要求父窗口为我们绘制内容,然后让工具栏继续绘制其余部分。

现在这是丑陋的地方。我在wxWidgets中找不到任何方法要求父窗口将自己绘制到自定义DC中。所以你需要自己实现它。

如果父背景只包含一些纯色,则只需使用相同颜色绘制矩形即可。如果背景是例如一些图像,你可以在那里画它。同样具有更复杂的背景。

在后面的例子中,最好通过父窗口中的自定义方法来实现这一点(无论如何它都知道它如何绘制自己):

class MyParentWindowWithBackground : public wxWindow ... {
  ...
  public:
    void DrawBackground(wxDC& dc, wxRect& rect)
    {
        // TODO: Perform the drawing here...
    }
};

...

    virtual void DrawPlainBackground(wxDC& dc, wxWindow* wnd, const wxRect& rect)
    {
        wxWindow* parent = wnd->GetParent();
        if (parent)
            static_cast<MyParentWindowWithBackground*>(parent)->DrawBackground(dc, rect);
    }