您的位置:首页 > 其它

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

2011-08-27 00:52 411 查看
一、整体框架:

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"的输入:

view plaincopy
to clipboardprint?

void MyTextCtrl::OnChar( wxKeyEvent& event )
{
if ( wxIsalpha( event.KeyCode() ) )
{
// 这些按键在可以接受的范围,所以按照正常的流程处理

event.Skip();
}
else
{
// 这些事件不再我们可以接受的范围,所以不用调用函数Skip

// 由于事件表已经匹配并且没有调用函数Skip,所以事件处理

// 过程不会再继续匹配别的事件表,而是认为时间处理已经结束。

wxBell();
}
}

view plaincopy
to clipboardprint?

class  MyFrame : public wxFrame
{
public:
MyFrame( const wxString& title );
void OnQuit( wxCommandEvent& event );
void OnAbout( wxCommandEvent& event );
protected:
private:
// DECLARE_EVENT_TABLE()已经被注释掉了!

};

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_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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: