前面已经创建了一个简单的窗口程序,包括菜单、工具栏和状态栏,能够响应用户消息。但是,这个窗口还过于简单,相较于目标——类似“Visual Studio”的界面,还缺少两样主要的东西:
- 浮动/停靠窗口
- 标签化的多文档界面(Tab MDI)。
wxWidgets提供了高级用户界面(AUI),能够实现所需的功能。
AUI概貌
wxAUI给用户提供了高级界面功能,主要包括浮动窗口、可定制的布局等。
主要功能包括:
- 框架管理。
- 工具栏。
- 非模态控件。
- 视觉与外观。
为了给窗口增加AUI功能,需要在窗口中添加并初始化wxAuiManager变量,并进行相应的初始化工作。
wxAuiManager是AUI框架的核心类,为wxFrame管理与之相联系的窗格(Pane),并使用窗格的wxAuiPaneInfo类确定窗格的停靠和浮动行为。
为窗口增加AUI一般需要以下步骤:
(1)在窗口类中增加wxAuiManager变量。
/// MyFrame.h
class MyFrame : public wxFrame
{
…
wxAuiManager mAuiMgr; /// 定义wxAuiManager变量
};
(2)初始化和清理wxAuiManager。
/// MyFrame.h
MyFrame::MyFrame
{
mAuiMgr.SetManageWindow(this); /// 管理当前窗口
…
CreatePanes(); /// 创建窗格
…
mAuiMgr.Update(); /// 更新管理的内容.
}
MyFrame::~MyFrame
{
mAuiMgr.UnInit(); /// 清理管理器.
}
(3)将子窗口与wxAuiManager相联系,由wxAuiManager进行AUI管理。
/// MyFrame.cpp
void MyFrame::CreatePanes()
{
wxTextCtrl* text1 = new wxTextCtrl(this, -1);
mAuiMgr.AddPane(text1, wxLEFT, "Pane Caption");
wxTextCtrl* text2 = new wxTextCtrl(this, -1);
mAuiMgr.AddPane(text2, wxBOTTOM, "Pane Caption");
}
浮动和停靠窗口
下面,还是以一个程序为列,说一下AUI的用法。
我们的目标是创建一个程序,程序中有2个浮动/可停靠窗口,一个停靠在主窗口的左边,另外2个停靠在主窗口的下边。程序运行效果如下:
主窗口类的代码如下:
/// MainFrame.h
#pragma once
#include "wxInc.h"
class MainFrame : public wxFrame
{
DECLARE_EVENT_TABLE();
public:
MainFrame();
~MainFrame();
protected:
void CreateBars();
void CreatePanes();
private:
wxAuiManager mAuiMgr;
};
/// MainFrame.cpp
#include "MainFrame.h"
BEGIN_EVENT_TABLE(MainFrame , wxFrame)
END_EVENT_TABLE()
MainFrame::MainFrame() : wxFrame(NULL, wxID_ANY, wxT("main window"))
{
/// 将AUI管理器挂接在当前窗口.
mAuiMgr.SetManagedWindow(this);
/// 创建菜单栏、工具栏和状态栏.
CreateBars();
/// 创建浮动窗口.
CreatePanes();
/// 更新AUI管理器的内容.
mAuiMgr.Update();
}
MainFrame::~MainFrame(void)
{
/// 清理AUI管理器.
mAuiMgr.UnInit();
}
void MainFrame::CreateBars()
{
/// 1. 创建菜单栏
wxMenuBar * menuBar = new wxMenuBar();
wxMenu * menu1 = new wxMenu();
menu1->Append(ID_ITEM_1, wxT("subitem 1-1"));
menu1->Append(ID_ITEM_2, wxT("subitem 1-2"));
menuBar->Append(menu1, wxT("item 1"));
SetMenuBar(menuBar);
/// 2. 创建工具栏
wxToolBar * toolBar = new wxToolBar(this, wxID_ANY);
toolBar->AddTool(ID_ITEM_5, wxT("button1"), wxArtProvider::GetBitmap(wxART_GO_BACK, wxART_TOOLBAR));
toolBar->AddTool(ID_ITEM_6, wxT("button2"), wxArtProvider::GetBitmap(wxART_TIP, wxART_TOOLBAR));
toolBar->Realize(); /// 在增加按钮后必须调用此函数
SetToolBar(toolBar);
/// 3. 创建状态栏
wxStatusBar * statusBar = CreateStatusBar(2);
}
void MainFrame::CreatePanes()
{
wxWindow * wnd1 = new wxWindow(this, wxID_ANY);
mAuiMgr.AddPane(wnd1, wxLEFT, wxT("pane 1"));
wxWindow * wnd2 = new wxWindow(this, wxID_ANY);
mAuiMgr.AddPane(wnd2, wxBOTTOM, wxT("pane 2"));
mAuiMgr.Update();
}
浮动工具栏
AUI中提供了浮动工具栏。
为实现浮动工具栏,需要创建wxAuiToolBar的实例,并将其加入AUI管理器,具体代码如下:
/// MainFrame.cpp
……
void MainFrame::CreateBars()
{
……
/// 2. 创建浮动工具栏
/// 2.1 创建wxAuiToolBar工具栏.
wxAuiToolBar * toolBar = new wxAuiToolBar(this, wxID_ANY);
toolBar->AddTool(wxID_OPEN, wxT("open file"), wxArtProvider::GetBitmap(wxART_NEW, wxART_TOOLBAR));
toolBar->AddTool(wxID_CLOSE, wxT("close file"), wxArtProvider::GetBitmap(wxART_DELETE, wxART_TOOLBAR));
toolBar->Realize();
/// 2.2 将工具栏加入AUI管理器,规定其摆放位置等参数.
mAuiMgr.AddPane(toolBar, wxAuiPaneInfo().Name(wxT("tb1")).Caption(wxT("Big Toolbar")).ToolbarPane().Top());
……
}
……