wxWidgets教程(2)-事件处理

事件驱动声明

wxWidgets是事件驱动的,使用下面的宏

DECLARE_EVENT_TABLE()//声明一个事件宏
enum IdList
{
    Id_Btn_1 = wxID_HIGHEST+1//定义一个按钮的ID
};
BEGIN_EVENT_TABLE(MyWxFrame, wxFrame)
	EVT_BUTTON(Id_Btn_1,MyWxFrame::OnTips)//将按钮与函数绑定
END_EVENT_TABLE()

只有wxCommandEvent事件才可以层层递归到父窗口的事件表中

以下的事件不会传递到其父窗口,因为他们传给父窗口没有什么意义

wxActivate, 
wxCloseEvent, 
wxEraseEvent, 
wxFocusEvent,
wxKeyEvent, 
wxIdleEvent, 
wxInitDialogEvent, 
wxJoystickEvent, 
wxMenuEvent,
wxMouseEvent, 
wxMoveEvent, 
wxPaintEvent, 
wxQueryLayoutInfoEvent, 
wxSizeEvent,
wxScrollWinEvent, 
wxSysColourChangedEvent

举例拦截一个键盘事件,只有拼音字母才可以响应,代码如下

EVT_KEY_DOWN(MyWxFrame::OnChar)
void MyWxFrame::OnChar(wxKeyEvent& event)
{
	if (wxIsalpha(event.GetKeyCode()))
	{
		wxString msg = wxT("Hello World");
		wxMessageBox(msg, wxT("提示"), MB_OK);
	}
}

event.Skip();用来过滤。表示事件将会向父窗口传递,这里不要调用父窗口的函数,而是使用event的函数。

动态绑定事件

Connect(m_button1->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, 
(wxObjectEventFunction)&MyWxFrame::OnTips);
Connect(m_button1->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, 
wxCommandEventHandler(MyWxFrame::OnTips));

以上2种方法绑定事件,应该比较好理解

如果事件处理的参数是wxXYZEvent,那么相应的它的事件处理函数的类型就是wxXYZEventHandler。

动态终止事件绑定

Disconnect(m_button1->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, 
wxCommandEventHandler(MyWxFrame::OnTips));

窗口标识符定义

如果想使用系统自己定义的话,使用wxID_ANY,如下:

m_button1 = new wxButton(this, wxID_ANY, wxT("提示"), wxDefaultPosition, wxDefaultSize, 0);

如果想自己定义,则使用(wxID_LOWEST,wxID_HIGHEST)左侧与右侧区域,如下

enum IdList
{
	Id_Btn_1 = wxID_HIGHEST+1
};
(wxID_LOWEST,wxID_HIGHEST)中间的数值是系统自己定义的标识符,一般不要更改。如:

wxID_OK 确定
wxID_CANCEL 取消
wxID_STATIC 静态文本标识符
wxID_EXIT 退出菜单标识符
wxID_OPEN 打开标识符

系统定义的事件

在event.h中,wxWidgets定义了一些常用的事件标识,右键转到定义即可看到

EVT_SIZE,EVT_CLOSE,EVT_PAINT,EVT_NC_PAINT,EVT_CHAR

EVT_KEY_DOWN,EVT_KEY_UP,EVT_HOTKEY,EVT_KILL_FOCUS

EVT_LEFT_DOWN,EVT_LEFT_DCLICK……

比较多,就不一 一介绍了。

自定义事件

我们也可以自己定义一些事件,可以看一看教程第3章中的介绍。















你可能感兴趣的:(wxWidgets教程(2)-事件处理)