wxWidgets的AUI(高级用户界面,Advanced User Interface)

前面已经创建了一个简单的窗口程序,包括菜单、工具栏和状态栏,能够响应用户消息。但是,这个窗口还过于简单,相较于目标——类似“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());

    ……
}

……
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值