wxWidgets程序整体框架及其执行过程

 

一、整体框架:

    1、一个继承自wxApp的类,类中至少一个返回值为bool的虚函数:OnInit()作为程序入口函数。返回值为真,则wxWidgets开始进入事件循环,接受输入事件并进行处理。返回值为假,则释放已经分配的资源,结束程序的运行。

    2、一个继承自wxFrame的类,此类负责整个窗口的布局。定义一些事件处理函数,以及对事件绑定的宏声明。

    3、类事件列表:BEGIN_EVENT_TABLE()...END_EVENT_TABLE(),对事件和处理事件的函数进行绑定。

    4、程序入口类指定宏:IMPLEMENT_App();

    5、DECLARE_App();

二、程序执行的一般过程

    1、根据不同OS平台,不同的入口函数调用(由wxWidgets内部提供),初始化自己的数据结构,为一-4中指定的类创建一个实例。

    2、wxWidgets调用实例中的OnInit(),而OnInit()又创建一个一-2类的一个实例。

    3、一-2中的构造函数创建一个窗口,并为之加上图标,菜单和工具栏等。

    4、OnInit()显示主窗体并返回真。

    5、wxWidgets进入事件循环,等待并处理事件。

    说明:事件由用户触发,处理事件的方法由类事件列表绑定,处理过程由用户定义。

附:

    1、wxT宏,类似于_T(),_()处理编码兼容性问题。

    2、事件表有动态和静态,以上宏中指定的为静态的。

 

一、事件表的创建和事件的处理过程

    1、静态事件表的创建过程:

        (1)、定义一个直接或者间接继承自wxEvtHandler的类。

        (2)、定义想处理事件的事件处理函数。
        (3)、在DECLARE_EVENT_TABLE中声明事件表。
        (4)、在.cpp中用BEGIN_EVENT_TABLE和END_EVENT_TABLE实现一个事件表。
        (5)、在事件表中加入事件宏,来实现事件到事件处理过程的映射。

    2、事件处理函数的形式

        (1)、返回值为void。

        (2)、都不是虚函数。

        (3)、一个事件对象做为参数。

    3、事件处理过程

        (1)、需要递归查找类事件表的是:wxCommandEvent以及直接或者间接继承此事件的事件。

        (2)、不能传递给父窗口处理的事件:wxActivate,wxCloseEvent,wxEraseEvent,wxFocu-
               sEvent,wxKeyEvent,wxIdleEvent,wxInitDialogEvent,wxJoystickEvent,wxMenuEvent,
             wxMouseEvent,wxMoveEvent,wxPaintEvent,wxQueryLayoutInfoEvent,wxSizeEvent,
             wxScrollWinEvent,wxSysColourChangedEvent。原因在于这些事件只对本窗口有意义。

二、事件的过滤

处理按钮单击事件的过程

    以上为处理按钮单击事件的过程,由此可知:通过这种方法可以改变本地控件的默认行为,方法是继承一个父控件的继承类,在事件表中使用事件映射宏过滤不想要的事件。

    文本框只接受"a"~"z"和"A"~"Z"的输入:

  1. void MyTextCtrl::OnChar( wxKeyEvent& event )  
  2. {  
  3.     if ( wxIsalpha( event.KeyCode() ) )  
  4.     {  
  5.         // 这些按键在可以接受的范围,所以按照正常的流程处理   
  6.         event.Skip();  
  7.     }  
  8.     else  
  9.     {  
  10.         // 这些事件不再我们可以接受的范围,所以不用调用函数Skip   
  11.         // 由于事件表已经匹配并且没有调用函数Skip,所以事件处理   
  12.         // 过程不会再继续匹配别的事件表,而是认为时间处理已经结束。   
  13.         wxBell();  
  14.     }  
  15. }  

三、事件表的挂载

    正在理解。。。

