和菜单有关的类主要有两个:wxMenuItem和wxMenu。wxMenuItem用于表示一个菜单项,而wxMenu是wxMenuItem的弹出或下拉列表。
现在让我们看看如何给我们的框架类加上菜单:
MyFrame::MyFrame : wxFrame { // 新建下拉菜单 // 该下拉菜单将显示在MyFrame的MenuBar上 // 所以我们不希望它有自己的标题栏 // 如果为其构造函数指定wxString参数 // 该string将在这个menu显示出来时作为其标题栏一并显示出来 wxMenu *menuFile = new wxMenu(); // 菜单项:Open wxMenuItem *menuItemOpen = new wxMenuItem(menuFile, ID_MENUITEM_OPEN, L"Open..."); // 菜单项:Close wxMenuItem *menuItemClose = new wxMenuItem(menuFile, ID_MENUITEM_CLOSE, L"Close..."); // 将菜单项Open加入下拉菜单 menuFile->Append(menuItemOpen); // 将菜单项Close加入下拉菜单 menuFile->Append(menuItemClose); // 创建菜单条 wxMenuBar *menuBar = new wxMenuBar(); // 将下拉菜单加入菜单条 // 该下拉菜单将在menuBar上显示为”File" menuBar->Append(menuFile, L"File"); // 设置MyFrame的菜单条 SetMenuBar(menuBar); }
每一列下拉菜单(或弹出菜单)都是一个wxMenu对象;每一个子菜单本身也是一列下拉菜单,因此也是一个wxMenu对象。
下面的代码给File菜单增加一个Recent Files子菜单,这个子菜单有两个item:R1和R2。
// 子菜单本身也是一个wxMenu对象 wxMenu *menuRecent = new wxMenu(); // 子菜单的两个菜单项 wxMenuItem *menuItemR1 = new wxMenuItem(menuRecent, ID_MENUITEM_R1, L"R1"); wxMenuItem *menuItemR2 = new wxMenuItem(menuRecent, ID_MENUITEM_R2, L"R2"); menuRecent->Append(menuItemR1); menuRecent->Append(menuItemR2); // 使用wxMenu对象的AppendSubMenu函数将子菜单加入File菜单列 menuFile->AppendSubMenu(menuRecent, "Recent Files");
下面的代码将菜单项选择事件与某个处理函数关联:
Bind(wxEVT_MENU, &MyFrame::OnMenuItemOpen, this, ID_MENUITEM_OPEN);