MFC 自訂訊息

來源:互聯網
上載者:User

標籤:style   class   color   使用   width   strong   

訊息機制是windows的典型運行機制,在MFC中有很多的訊息如WM_BTN**等。但是在有些情況下我們需要自訂一些訊息去做一些我們需要的功能,MFC的嚮導不能協助我們做到這一點,我們可以通過添加相應的代碼去完成這個功能。

SendMessage發送訊息後會等對方處理完這個訊息後才會繼續
PostMessage則將訊息發送出去後就會繼續

所以注意,不要通過PostMessage傳遞臨時變數指標,應該很可能訊息被處理時該變數已經銷毀,這時訪問就會出錯

用SendMessage就可以了,因為程式會停在SendMessage函數,直接訊息被處理


添加自訂訊息作業如下:
1. 建立MFC工程,如基於對話方塊的應用程式,Test。
2. 在資源中添加要處理的訊息的值,即在CTestDlg.h中添加 如下代碼。 (因為很多MFC的訊息是在WM_USER內的,所以這裡用比WM_USER大的訊息)

 #define WM_MyMessage (WM_USER+100)

3. 聲明訊息處理函數,在CTestDlg.h中添加代碼

class CTestDlg : public CDialog

protected:
  ……
   // 產生的訊息映射函數
    ……
    afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); 
    DECLARE_MESSAGE_MAP()
    ……

4. 添加訊息映射處理,在CTestDlg.cpp中人找到如下部分添加代碼

 BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
     ……
    ON_MESSAGE(WM_MyMessage, OnMyMessage)
END_MESSAGE_MAP()

 5. 實現自己的自訂訊息處理

 LRESULT CTestDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
    //MessageBox("recv msg success");
    //添加自己的訊息處理
    ……
    return 0;    
}

6. 如果要發送一個自訂的訊息,使用代碼

 SendMessage( WM_MyMessage, 0, 0);

或者

 PostMessage(WM_MyMessage, 0, 0); 

如果要定義系統唯一的訊息讓多個應用程式去處理,不同之處如下:
1. 把上面2步驟中的宏 #define WM_MyMessage (WM_USER+100) 使用   如下代替

 static UINT WM_MyMessage = RegisterWindowMessage("myMessage");

2. 上面4步驟中的代碼用如下代替

 BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
     ……
    ON_REGISTERED_MESSAGE(WM_MyMessage, OnMyMessage)
END_MESSAGE_MAP()

3.測試訊息時,如果要讓多個應用程式都接收到這個訊息,使用

 ::SendMessage(HWND_BROADCAST, WM_MyMessage, 0, 0);

   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.