四、动态事件的处理方法

    也就是运行期改变事件表的映射关系。

    两个有关动态事件处理的API:wxEvtHandler::Connect和wxEvtHandler::Disconnect,一般不用手动调用wxEvtHandler::Disconnect,窗口类被释放的时候自动被调用。

    举例:

  1. class  MyFrame : public wxFrame  
  2. {  
  3. public:  
  4.     MyFrame( const wxString& title );  
  5.     void OnQuit( wxCommandEvent& event );  
  6.     void OnAbout( wxCommandEvent& event );  
  7. protected:  
  8. private:  
  9.     // DECLARE_EVENT_TABLE()已经被注释掉了!   
  10. };  

五、窗口标示符

    窗口标识符是在事件系统中用来唯一确定窗口的整数。事实上,在整个应用程序的范围内,窗口标识符不必一定是唯一的,而只要在某个固定的上下文(比如说,在一个frame窗口和它的所有子窗口)内是唯一的就可以了。举例来说:你可以在无数个对话框中使用wxID_OK这个标识符,只要在某个对话框内不要重复使用就可以了。

    wxWidgets自动创建的标识符是总是一个负数,所以永远不会和用户定义的窗口标识符重复,用户定义的窗口标识符只能是正整数。

 

标识符名称描述
wxID_ANY让wxWidgets自动产生一个标识符
wxID_LOWEST最小的系统标识符值 (4999)
wxID_HIGHEST最大的系统标识符值 (5999)
wxID_OPEN打开文件
wxID_CLOSE关闭窗口
wxID_NEW新建窗口文件或者文档
wxID_SAVE保存文件
wxID_SAVEAS文件另存为(应该弹出文件位置对话框)
wxID_REVERT恢复文件在磁盘上的状态
wxID_EXIT退出应用程序
wxID_UNDO撤消最近一次操作
wxID_REDO重复最近一次操作
wxID_HELP帮助 (例如对话框上的帮助按钮可以用这个标识符)
wxID_PRINT打印
wxID_PRINT_SETUP打印设置
wxID_PREVIEW打印预览
wxID_ABOUT显示一个用来描述整个程序的对话框
wxID_HELP_CONTENTS显示上下文帮助
wxID_HELP_COMMANDS显示应用程序命令
wxID_HELP_PROCEDURES显示应用程序过程
wxID_HELP_CONTEXT未使用
wxID_CUT剪切
wxID_COPY复制到剪贴板
wxID_PASTE粘贴
wxID_CLEAR清除
wxID_FIND查找
wxID_DUPLICATE复制
wxID_SELECTALL全选
wxID_DELETE删除
wxID_REPLACE覆盖
wxID_REPLACE_ALL全部覆盖
wxID_PROPERTIES查看属性
wxID_VIEW_DETAILS列表框中的按照详细信息方式显示
wxID_VIEW_LARGEICONS列表框按照大图标的方式显示
wxID_VIEW_SMALLICONS列表框中按照小图标的方式显示
wxID_VIEW_LIST列表框中按照列表的的方式显示
wxID_VIEW_SORTDATE按照日期排序
wxID_VIEW_SORTNAME按照名称排序
wxID_VIEW_SORTSIZE按照大小排序
wxID_VIEW_SORTTYPE按照类型排序
wxID_FILE1 to wxID_FILE9显示最近使用的文件
wxID_OK确定
wxID_CANCEL取消
wxID_APPLY应用变更
wxID_YESYES
wxID_NONo
wxID_STATIC静态文本或者静态图片可以用这个标识符
wxID_FORWARD向前 
wxID_BACKWARD向后
wxID_DEFAULT恢复默认设置
wxID_MORE显示更多选项
wxID_SETUP显示一个设置对话框
wxID_RESET重置所有选项
wxID_CONTEXT_HELP显示上下文帮助
wxID_YESTOALL全部选是
wxID_NOTOALL全部选否
wxID_ABORT中止当前操作
wxID_RETRY重试
wxID_IGNORE忽略错误
wxID_UP向上
wxID_DOWN向下
wxID_HOME首页
wxID_REFRESH刷新
wxID_STOP停止正在进行的操作
wxID_INDEX显示一个索引
wxID_BOLD加粗显示
wxID_ITALIC斜体显示
wxID_JUSTIFY_CENTER居中
wxID_JUSTIFY_FILL格式
wxID_JUSTIFY_RIGHT右对齐
wxID_JUSTIFY_LEFT左对齐
wxID_UNDERLINE下划线
wxID_INDENT缩进
wxID_UNINDENT反缩进
wxID_ZOOM_100放大到100%
wxID_ZOOM_FIT缩放到整页
wxID_ZOOM_IN放大
wxID_ZOOM_OUT缩小
wxID_UNDELETE反删除
wxID_REVERT_TO_SAVED恢复到上次保存的状态

 

      为了避免你自己定义的标识符和这些预定义的标识符重复,你可以使用大于wxID_HIGHEST的标识符或者小于wxID_LOWEST的标识符。

