wxWidgets教程(2)-事件處理
阿新 • • 發佈:2019-02-20
事件驅動宣告
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章中的介紹。