• 4、wxWidgets菜单和工具栏


    一、菜单

    下面是一个简单的菜单实例:

    main.h

     1 #include <wx/wx.h>
     2 #include <wx/menu.h>
     3 //定义主窗口类
     4 class MyApp : public wxApp
     5 {
     6 public:
     7     virtual bool OnInit();
     8 };
     9 
    10 //定义应用程序类
    11 class MyFrame : public wxFrame
    12 {
    13 public:
    14     MyFrame(const wxString & title);
    15     //定义事件处理函数
    16     void OnQuit(wxCommandEvent & event);
    17     //定义菜单条
    18     wxMenuBar * menubar;
    19     //定义菜单项
    20     wxMenu * file;
    21 };

    main.cpp

     1 #include "main.h"
     2 //实现主框架类
     3 MyFrame::MyFrame(const wxString & title)
     4     : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(280, 180))
     5 {
        menubar = new wxMenuBar;
        file = new wxMenu;
    6 //为菜单项添加内容 7 file->Append(wxID_EXIT, _T("&Quit Ctrl-Q"), _T("Quit the program")); 8 //设置菜单条的内容 9 menubar->Append(file, _T("&File")); 10 //将菜单项加载到菜单条上 11 SetMenuBar(menubar); 12 //为菜单添加处理函数 13 Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MyFrame::OnQuit)); 14 //使窗口居中 15 Centre(); 16 } 17 18 void MyFrame::OnQuit(wxCommandEvent & event) 19 { 20 Close(true); 21 } 22 //声明应用程序 23 IMPLEMENT_APP(MyApp) 24 25 bool MyApp::OnInit() 26 { 27 MyFrame * menu = new MyFrame(_T("Menu")); 28 menu->Show(true); 29 30 return true; 31 }

    File->Append(wxID_EXIT, _T("&Quit Ctrl-Q"));

    我们把一个菜单选项添加进菜单对象。第一个参数是是菜单选项的ID,第二个参数选项的名称,第三个选项是提示字符串。在这里,我们没有明确地建立一个wxMenuItem对象,它是被Append()方法隐式创建的,接下来的例子我们将演示如何手动创建wxMenuItem对象。

    Menubar->Append(file, _T("&File"));

    SetMenuBar(menubar);

    最后,我们把这个菜单添加进菜单栏,字符&建立了一种以快捷键来操作的方式,这个程序你可以使用Ctrl+Q来关闭程序。最后我们调用了SetMenuBar()方法,这个方法属于wxFrame组件,它设置了菜单栏。

    二、子菜单

    每一个菜单都可以有一个子菜单,这样我们可以把相似的命令放到一个子菜单中。例如,我们可以显示或隐藏各种工具栏(地址栏、状态栏、导航栏)的选项添加到子菜单中。在一个菜单中我们可以使用分隔符把命令分开,分隔符是一条简单的线段。把像新建、打开、保存之类的命令和打印、打印预览之类的命令用一个简单分隔符分开是很容易做到的。在我们的例子中,我们会看到如何创建一个子菜单和一个菜单分隔符。

    main.h

     1 #include <wx/wx.h>
     2 #include <wx/menu.h>
     3 //定义主窗口类
     4 class MyApp : public wxApp
     5 {
     6 public:
     7     virtual bool OnInit();
     8 };
     9 
    10 //定义应用程序类
    11 class MyFrame : public wxFrame
    12 {
    13 public:
    14     MyFrame(const wxString & title);
    15     //定义事件处理函数
    16     void OnQuit(wxCommandEvent & event);
    17     //定义菜单条
    18     wxMenuBar * menubar;
    19     //定义菜单项
    20     wxMenu * file;
    21     wxMenu * imp;
    22 
    23     wxMenuItem * quit;
    24 };

    main.cpp

     1 #include "main.h"
     2 //实现主框架类
     3 MyFrame::MyFrame(const wxString & title)
     4     : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(280, 180))
     5 {
     6     menubar = new wxMenuBar;
     7 
     8     file = new wxMenu;
     9     //为菜单项添加内容
    10     //file->Append(wxID_EXIT, _T("&Quit	Ctrl-Q"), _T("Quit the program"));
    11     file->Append(wxID_ANY, _T("&New"));
    12     file->Append(wxID_ANY, _T("&Open"));
    13     file->Append(wxID_ANY, _T("&Save"));
    14     //在菜单条中创建一个分隔符
    15     file->AppendSeparator();
    16     //为菜单imp定义子菜单
    17     imp = new wxMenu;
    18     imp->Append(wxID_ANY, _T("Import newsfeed list..."));
    19     imp->Append(wxID_ANY, _T("Import bookmarks..."));
    20     imp->Append(wxID_ANY, _T("Import mail..."));
    21     //将拥有子菜单的菜单加载到file中
    22     file->AppendSubMenu(imp, _T("I&mport"));
    23     //创建一个wxMenuItem
    24     quit = new wxMenuItem(file, wxID_EXIT, _T("&Quit	Ctrl+Q"));
    25     //将新创建的微信MenuItem加载到file中
    26     file->Append(quit);
    27 
    28     //设置菜单条的内容
    29     menubar->Append(file, _T("&File"));
    30     //将菜单项加载到菜单条上
    31     SetMenuBar(menubar);
    32     //为菜单添加处理函数
    33     Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MyFrame::OnQuit));
    34     //使窗口居中
    35     Centre();
    36 }
    37 
    38 void MyFrame::OnQuit(wxCommandEvent & event)
    39 {
    40     Close(true);
    41 }
    42 //声明应用程序
    43 IMPLEMENT_APP(MyApp)
    44 
    45 bool MyApp::OnInit()
    46 {
    47     MyFrame * menu = new MyFrame(_T("SubMenu"));
    48     menu->Show(true);
    49 
    50     return true;
    51 }

    三、工具栏

    菜单把所有程序的命令组合在一起,而工具栏提供一种快速操作最频繁使用的命令的方法。

    Virtual wxToolBar * CreateToolBar(long style = wxNO_BORDER | wxTB_HORIZONTAL, wxWindowID id = -1, const wxString & name = "toolBar");
    

     要创建一个工具栏,我们可以在frame组件内调用CreateToolBar()方法。

    下面是一个简单的工具栏实例。

    main.h

     1 #include <wx/wx.h>
     2 
     3 //定义主窗口类
     4 class MyApp : public wxApp
     5 {
     6 public:
     7     virtual bool OnInit();
     8 };
     9 
    10 //定义应用程序类
    11 class MyFrame : public wxFrame
    12 {
    13 public:
    14     MyFrame(const wxString & title);
    15     //定义事件处理函数
    16     void OnQuit(wxCommandEvent & event);
    17 };

    main.cpp

     1 #include "main.h"
     2 //实现主框架类
     3 MyFrame::MyFrame(const wxString & title)
     4     : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(280, 180))
     5 {
     6     //初始化PNG图像处理模块
     7     wxImage::AddHandler(new wxPNGHandler);
     8     //生成exit.png图片
     9     wxBitmap exit(_T("exit.png"), wxBITMAP_TYPE_PNG);
    10     //创建工具栏
    11     wxToolBar * toolbar = CreateToolBar();
    12     //将exit加载到工具栏
    13     toolbar->AddTool(wxID_EXIT, exit, _T("Exit application"));
    14     //调用Realize()方法实现工具栏
    15     toolbar->Realize();
    16     //动态关联事件处理函数
    17     Connect(wxID_EXIT, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler(MyFrame::OnQuit));
    18 
    19     Centre();
    20 }
    21 
    22 void MyFrame::OnQuit(wxCommandEvent & event)
    23 {
    24     Close(true);
    25 }
    26 //声明应用程序
    27 IMPLEMENT_APP(MyApp)
    28 
    29 bool MyApp::OnInit()
    30 {
    31     MyFrame * menu = new MyFrame(_T("ToolBar"));
    32     menu->Show(true);
    33 
    34     return true;
    35 }

    在我们的例子中,我们创建了一个工具栏和一个工具按钮,单击那个按钮会终止程序运行。

    wxToolBar * toolbar = CreateToolBar();
    

    我们创建了一个工具栏。

    Toolbar->AddTool(wxID_EXIT, exit, _T("Exit application"));
    

    我们把一个工具添加到工具栏。

    Toolbar->Realize();
    

    在我们添加完工具后,我们调用Realize()方法实现这个工具栏。

    如果我们想要多个工具栏,我们必须用不同的方法去创建它们。

    main.h

     1 #include <wx/wx.h>
     2 
     3 //定义主窗口类
     4 class MyApp : public wxApp
     5 {
     6 public:
     7     virtual bool OnInit();
     8 };
     9 
    10 //定义应用程序类
    11 class MyFrame : public wxFrame
    12 {
    13 public:
    14     MyFrame(const wxString & title);
    15     //定义事件处理函数
    16     void OnQuit(wxCommandEvent & event);
    17 
    18     wxToolBar * toolbar1;
    19     wxToolBar * toolbar2;
    20 };

    main.cpp

     1 #include "main.h"
     2 //实现主框架类
     3 MyFrame::MyFrame(const wxString & title)
     4     : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(480, 380))
     5 {
     6     //初始化PNG图像处理模块
     7     wxImage::AddHandler(new wxPNGHandler);
     8     //生成exit.png图片
     9     wxBitmap exit(_T("exit.png"), wxBITMAP_TYPE_PNG);
    10     wxBitmap newb(_T("new.png"), wxBITMAP_TYPE_PNG);
    11     wxBitmap open(_T("open.png"), wxBITMAP_TYPE_PNG);
    12     wxBitmap save(_T("save.png"), wxBITMAP_TYPE_PNG);
    13     //创建了一个锤子布局控件
    14     wxBoxSizer * vbox = new wxBoxSizer(wxVERTICAL);
    15     //创建工具栏
    16     toolbar1 = CreateToolBar();
    17     toolbar1->AddTool(wxID_ANY, newb, _T(""));
    18     toolbar1->AddTool(wxID_ANY, open, _T(""));
    19     toolbar1->AddTool(wxID_ANY, save, _T(""));
    20     //调用Realize()方法实现工具栏
    21     toolbar1->Realize();
    22 
    23     toolbar2 = new wxToolBar(this, wxID_ANY);
    24     toolbar2->AddTool(wxID_EXIT, exit, _T("Exit application"));
    25     toolbar2->Realize();
    26 
    27     vbox->Add(toolbar1, 0, wxEXPAND);
    28     vbox->Add(toolbar2, 0, wxEXPAND);
    29 
    30     SetSizer(vbox);
    31     //动态关联事件处理函数
    32     Connect(wxID_EXIT, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler(MyFrame::OnQuit));
    33 
    34     Centre();
    35 }
    36 
    37 void MyFrame::OnQuit(wxCommandEvent & event)
    38 {
    39     Close(true);
    40 }
    41 //声明应用程序
    42 IMPLEMENT_APP(MyApp)
    43 
    44 bool MyApp::OnInit()
    45 {
    46     MyFrame * menu = new MyFrame(_T("ToolBar"));
    47     menu->Show(true);
    48 
    49     return true;
    50 }

    在我们的例子中,我们创建了两个水平的工具栏,并且把它们放置到一个垂直的布局控件中。

    toolbar1 = new wxToolBar(this, wxID_ANY);
    ……
    toolbar2 = new wxToolBar(this, wxID_ANY);
    

    这里我们创建了两个工具栏。

    vbox->Add(toolbar1, 0, wxEXPAND);
    vbox->Add(toolbar2, 0, wxEXPAND);
    

    这里我们把他们添加进垂直的布局控件中。

  • 相关阅读:
    MySQL Backup mysqldump 常用选项与主要用法--转发
    openssl 之RSA加密
    Windows 之Dll/lib导出
    缓存雪崩、击穿、穿透
    时间复杂度
    分布式事务
    mysql主从复制与读写分离
    什么是消息队列?
    微服务架构演化
    高并发问题常规思路
  • 原文地址:https://www.cnblogs.com/Long-w/p/9585707.html
Copyright © 2020-2023  润新知