六、自定义事件

    理解中。。。

命令事件  

  •   
  • wxEVT_COMMAND_BUTTON_CLICKED, 1  
  • wxEVT_COMMAND_CHECKBOX_CLICKED, 2  
  • wxEVT_COMMAND_CHOICE_SELECTED, 3  
  • wxEVT_COMMAND_LISTBOX_SELECTED, 4  
  • wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, 5  
  • wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, 6  
  •   
  • 以下这一段事件ID由于版本更新,已经移到了<wx/textctrl.h>中进行定义。  
  •   
  • #if WXWIN_COMPATIBILITY_EVENT_TYPES   
  • wxEVT_COMMAND_TEXT_UPDATED, 7  
  • wxEVT_COMMAND_TEXT_ENTER, 8  
  • wxEVT_COMMAND_TEXT_URL, 13  
  • wxEVT_COMMAND_TEXT_MAXLEN, 14  
  • #endif // WXWIN_COMPATIBILITY_EVENT_TYPES   
  •   
  • wxEVT_COMMAND_MENU_SELECTED, 9  
  • wxEVT_COMMAND_SLIDER_UPDATED, 10  
  • wxEVT_COMMAND_RADIOBOX_SELECTED, 11  
  • wxEVT_COMMAND_RADIOBUTTON_SELECTED, 12  
  •   
  • wxEVT_COMMAND_SCROLLBAR_UPDATED 现在已废弃不用,转而使用wxEVT_SCROLL。  
  •   
  • wxEVT_COMMAND_SCROLLBAR_UPDATED, 13  
  • wxEVT_COMMAND_VLBOX_SELECTED, 14  
  • wxEVT_COMMAND_COMBOBOX_SELECTED, 15  
  • wxEVT_COMMAND_TOOL_RCLICKED, 16  
  • wxEVT_COMMAND_TOOL_ENTER, 17  
  • wxEVT_COMMAND_SPINCTRL_UPDATED, 18  
  •   
  •   
  • 以下两个事件也被废弃了// Sockets and timers send events, too   
  •   
  • DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_BASE, wxEVT_SOCKET, 50)  
  • wxEVT_TIMER , 80  
  •   
  •   
  • ·鼠标事件  
  •   
  •   
  • wxEVT_LEFT_DOWN, 100  
  • wxEVT_LEFT_UP, 101  
  • wxEVT_MIDDLE_DOWN, 102  
  • wxEVT_MIDDLE_UP, 103  
  • wxEVT_RIGHT_DOWN, 104  
  • wxEVT_RIGHT_UP, 105  
  • wxEVT_MOTION, 106  
  • wxEVT_ENTER_WINDOW, 107  
  • wxEVT_LEAVE_WINDOW, 108  
  • wxEVT_LEFT_DCLICK, 109  
  • wxEVT_MIDDLE_DCLICK, 110  
  • wxEVT_RIGHT_DCLICK, 111  
  • wxEVT_SET_FOCUS, 112  
  • wxEVT_KILL_FOCUS, 113  
  • wxEVT_CHILD_FOCUS, 114  
  • wxEVT_MOUSEWHEEL, 115  
  •   
  •   
  • ·非客户区(Non-client)鼠标事件  
  •   
  •   
  • wxEVT_NC_LEFT_DOWN, 200  
  • wxEVT_NC_LEFT_UP, 201  
  • wxEVT_NC_MIDDLE_DOWN, 202  
  • wxEVT_NC_MIDDLE_UP, 203  
  • wxEVT_NC_RIGHT_DOWN, 204  
  • wxEVT_NC_RIGHT_UP, 205  
  • wxEVT_NC_MOTION, 206  
  • wxEVT_NC_ENTER_WINDOW, 207  
  • wxEVT_NC_LEAVE_WINDOW, 208  
  • wxEVT_NC_LEFT_DCLICK, 209  
  • wxEVT_NC_MIDDLE_DCLICK, 210  
  • wxEVT_NC_RIGHT_DCLICK, 211  
  •   
  •   
  • ·字符输入事件  
  •   
  • wxEVT_CHAR, 212  
  • wxEVT_CHAR_HOOK, 213  
  • wxEVT_NAVIGATION_KEY, 214  
  • wxEVT_KEY_DOWN, 215  
  • wxEVT_KEY_UP, 216  
  • #if wxUSE_HOTKEY   
  • wxEVT_HOTKEY, 217  
  • #endif   
  •   
  •   
  • ·设置焦点(Cursor)事件  
  •   
  •   
  • wxEVT_SET_CURSOR, 230  
  •   
  •   
  • · 来自wxScrollBar控件和wxSlider控件的滚动事件  
  •   
  • wxEVT_SCROLL_TOP, 300  
  • wxEVT_SCROLL_BOTTOM, 301  
  • wxEVT_SCROLL_LINEUP, 302  
  • wxEVT_SCROLL_LINEDOWN, 303  
  • wxEVT_SCROLL_PAGEUP, 304  
  • wxEVT_SCROLL_PAGEDOWN, 305  
  • wxEVT_SCROLL_THUMBTRACK, 306  
  • wxEVT_SCROLL_THUMBRELEASE, 307  
  • wxEVT_SCROLL_CHANGED, 308  
  •   
  •   
  • ·来自wxWindow的滚动事件  
  •   
  •   
  • wxEVT_SCROLLWIN_TOP, 320  
  • wxEVT_SCROLLWIN_BOTTOM, 321  
  • wxEVT_SCROLLWIN_LINEUP, 322  
  • wxEVT_SCROLLWIN_LINEDOWN, 323  
  • wxEVT_SCROLLWIN_PAGEUP, 324  
  • wxEVT_SCROLLWIN_PAGEDOWN, 325  
  • wxEVT_SCROLLWIN_THUMBTRACK, 326  
  • wxEVT_SCROLLWIN_THUMBRELEASE, 327  
  •   
  •   
  • ·系统事件  
  •   
  •   
  • wxEVT_SIZE, 400  
  • wxEVT_MOVE, 401  
  • wxEVT_CLOSE_WINDOW, 402  
  • wxEVT_END_SESSION, 403  
  • wxEVT_QUERY_END_SESSION, 404  
  • wxEVT_ACTIVATE_APP, 405   
  • 406..408 被用于苹果公司PowerPC上,这里没有列出。如果想查看这些事件,可去看<wx/power.h >。  
  • wxEVT_ACTIVATE, 409  
  • wxEVT_CREATE, 410  
  • wxEVT_DESTROY, 411  
  • wxEVT_SHOW, 412  
  • wxEVT_ICONIZE, 413  
  • wxEVT_MAXIMIZE, 414  
  • wxEVT_MOUSE_CAPTURE_CHANGED, 415  
  • wxEVT_MOUSE_CAPTURE_LOST, 416  
  • wxEVT_PAINT, 417  
  • wxEVT_ERASE_BACKGROUND, 418  
  • wxEVT_NC_PAINT, 419  
  • wxEVT_PAINT_ICON, 420  
  • wxEVT_MENU_OPEN, 421  
  • wxEVT_MENU_CLOSE, 422  
  • wxEVT_MENU_HIGHLIGHT, 423  
  • wxEVT_CONTEXT_MENU, 424  
  • wxEVT_SYS_COLOUR_CHANGED, 425  
  • wxEVT_DISPLAY_CHANGED, 426  
  • wxEVT_SETTING_CHANGED, 427  
  • wxEVT_QUERY_NEW_PALETTE, 428  
  • wxEVT_PALETTE_CHANGED, 429  
  • wxEVT_JOY_BUTTON_DOWN, 430  
  • wxEVT_JOY_BUTTON_UP, 431  
  • wxEVT_JOY_MOVE, 432  
  • wxEVT_JOY_ZMOVE, 433  
  • wxEVT_DROP_FILES, 434  
  • wxEVT_DRAW_ITEM, 435  
  • wxEVT_MEASURE_ITEM, 436  
  • wxEVT_COMPARE_ITEM, 437  
  • wxEVT_INIT_DIALOG, 438   
  • wxEVT_IDLE, 439  
  • wxEVT_UPDATE_UI, 440  
  • wxEVT_SIZING, 441  
  • wxEVT_MOVING, 442  
  • wxEVT_HIBERNATE, 443  
  •   
  •   
  • ·剪贴板事件  
  •   
  •   
  • wxEVT_COMMAND_TEXT_COPY, 444  
  • wxEVT_COMMAND_TEXT_CUT, 445  
  • wxEVT_COMMAND_TEXT_PASTE, 446  
  •   
  •   
  • ·通用命令事件(注意,一个Click事件是比button down/up优先级更高的。  
  •   
  •   
  • wxEVT_COMMAND_LEFT_CLICK, 500  
  • wxEVT_COMMAND_LEFT_DCLICK, 501  
  • wxEVT_COMMAND_RIGHT_CLICK, 502  
  • wxEVT_COMMAND_RIGHT_DCLICK, 503  
  • wxEVT_COMMAND_SET_FOCUS, 504  
  • wxEVT_COMMAND_KILL_FOCUS, 505  
  • wxEVT_COMMAND_ENTER, 506  
  •   
  •   
  • ·帮助事件  
  •   
  •   
  • wxEVT_HELP, 1050  
  • wxEVT_DETAILED_HELP, 1051  
  •   
  •   
  • 以下两个事件是等价的  
  •   
  •   
  • wxEVT_COMMAND_TOOL_CLICKED        wxEVT_COMMAND_MENU_SELECTED  
  •   
  •   
  • 事件手柄列表  
  • wxCommandEventHandler  
  •   
  • wxScrollEventHandler  
  •   
  • wxScrollWinEventHandler  
  •   
  • wxSizeEventHandler  
  •   
  • wxMoveEventHandler  
  •   
  • wxPaintEventHandler  
  •   
  • wxNcPaintEventHandler  
  •   
  • wxEraseEventHandler  
  •   
  • wxMouseEventHandler  
  •   
  • wxCharEventHandler  
  •   
  • wxKeyEventHandler wxCharEventHandler  
  •   
  • wxFocusEventHandler  
  •   
  • wxChildFocusEventHandler  
  •   
  • wxActivateEventHandler  
  •   
  • wxMenuEventHandler  
  •   
  • wxJoystickEventHandler  
  •   
  • wxDropFilesEventHandler  
  •   
  • wxInitDialogEventHandler  
  •   
  • wxSysColourChangedEventHandler  
  •   
  • wxDisplayChangedEventHandler  
  •   
  • wxUpdateUIEventHandler  
  •   
  • wxIdleEventHandler  
  •   
  • wxCloseEventHandler  
  •   
  • wxShowEventHandler  
  •   
  • wxIconizeEventHandler  
  •   
  • wxMaximizeEventHandler  
  •   
  • wxNavigationKeyEventHandler  
  •   
  • wxPaletteChangedEventHandler  
  •   
  • wxQueryNewPaletteEventHandler  
  •   
  • wxWindowCreateEventHandler  
  •   
  • wxWindowDestroyEventHandler  
  •   
  • wxSetCursorEventHandler  
  •   
  • wxNotifyEventHandler  
  •   
  • wxHelpEventHandler  
  •   
  • wxContextMenuEventHandler  
  •   
  • wxMouseCaptureChangedEventHandler  
  •   
  • wxMouseCaptureLostEventHandler  
  •   
  • wxClipboardTextEventHandler  

     

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值