0

在 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();
4

1 回答 1

0

首先,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);
    }
于 2014-05-06T15:17:36.707 回答