如何设置wxAuiToolBar背景
How to set wxAuiToolBar background?
在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);
}
- 如何在全屏模式下(在OpenGL中)使背景透明
- 使用窗口中的QSlider更改背景音量
- SDL2 透明背景
- 在 Visual C++ 中以编程方式更改按钮的背景图像
- 多重采样背景不显示
- 直接2D用WM_ERASEBKGND擦除背景?
- 在特定时间内更改 QLabel 的背景颜色
- 如何设置与其背景图像大小相对应的窗口大小?
- 更改包含 QButton 的 Qlayout 的背景颜色
- 如何为使用创建窗口创建的窗口创建自定义背景颜色
- 删除K的背景掩码-意味着Python或C++中的集群/
- SystemParametersInfo将背景设置为纯色,而不是实际设置图片
- 背景任务UWP C++只触发一次
- 我正在尝试更改背景的颜色,但它不起作用
- 在 C 中获取背景外壳命令的 PID
- 如何在QT中为QInputDialog输入密码时设置背景非活动和灰色?
- MFC 更改 CListCtrl 背景颜色
- 如何仅设置 QTabWidget 背景颜色样式表
- Qt为所有对话框设置通用背景
- 如何设置wxAuiToolBar背景