<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 3.7 自定義事件 如果你要使用自定義的事件,你需要下面的幾個步驟: 1. 從一個合適的事件類派生一個你自己的事件類,聲明動態類型信息并且實現一個Clone函數,按照你自己的意愿增加新的數據成員和函數成員.如果你希望這個事件在窗口繼承關系之間傳遞,你應該使用的wxCommandEvent派生類,如果你希望這個事件的處理函數可以調用Veto(譯者注:某些事件可以調用這個函數來阻止后續可能對這個事件進行的任何操作(如果有的話),最典型的例子是關閉窗口事件wxEVT_CLOSE),你應該使用 wxNotifyEvent的派生類. 1. 為這個事件類的處理函數定義類型. 1. 定義一個你的事件類支持的事件類型的表。這個表應該定義在你的頭文件中。用BEGIN_DECLARE_EVENT_TYPES()宏和END_DECLARE_EVENT_TYPES()宏包含起來。其中的每一個支持的事件的聲明應該使用DECLARE_EVENT_TABLE (name, integer)格式的宏.然后在你的.cpp文件中使用DEFINE_EVENT_TYPE(name)來實現這個事件類. 1. 為每個你的事件類支持的事件定義一個事件映射宏。 我們還是通過例子來讓上面這段繞口的話顯的更生動一些。假如我們要實現一個新的控件wxFontSelectorCtrl,這個控件將可以顯示字體的預覽。用戶通過點擊字體的預覽來彈出一個對話框讓用戶可以更改字體。應用程序也許想攔截這個字體改變事件,因此我們在我們的底層鼠標消息處理過程中將會給應用程序發送一個自定義的字體改變事件。 因此我們需要定義一個新的事件wxFontSelectorCtrlEvent.應用程序可以通過事件映射宏 EVT_FONT_SELECTION_CHANGED(id, func)來增加對這個事件的處理。我們還需要給這個事件定義一個事件類型: wxEVT_COMMAND_FONT_SELECTION_CHANGED. 這樣,我們的頭文件看上去就象下面的樣子: ``` /*! * Font selector event class */ class wxFontSelectorCtrlEvent : public wxNotifyEvent { public: wxFontSelectorCtrlEvent(wxEventType commandType = wxEVT_NULL, int id = 0): wxNotifyEvent(commandType, id) {} wxFontSelectorCtrlEvent(const wxFontSelectorCtrlEvent& event): wxNotifyEvent(event) {} virtual wxEvent *Clone() const { return new wxFontSelectorCtrlEvent(*this); } DECLARE_DYNAMIC_CLASS(wxFontSelectorCtrlEvent); }; typedef void (wxEvtHandler::*wxFontSelectorCtrlEventFunction) (wxFontSelectorCtrlEvent&); /*! * Font selector control events and macros for handling them */ BEGIN_DECLARE_EVENT_TYPES() DECLARE_EVENT_TYPE(wxEVT_COMMAND_FONT_SELECTION_CHANGED, 801) END_DECLARE_EVENT_TYPES() #define EVT_FONT_SELECTION_CHANGED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_FONT_SELECTION_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxFontSelectorCtrlEventFunction) & fn, (wxObject *) NULL ), ``` 而在我們的.cpp文件中,看上去則象下面的樣子: ``` DEFINE_EVENT_TYPE(wxEVT_COMMAND_FONT_SELECTION_CHANGED) IMPLEMENT_DYNAMIC_CLASS(wxFontSelectorCtrlEvent, wxNotifyEvent) ``` 然后,在我們的新控件的鼠標處理函數中,可以通過下面的方法在檢測到用戶選擇了一個新的字體的時候,發送一個自定義的事件: ``` wxFontSelectorCtrlEvent event( wxEVT_COMMAND_FONT_SELECTION_CHANGED, GetId()); event.SetEventObject(this); GetEventHandler()->ProcessEvent(event); ``` 現在,在使用我們的新控件的應用程序的代碼中就可以通過下面代碼來處理我們定義的這個新事件了: ``` BEGIN_EVENT_TABLE(MyDialog, wxDialog) EVT_FONT_SELECTION_CHANGED(ID_FONTSEL, MyDialog::OnChangeFont) END_EVENT_TABLE() void MyDialog::OnChangeFont(wxFontSelectorCtrlEvent& event) { // 字體已經更改了,可以作一些必要的處理。 ... } ``` 上面用到的事件標識符801在最新的版本中已經沒有用處了,之所以這樣寫只是為了兼容wxWidgets2.4的版本。 讓我們再來看一眼事件映射宏的定義: ``` #define EVT_FONT_SELECTION_CHANGED(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_FONT_SELECTION_CHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxFontSelectorCtrlEventFunction) & fn, (wxObject *) NULL ), ``` 這個宏的作用其實是把一個五元組放入到一個數組中,所以這段代碼的語法看上去是奇怪了一些,這個五元組的意義分別解釋如下: + 事件類型:一個事件類可以處理多種事件類型,但是在我們的例子中,只處理了一個事件類型,所以就只有一個事件映射宏的記錄。這個事件類型必須要和事件處理函數所有處理的事件的類型一致。 + 傳遞給事件映射宏的標識符:只有當事件的標識符和事件表中的標識符一致的時候,相應的事件處理函數才會被調用。 + 第二標識符。在這里-1表示沒有第二標識符。 + 事件處理函數。如果沒有類型的強制轉換,一些編譯器會報錯,這也就是我們要定義事件處理函數類型的原因。 + 用戶數據,通常都是NULL; 隨書附帶光盤中的examples/chap03目錄中有一個完整的自定義事件的例子,其中包括了一個字體選擇控件和一個簡單驗證類,你可以在你的應用程序中使用她們。你還可以閱讀你的wxWidgets發行版目錄中的include/wx/event.h來獲得更多的靈感。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看