wxWidgets动态事件表爱好者备查手册

做者:皿(http://blog.csdn.net/utensil/ )python

使用动态事件映射方法的缘由,多是你想在程序运行的不一样时刻使用不一样的映射关系,或者由于你使用的那种语言(例如python)不支持静态映射,或者仅 仅是由于你更喜欢动态映射。由于动态映射的方法可使你更精确的控制事件表的细节,你甚至能够单独的将事件表中的某一个条目在运行期打开或者关闭,而前面 说的PushEventHandler和PopEventHandler的方法只能针对整个事件表进行处理。除此之外,动态事件处理还容许你在不一样的类之 间共享事件函数。app

——《WxWidgets跨平台GUI开发》ide

导言

在wxWidgets中,相对于静态事件表那种僵死而且不知其因此然的方法,我更喜欢动态事件表,亲自Connect,还能够随时Disconnect。函数

可是,在写动态事件表时,会遇到一个问题,wxWidgets的官方文档中的事件处理部份,对于静态事件表所需的各类事件类型的宏叙述详尽,却对动态事件 表所需的事件类型语焉不详,这给咱们的使用带来了麻烦。须要的知识一方面零星分布于wx文档中,另外一方面被冗长的代码掩映 在<wx/event.h>中。此文的目的,就是为动态事件表的爱好者提供一个方便查询的手册,但愿能给你们帮助。ui

大部份写GUI经常使用的wx类(包括窗口、对话框、控件)都继承于三个类:wxWindowwx、wxEvtHandler、wxObject。所以,大多 数状况下,这三个类的成员函数是咱们能够顺手牵过来用的。动态事件表的使用中,最为重要的函数Connect和Disconnect就是 wxEvtHandler的成员函数,咱们能够牵过来给咱们手头这个要处理事件的wx类用。this

 

先看看官方文档里对Connect函数的介绍(我对其进行了翻译、精简,有时,为了解释的明晰,做一些补充说明):spa

 

#TRANSLATE BEGIN.net

wxEvtHandler::Connect

Connect函数被重载了三次,各有各的用途。翻译

第一个版本:范围捕杀 ( [id, lastid] 且 eventType)指针

void Connect (int id , int lastId , wxEventType eventType , wxObjectEventFunction function , wxObject*userData = NULL , wxEvtHandler* eventSink = NULL )

第二个版本:精确狙击(id 且 eventType)

void Connect (int id , wxEventType eventType , wxObjectEventFunction function , wxObject* userData = NULL , wxEvtHandler* eventSink = NULL )

第三个版本:分门别类 (仅 eventType)

void Connect (wxEventType eventType , wxObjectEventFunction function , wxObject* userData = NULL ,wxEvtHandler* eventSink = NULL )

该函数动态地将所给事件处理函数 与 EventHandler、ID 甚至事件类型联系起来。这是静态事件表的一种替代选择。

按:EventHandler直译为事件处理器,或可译为“事件手柄”(生动地模仿句柄)?后文使用“事件手柄”。

参数意义:

id

  •  

    你要和事件处理函数联系起来的ID(能够是窗口ID、菜单ID、控件ID)。对于没有这个参数的重载版本,id 被默认设为 wxID_ANY。

    当和lastid 连用时,表达的是一个ID范围,即大小介于id和last id之间的全部ID,都会被Connect函数与事件处理函数联系起来。

    按:实在不必连“ID”都译成“标识符”……其实看技术文档时,我最头痛的是一堆汉字堆在那里,包括看数学书时……

lastId

  •  

    参见id 中的介绍。

eventType

  •  

    你要和事件处理函数联系起来的Event Type。 按:Event Type直译为“事件类型”并不恰当,由于事件类型是指形如wxMouseEvent这样的东西,而这里所指,是形如wxEVT_MOTION这样的东西。 准确地说,应该称之为“事件标识符”或“事件ID”。下文使用“事件ID”。 一个事件类型里,会有若干事件ID,比wxMouseEvent 里除了wxEVT_MOTION,还有wxEVT_LEFT_DOWN等等等事件ID。 所以能够把事件ID做为对事件类型的一个细分。

function

  •  

    事件处理函数。注意这个函数应当被显式转换为正确的类型。 对于类型为wxFooEvent的事件,转换使用宏wxFooEventHandler。

userData

  •  

    你要和事件表项联系起来的数据。(暂时我还不知道这个有什么用)

eventSink

  •  

    告诉Connect函数,你要调用的事件处理函数是谁的成员函数。 若是该参数为 NULL, 那么Connect函数将使用this 指针 。 按:正是这个参数容许了咱们在不一样类中共享事件处理函数。

例子:

frame->Connect( wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MyFrame::OnQuit) );
对例子的解释:
wxID_EXIT是以前赋给了某一个菜单项的ID。
当该菜单被选择时,会产生一个ID为wxEVT_COMMAND_MENU_SELECTED的事件。
所以MyFrame::OnQuit在被显式转换为wxCommandEventHandler型的“事件手柄”以后,被Connect拉过来处理该事件。
#TRANSLATE END

