一、整体框架:
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"的输入:
- void MyTextCtrl::OnChar( wxKeyEvent& event )
- {
- if ( wxIsalpha( event.KeyCode() ) )
- {
- // 这些按键在可以接受的范围,所以按照正常的流程处理
- event.Skip();
- }
- else
- {
- // 这些事件不再我们可以接受的范围,所以不用调用函数Skip
- // 由于事件表已经匹配并且没有调用函数Skip,所以事件处理
- // 过程不会再继续匹配别的事件表,而是认为时间处理已经结束。
- wxBell();
- }
- }
三、事件表的挂载
正在理解。。。
四、动态事件的处理方法
也就是运行期改变事件表的映射关系。
两个有关动态事件处理的API:wxEvtHandler::Connect和wxEvtHandler::Disconnect,一般不用手动调用wxEvtHandler::Disconnect,窗口类被释放的时候自动被调用。
举例:
- class MyFrame : public wxFrame
- {
- public:
- MyFrame( const wxString& title );
- void OnQuit( wxCommandEvent& event );
- void OnAbout( wxCommandEvent& event );
- protected:
- private:
- // DECLARE_EVENT_TABLE()已经被注释掉了!
- };
五、窗口标示符
窗口标识符是在事件系统中用来唯一确定窗口的整数。事实上,在整个应用程序的范围内,窗口标识符不必一定是唯一的,而只要在某个固定的上下文(比如说,在一个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_YES | YES | |
wxID_NO | No | |
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