1. 程式人生 > >MFC中傳送自定義訊息機制,PostMessage和SendMessage方式

MFC中傳送自定義訊息機制,PostMessage和SendMessage方式

       MFC中有種訊息佇列,使用PostMessage()或者SendMessage()給窗體傳送自定義訊息,當窗體接收到訊息時呼叫該訊息對應繫結的方法。

PostMessage:把訊息投放到執行緒的訊息佇列,不等訊息被處理就立即返回;
SendMessage:訊息被處理完後才返回,所以後面的程式碼不能立即執行;

具體實現方法:

1、首先在CMyMessageDlg.h定義訊息:例如

define WM_MYMESSAGE (WM_USER+100)

WM_USER為windows系統為非系統訊息保留的ID,這裡至少要用100(也可以以0x100這種形式),因為其它控制元件的訊息會佔用一部分。


 

2、在.H檔案中,加入訊息響應函式,如:

afx_msg LRESULT OnMyMessage(WPARAM w,LPARAM l);

該函式有規定的格式:

afx_msg LRESULT Function_Name(WPARAM w,LPARAM l);


3 在CMyMessageDlg.cpp中加入訊息響應巨集

在響應該訊息的類中,在訊息響應塊中,

BEGIN_MESSAGE_MAP(CMyMessageDlg, CDialog)

   ON_WM_SYSCOMMAND()

   ON_WM_PAINT()

   ON_WM_QUERYDRAGICON()

   ON_MESSAGE(WM_MYMESSAGE,&CMyMessageDlg::OnMyMessage)

   //}}AFX_MSG_MAP

END_MESSAGE_MAP()


4 在.CPP檔案中,編輯訊息響應函式,如下:

LRESULT CMyMessageDlg::OnMyMessage(WPARAM wParam, LPARAM lParam) {

   MessageBox(_T("My Message!"));

   return LRESULT (0);

}


5、在程式中使用PostMessage(WM_MYMESSAGE , NULL, NULL)

在子執行緒中也可以使用PostMessage(),給主執行緒傳送訊息觸發方法。


幾種傳送訊息的寫法:
   ::PostMessage(GetSafeHwnd(),WM_MYMESSAGE , 0, 0); //GetSafeHwnd()表示得到當前視窗控制代碼,所以這條語句是傳送給當前視窗
   GetParent()->PostMessage(WM_MYMESSAGE , 0, 0);//傳送給父視窗 
   this->PostMessage(WM_MYMESSAGE , 0, 0);//傳送給當前視窗

   HWND h= ::FindWindow(NULL, _T("視窗名字"));
   ::PostMessage(h,WM_MYMESSAGE , 0, 0);//傳送給任意視窗

SendMessage也是同樣的用法。