如何设置wxAuiToolBar背景

How to set wxAuiToolBar background?

本文关键字:wxAuiToolBar 背景 设置 何设置      更新时间:2023-10-16

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

// 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();

首先,wxAUI_TB_PLAIN_BACKGROUND除了更改背景是用一些花哨的渐变绘制还是普通的色调绘制之外,没有其他任何事情。它与透明度无关,尽管文档中的描述是怎么说的。

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

这并不完全是你想要的,你想改变背景的绘制方式(根本不绘制它并使其透明(。因此,创建一个继承自 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);
    }