1、

绝大多数GUI程序都是事件驱动的,应用程序一直停留在一个消息循环中,等待这用户或者别的定时事件的发生,一旦收到某种事件,应用程序就将其扔给处理这个事件的函数。

不同的GUI编程架构用不同的方法将他内部的事件处理机制展现给程序开发者。对于wxWidgets来说,事件表机制是最主要的方法。

2、

每个wxEvtHandler的派生类,例如frame、按钮、菜单以及文档等,都会在其内部维护一个事件表,用来告诉wxWidgets事件和事件处理过程的对应关系。所以继承自wxWindow的窗口类,以及应用程序类都是wxEvtHandler的派生类。

下面来创建一个静态的事件表:

a、定义一个直接或者间接继承自wxEvtHandler的类

b、为每一个你想要处理的事件定义一个处理函数

c、在这个类中使用DECLARE_EVENT_TABLE来声明事件表

d、在.cpp文件中事件BEGIN_EVENT_TABLE和END_EVENT_TABLE实现一个事件表

e、在事件表的实现中增加事件宏,来实现从事件到事件处理过程的映射

wxEvent::Skip可以提示事件处理过程对于其中的事件应该继续寻找其父亲的事件表====一般来说在wxWidgets中,你应该通过调用事件Skip方法,而不是通过显示直接调用其父亲对应函数的方法来实现对特殊事件的过滤

继续来看一个例子:

client.h:

#include <wx/wx.h> class MyFrame : public wxFrame
{
public: MyFrame(const wxString& title);void OnQuit(wxCommandEvent& event);void OnAbout(wxCommandEvent& event);void OnSize(wxSizeEvent& event);void OnButtonOK(wxCommandEvent& event);private:DECLARE_EVENT_TABLE(); // 告诉wxWidgets这个类想要自己处理某些事件,这是与EVENT_TABLE对应的
}; // 重载wxApp类的class要实现OnInit来定义自己的初始化函数,同样的还有OnExit等函数(app.h中)
class MyApp: public wxApp
{wxFrame* frame_;
public: bool OnInit();
}; 

client.cpp

#include "stdafx.h"
#include <wx/wx.h>
#include "client.h"#include "mondrian.xpm"MyFrame::MyFrame(const wxString& title): wxFrame(NULL, wxID_ANY, wxT("Hello wxWidgets"), wxPoint(50,50), wxSize(800,600))
{// set icon for applicationSetIcon(wxIcon(mondrian_xpm));wxButton *button = new wxButton(this, wxID_OK, wxT("OK"), wxPoint(200, 200), wxSize(50, 50));wxButton *button2 = new wxButton(this, wxID_NO, wxT("NO"), wxPoint(300, 300), wxSize(50, 50));// Create a menu barwxMenu *fileMenu = new wxMenu;// The "About" item should be in the help menuwxMenu *helpMenu = new wxMenu;helpMenu->Append(wxID_ABOUT, wxT("&About...\tF1"),wxT("Show about dialog"));fileMenu->Append(wxID_EXIT, wxT("E&xit\tAlt-X"),wxT("Quit this program"));// Now append the freshly created menu to the menu bar...wxMenuBar *menuBar = new wxMenuBar();menuBar->Append(fileMenu, wxT("&File"));menuBar->Append(helpMenu, wxT("&Help"));// ... and attach this menu bar to the frameSetMenuBar(menuBar);// Create a status bar just for funCreateStatusBar(2);SetStatusText(wxT("Welcome to wxWidgets!"));
}  // Event table for MyFrame(事件表)
BEGIN_EVENT_TABLE(MyFrame, wxFrame)EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)EVT_MENU(wxID_EXIT,  MyFrame::OnQuit)EVT_SIZE(            MyFrame::OnSize)EVT_BUTTON(wxID_OK,   MyFrame::OnButtonOK)
END_EVENT_TABLE()void MyFrame::OnAbout(wxCommandEvent& event)
{wxString msg;msg.Printf(wxT("Hello and welcome to %s"), wxVERSION_STRING);wxMessageBox(msg, wxT("About Minimal"), wxOK | wxICON_INFORMATION, this);
}void MyFrame::OnQuit(wxCommandEvent& event)
{Close();
}void MyFrame::OnSize(wxSizeEvent& event)
{
//  wxString msg;
//  msg.Printf(wxT("Hello and welcome to %s"), wxVERSION_STRING);
//  wxMessageBox(msg, wxT("About Minimal"), wxOK |
//      wxICON_INFORMATION, this);
}void MyFrame::OnButtonOK(wxCommandEvent& event)
{wxString msg;msg.Printf(wxT("Hello and welcome to %s"), wxVERSION_STRING);wxMessageBox(msg, wxT("About Minimal"), wxOK | wxICON_INFORMATION, this);
}//=======================MyApp============================
bool MyApp::OnInit()
{frame_ = new MyFrame(wxT("Minimal wxWidgets App"));frame_->Show();          return true;
}

useWxWidgets.cpp

