1. 程式人生 > >wxWidgets教程(2)-事件處理

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章中的介紹。