就再也不翻译Disconnect函数的文档了,由于除了函数名不一样,它的全部参数和Connect是如出一辙的。它的用途就是断开Connect所创建起来的联系。

实践中写事件处理的时候,一般使用的是Connect的后两种重载版本。参数userData和eventSink的使用是比较少的,并且也有默认值,通常不去理它就能够了。

参数id是你赋给产生了这个事件的窗口、菜单或控件的,你本身内心是清楚的。问题顶可能是,你须要使用系统默认的那些ID(好比上面例子里的 wxID_EXIT),而你不知道哪一个还哪一个。那些ID的列表在官方文档里是有的,不过为了本文做为手册的完整性,将在本文最后给出。

有时是不须要id的,好比鼠标移动的事件:

frame->Connect(wxEVT_MOTION,wxMouseEventHandler(MyFrame::OnMouseMove));

直接把事件ID与事件手柄联系起来。 参数function 的问题大一些,就是这个显式强制类型转换的这个Handler,具体叫wx什么EventHandler呢?这个问题也好解决,由于官方文档里的 Classes By Category里的Event小节已经给出了形如wxFooEvent这样的事件类型的列表,只须要在相应的事件类型后面加上Handler就能够了。 一样为了本文做为手册的完整性,将在本文后面给出所有Handler的列表。

最大的问题出在参数eventType上。形如wxEVT_MOTION、wxEVT_COMMAND_MENU_SELECTED这样的事件ID的名 字,咱们从何得知?这些奇形怪状的名字,纵然咱们英语很强,也未必能造出和wxWidgets定义的如出一辙的名字啊。好比写惯MFC的同好们很容易将鼠 标移动事件ID写为wxMOUSEMOVE或wxMOUSE_MOVE,可这倒是错的。最糟糕的是,文档中没有提供这些名字的列表!

有些同好可能发现了,对大部份事件类型的静态事件表的宏的说明中,包含了这方面的重要信息,例如wxPaintEvent里:

EVT_PAINT(func) Process a wxEVT_PAINT event.

左边是静态事件表须要的,右边是动态事件表须要的。左手静态,右手动态,好潇洒啊!然而,假若你要处理窗口关闭事件(假设该事件的产生不是经过菜单选择,而是点窗口右上角的红叉叉),你跑到wxCloseEvent那里一看:

EVT_CLOSE(func) Process a close event, supplying the member function. This event applies to wxFrame and wxDialog classes.

你晕了……为何文档编写者连这都不愿告诉你?!因而你尝试着用wxEVT_CLOSE,编译器告诉你不对。已经习惯了没事翻翻头文件的你就跑 到<wx/event.h>里去找了,一搜索就出来了。 原来是wxEVT_CLOSE_WINDOW,这可真是情理之中意料以外啊,反正我当时是接近吐血了……

所幸这个状况并无出如今大多数基本的事件里,但实际中总会须要处理那些不那么基本的事件的,每次都在这个细节上卡这么久的壳太不划算了。因此我把事件ID列表从<wx/event.h>中抽出来并加以翻译,你们放在手边备查吧。这是本文的主要写做目的。

说了一堆稀哩哗啦的废话,下面进入手册正文。

事件ID列表

 

·命令事件

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 被用于关于电源的事件上,这里没有列出。若是想查看这些事件,可去看<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

 

wxWidgets定义的标识符列表(摘自《WxWidgets跨平台GUI开发》)

窗口标识符是在事件系统中用来惟一肯定窗口的整数。事实上,在整个应用程序的范围内,窗口标识符没必要必定是惟一的,而只要在某个固定的上下文(好比说,在 一个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的标识符。

相关文章
相关标签/搜索