zoukankan      html  css  js  c++  java
  • 3、wxWidgets按钮及组件间通信

    一、按钮

    在接下来的这个例子中,我们在框架上创建了一个按钮。我们将会看到,如何建立一个简单的事件处理程序。在这个实例中,为按钮绑定处理事件,使用的是静态时间表的方法

    1 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
    2    EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
    3    EVT_MENU(wxID_EXIT, MyFrame::OnQuit)
    4    EVT_BUTTON(wxID_EXIT, MyFrame::OnQuit)
    5 END_EVENT_TABLE()

    main.h

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

    main.cpp

     1 #include "main.h"
     2 #include "icon.xpm"
     3 
     4 MyFrame::MyFrame(const wxString& title)
     5        : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150))
     6 {
     7     //定义菜单
     8     wxMenu *menuFile = new wxMenu;
     9     menuFile->Append(wxID_EXIT, wxT("Exit ... 	Alt+X"), wxT("Quit this program"));
    10 
    11     wxMenu *menuHelp = new wxMenu;
    12     menuHelp->Append(wxID_ABOUT, wxT("&About ... 	F1"), wxT("Show about frame"));
    13 
    14     //定义菜单栏
    15     wxMenuBar *menuBar = new wxMenuBar;
    16 
    17     //向菜单栏添加菜单
    18     menuBar->Append(menuFile, wxT("&File"));
    19     menuBar->Append(menuHelp, wxT("&Help"));
    20 
    21     //将菜单栏添加到wxFrame中
    22     SetMenuBar(menuBar);
    23 
    24     //添加状态栏
    25     CreateStatusBar();
    26     //将状态栏分为两栏
    27     //CreateStatusBar(2);
    28     //添加状态栏显示内容
    29     SetStatusText(wxT("Welcome to wxWidgets!"));
    30 
    31     //设置应用显示图标
    32     SetIcon(wxIcon(icon_xpm));
    33 
    34     //在wxFrame组件中定义了一个Panel容器,用于放置Button按钮
    35     wxPanel * panel = new wxPanel(this, wxID_ANY);
    36     //添加一个按钮
    37     wxButton * button = new wxButton(panel, wxID_EXIT, wxT("Quit"), wxPoint(20, 20));
    38     button->SetFocus();//按钮自动获取焦点
    39 
    40 
    41     Centre();
    42 }
    43 //声明应用程序
    44 IMPLEMENT_APP(MyApp)
    45 
    46 //初始化应用程序
    47 bool MyApp::OnInit()
    48 {
    49     MyFrame *myframe = new MyFrame(wxT("MyFrame"));
    50     myframe->Show(true);
    51 
    52     return true;
    53 }
    54 
    55 //定义事件表,完成事件和处理函数的映射
    56 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
    57     EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
    58     EVT_MENU(wxID_EXIT, MyFrame::OnQuit)
    59     EVT_BUTTON(wxID_EXIT, MyFrame::OnQuit)
    60 END_EVENT_TABLE()
    61 
    62 //事件处理函数的实现
    63 void MyFrame::OnAbout(wxCommandEvent& event)
    64 {
    65     wxString msg;
    66     //设置msg的内容
    67     msg.Printf(wxT("About hello wxWidgets"), wxVERSION_STRING);
    68     //定义弹出框的内容和标题
    69     wxMessageBox(msg, wxT("About wxWidgets"), wxOK | wxICON_INFORMATION, this);
    70 }
    71 
    72 void MyFrame::OnQuit(wxCommandEvent& event)
    73 {
    74     Close(true);
    75 }

    窗口界面如下:

    二、组件之间通信

      下面是一个组件之间相互通信的例子,在这个实例中,由于每个按钮需要多次点击,因此,为按钮绑定事件处理函数,使用的动态关联时间处理函数的方法。

      静态与动态事件处理函数关联方法的区别,我们会在后面讲事件处理机制中具体讲到。

    main.h

     1 #include <wx/wx.h>
     2 #include <wx/panel.h>
     3 #include <wx/wxprec.h>
     4 #include <wx/stattext.h>
     5 
     6 const int ID_PLUS = 101;
     7 const int ID_MINUS =  102;
     8 
     9 //定义左侧面板
    10 class LeftPanel : public wxPanel
    11 {
    12 public:
    13     LeftPanel(wxPanel * parent);
    14 
    15     void OnPlus(wxCommandEvent & event);
    16     void OnMinus(wxCommandEvent & event);
    17 
    18     wxButton * m_plus;
    19     wxButton * m_minus;
    20     wxPanel * m_parent;
    21     int count;
    22 };
    23 //定义右侧面板
    24 class RightPanel : public wxPanel
    25 {
    26 public:
    27     RightPanel(wxPanel * parent);
    28 
    29     void OnSetText(wxCommandEvent & event);
    30     //静态文本控件
    31     wxStaticText * m_text;
    32 };
    33 
    34 //定义主窗口类
    35 class MyFrame : public wxFrame
    36 {
    37 public:
    38     MyFrame(const wxString& title);
    39     //定义成员变量
    40     LeftPanel * m_lp;
    41     RightPanel * m_rp;
    42 
    43     wxPanel * m_parent;
    44 
    45     //定义事件处理函数
    46     void OnQuit(wxCommandEvent& event);
    47     void OnAbout(wxCommandEvent& event);
    48 private:
    49     //声明静态事件表
    50     DECLARE_EVENT_TABLE()
    51 
    52 };
    53 //定义应用程序类
    54 class MyApp : public wxApp
    55 {
    56   public:
    57     virtual bool OnInit();
    58 };

    main.cpp

      1 #include "main.h"
      2 #include "icon.xpm"
      3 
      4 LeftPanel::LeftPanel(wxPanel * parent)
      5          : wxPanel(parent, wxID_ANY, wxPoint(-1, -1), wxSize(-1, -1), wxBORDER_SUNKEN)
      6 {
      7     //定义一个计数变量
      8     count = 0;
      9     //定义父panel
     10     m_parent = parent;
     11     //定义两个按钮
     12     m_plus = new wxButton(this, ID_PLUS, _T("+"), wxPoint(10, 10));
     13     m_minus = new wxButton(this, ID_MINUS, _T("-"), wxPoint(10, 60));
     14 
     15     //定义动态关联事件处理函数
     16     Connect(ID_PLUS, wxEVT_COMMAND_BUTTON_CLICKED,wxCommandEventHandler(LeftPanel::OnPlus));
     17     Connect(ID_MINUS, wxEVT_COMMAND_BUTTON_CLICKED,wxCommandEventHandler(LeftPanel::OnMinus));
     18 
     19 }
     20 
     21 void LeftPanel::OnPlus(wxCommandEvent & WXUNUSED(event))
     22 {
     23     //更新计数变量
     24     count++;
     25     //获取父panel指针
     26     MyFrame * comm = (MyFrame *)(m_parent->GetParent());
     27     //设置静态文本框的值
     28     comm->m_rp->m_text->SetLabel(wxString::Format(_T("%d"), count));
     29 }
     30 
     31 void LeftPanel::OnMinus(wxCommandEvent & WXUNUSED(event))
     32 {
     33     //更新计数变量
     34     count--;
     35     //获取父panel指针
     36     MyFrame * comm = (MyFrame *)(m_parent->GetParent());
     37     //设置静态文本框的值
     38     comm->m_rp->m_text->SetLabel(wxString::Format(_T("%d"), count));
     39 }
     40 
     41 //定义右侧panel
     42 RightPanel::RightPanel(wxPanel * parent)
     43           : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(270, 150), wxBORDER_SUNKEN)
     44 {
     45     //定义一个静态文本框
     46     m_text = new wxStaticText(this, -1, _T("0"), wxPoint(40, 60));
     47 }
     48 
     49 //实现主窗口类
     50 MyFrame::MyFrame(const wxString& title)
     51        : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150))
     52 {
     53     //定义菜单
     54     wxMenu *menuFile = new wxMenu;
     55     menuFile->Append(wxID_EXIT, wxT("Exit ... 	Alt+X"), wxT("Quit this program"));
     56 
     57     wxMenu *menuHelp = new wxMenu;
     58     menuHelp->Append(wxID_ABOUT, wxT("&About ... 	F1"), wxT("Show about frame"));
     59 
     60     //定义菜单栏
     61     wxMenuBar *menuBar = new wxMenuBar;
     62 
     63     //向菜单栏添加菜单
     64     menuBar->Append(menuFile, wxT("&File"));
     65     menuBar->Append(menuHelp, wxT("&Help"));
     66 
     67     //将菜单栏添加到wxFrame中
     68     SetMenuBar(menuBar);
     69 
     70     //添加状态栏
     71     CreateStatusBar();
     72     //将状态栏分为两栏
     73     //CreateStatusBar(2);
     74     //添加状态栏显示内容
     75     SetStatusText(wxT("Welcome to wxWidgets!"));
     76 
     77     //设置应用显示图标
     78     SetIcon(wxIcon(icon_xpm));
     79 
     80     //定义父panel
     81     m_parent = new wxPanel(this, wxID_ANY);
     82     //定义一个wxBoxSizer
     83     wxBoxSizer * hbox = new wxBoxSizer(wxHORIZONTAL);
     84     //定义左右panel
     85     m_lp = new LeftPanel(m_parent);
     86     m_rp = new RightPanel(m_parent);
     87     //将左右panel加入到wxBoxSizer
     88     hbox->Add(m_lp, 1, wxEXPAND | wxALL, 5);
     89     hbox->Add(m_rp, 1, wxEXPAND | wxALL, 5);
     90     //将wxBoxSizer加载到父panel
     91     m_parent->SetSizer(hbox);
     92 
     93     //使整个wxFrame框架位于屏幕中间
     94     Centre();
     95 }
     96 
     97 //声明应用程序
     98 IMPLEMENT_APP(MyApp)
     99 
    100 //初始化应用程序
    101 bool MyApp::OnInit()
    102 {
    103     MyFrame *myframe = new MyFrame(wxT("MyFrame"));
    104     myframe->Show(true);
    105 
    106     return true;
    107 }
    108 
    109 //定义静态事件表,完成事件和处理函数的映射
    110 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
    111     EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
    112     EVT_MENU(wxID_EXIT, MyFrame::OnQuit)
    113 END_EVENT_TABLE()
    114 
    115 //事件处理函数的实现
    116 void MyFrame::OnAbout(wxCommandEvent& event)
    117 {
    118     wxString msg;
    119     //设置msg的内容
    120     msg.Printf(wxT("About hello wxWidgets"), wxVERSION_STRING);
    121     //定义弹出框的内容和标题
    122     wxMessageBox(msg, wxT("About wxWidgets"), wxOK | wxICON_INFORMATION, this);
    123 }
    124 
    125 void MyFrame::OnQuit(wxCommandEvent& event)
    126 {
    127     Close();
    128 }

    窗口界面如下:

    点击左侧的加减按钮,右侧的数据会同步更新。

  • 相关阅读:
    LeetCode偶尔一题 —— 617. 合并二叉树
    《剑指offer》 —— 链表中倒数第k个节点
    《剑指offer》 —— 青蛙跳台阶问题
    《剑指offer》—— 二维数组中的查找
    《剑指offer》—— 替换空格
    《剑指offer》—— 合并两个排序的链表
    《剑指offer》—— 礼物的最大价值
    生成Nuget 源代码包来重用你的Asp.net MVC代码
    Pro ASP.Net Core MVC 6th 第四章
    Pro ASP.NET Core MVC 6th 第三章
  • 原文地址:https://www.cnblogs.com/Long-w/p/9580340.html
Copyright © 2011-2022 走看看