// useWxWidgets.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <wx/wx.h>
#include "wx/window.h"
#include "client.h"
#include "windows.h"
#include "wx/frame.h"int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPTSTR    lpCmdLine,_In_ int       nCmdShow)
{// 调用wxApp类来初始化wxWidgetsMyApp* app=new MyApp();wxApp::SetInstance(app);return wxEntry(hInstance,hPrevInstance);
}

转载于:https://www.cnblogs.com/xinyuyuanm/archive/2013/03/28/2987587.html

wxWidgets事件处理(手机播放器连载系列2)相关推荐

  1. EasyDarwin开源手机直播方案:EasyPusher手机直播推送,EasyDarwin流媒体服务器,EasyPlayer手机播放器...

    在不断进行EasyDarwin开源流媒体服务器的功能和性能完善的同时,我们也配套实现了目前在安防和移动互联网行业比较火热的移动端手机直播方案,主要就是我们的 EasyPusher直播推送项目 和 Ea ...

  2. 计算机应用 技术Android,计算机应用技术业毕业设计:Android手机播放器.doc

    计算机应用技术业毕业设计:Android手机播放器 计算机应用技术专业毕业设计:Android手机播放器 9 计算机应用技术专业毕业设计:Andrid手机播放器 摘要 Andrid(中名:安卓)是基于 ...

  3. android局域网播放视频播放器,手机播放器播放局域网内电脑本地的视频

    与手机相比电脑具有功能强.储存大的优点,但我们越来越依赖手机等移动设备,电脑很少开机了.能否把电脑利用起来,为手机等移动设备服务呢?通过设置电脑文件夹共享,同网络中,手机设备可以自由读取电脑硬盘内的文 ...

  4. 三星java手机播放器下载_三星S3930C如何安装从电脑上下载java的方法总结

    综合各位前辈的经验,总结三星S3930C电脑下载java后直接安装方法: 1.S3930C的java兼容性不错,部分java需要改键值.程序可以从各大手机网站下载,乐讯上S3930C的java比较集中 ...

  5. Android平台RTMP/RTSP播放器开发系列之解码和绘制

    本文主要抛砖引玉,粗略介绍下Android平台RTMP/RTSP播放器中解码和绘制相关的部分(Github). 解码 提到解码,大家都知道软硬解,甚至一些公司觉得硬解码已经足够通用,慢慢抛弃软解了,如 ...

  6. 【媒体应用:Android平台VLC媒体播放器探索之路系列】之一:VLC播放器开篇

    作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWells ...

  7. 基于libvlc和wxWidgets的简单播放器代码阅读

    源代码来自 http://git.videolan.org/?p=vlc.git;a=blob_plain;f=doc/libvlc/wx_player.cpp // g++ wx_player.cp ...

  8. macOS使用快捷键控制安卓手机音乐播放器

    0 准备 安卓下一曲/上一曲/播放/暂停:https://developer.android.com/reference/android/view/KeyEvent#KEYCODE_MEDIA_NEX ...

  9. 张利国,龚海平,王植萌.android移动开发入门与进阶,开题报告-基于Android的手机音乐播放器的设计与实现.doc...

    盐城师范学院 毕业设计开题报告 题 目: 基于android的手机音乐播放器 的设计与实现 姓 名: 二级学院: 信息工程学院 专 业: 软件工程 班 级: 12(1) 学 号: 指导教师: 职称: ...

最新文章

  1. BATJ 常考的 21 条 Linux 命令
  2. javascript的族家族史
  3. 关于web项目当中的mybatis的xml 文件的配置启动报错的解决。
  4. 【数学和算法】初识卡尔曼滤波器(二)
  5. back在java里面是什么意思,手机APP中使用history.back()的问题
  6. [Qt教程] 第17篇 2D绘图(七)涂鸦板
  7. mac好用大java_2020 最后,搞个 Mac 玩玩
  8. restful rest_HATEOAS的RESTful服务。 超媒体:REST的秘密要素
  9. How to check bad fix
  10. dp、sp 转换为 px 的工具类
  11. Java虚拟机专题之内存分配(读书笔记)
  12. 和jwt应用场景_一文了解web无状态会话token技术JWT
  13. R语言的特征选择(Feature Selection)包:Boruta和caret
  14. (12)机器学习_特征选择
  15. UOS服务器操作系统部署EKL
  16. Bacnet协议/Bacnet4j读写
  17. WebService 及java网络编程等基础概念(一)
  18. day1 Flappy bird项目介绍
  19. 天大2021年秋学期考试《基础会计》离线作业考核试题
  20. python写新年快乐程序_python turtle 书写新年快乐

热门文章

  1. LeetCode算法题-Design LinkedList(Java实现)
  2. linux 的计划任务 cron
  3. matplotlib.pyplot
  4. “性能监视器”监视系统性能的基本设置
  5. android activity 窗口 样式
  6. python 字符串详解
  7. PostgreSQL 会话级资源隔离探索
  8. C# 中XML序列化与反序列化学习笔记
  9. 莎拉波娃美网新赛服亮相
  10. 一个新基民的感叹:人心不足蛇吞象