请先看上一篇《wxWidgets入门》。
修改MyFrame.h:
#ifndef MYFRAME_H #define MYFRAME_H #include <wx/wxprec.h> #ifndef WX_PRECOMP #include <wx/wx.h> #endif // WX_PRECOMP class MyFrame : public wxFrame { public: MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); private: wxToolBar *toolBar; // 给MyFrame增加一个ToolBar wxButton *button; // 这个button将放置在MyFrame上 }; #endif // MYFRAME_H
修改MyFrame.cpp:
#include "MyFrame.h" #include "ToolId.h" MyFrame :: MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame(NULL, wxID_ANY, title, pos, size) { // 新建工具条,作为MyFrame的子窗口 toolBar = new wxToolBar(this, wxID_ANY); // 新建button,作为toolbar的子窗口 button = new wxButton(toolBar, ID_BUTTON, wxT("Click me")); // 告知ToolBar它有了一个新Control toolBar->AddControl(button); // 让MyFrame使用该ToolBar SetToolBar(toolBar); }
进一步的说明:
1) 除了让control成为ToolBar的子窗口,我们还要让ToolBar管理这些control的布局等,所以我们需要toolBar->AddControl(button)这句话;
2) SetToolBar(toolBar)函数(包括CreateStatusBar)可以让MyFrame自动调整GetClientSize()的返回值(但不调整绘图时的坐标原点)。
我们也可以使用CreateToolBar()这个wxFrame的成员函数。
3) 如果你需要多个ToolBar,就没办法用SetToolBar函数,所以你要自己管理Client的大小。一个办法是用GetSize函数计算出工具条占用空间,然后用一个wxWindow(或其他符合要求的widgets)作为MyFrame的子窗口占满Client剩余空间,所有的绘图操作在这个子窗口上做。事实上即使是仅有一个ToolBar也推荐这种方法;因为这样在绘图时可以不用考虑ToolBar所占据的坐标空间。
4) 也许我们还有其他更完善的方法管理多个ToolBar?