WINDOW消息機制(一):向窗體發送消息

WINDOWS應用程序(GUI程序)是基於消息的事件驅動方式運行,外部的事件:鼠標、鍵盤的點擊,都會轉化成消息,並被投擲於應用程序的消息隊列中,應用程序的消息引擎從隊列中獲取消息,並進行處理(WindProc)。函數

此處演示的一個消息裏就是,如何向窗體發送消息,並進行處理設計

分別利用API sendMessage, PostMessage,向窗口發送消息,並進行處理code

(一)自定義消息類型隊列

//自定義消息
#define  WM_USER_SEND_MSG	(WM_USER + 101)
#define  WM_USER_POST_MSG	(WM_USER + 102)

(二)設計消息的響應函數:
在類MsgTestDlg中添加響應函數的聲明和定義:
聲明:事件

afx_msg void OnBnClickedButtonSendMsg();
afx_msg void OnBnClickedButtonPostMsg();

定義:
LRESULT CMsgTestDlg::HandleSendMsg(WPARAM wParam, LPARAM lParam)
 {
	 AfxMessageBox("CMsgTestDlg::SendMsg");
         return 0;
 }

 LRESULT CMsgTestDlg::HandlePostMsg(WPARAM wParam, LPARAM lParam)
 {
	 AfxMessageBox("CMsgTestDlg::PostMsg");	 
	  return 0;
 }

 

(三)在消息映射表的宏定義出,添加自定義消息和處理函數的映射關係:get

BEGIN_MESSAGE_MAP(CMsgTestDlg, CDialog)
	......
	ON_MESSAGE(WM_USER_SEND_MSG, &CMsgTestDlg::HandleSendMsg)
	ON_MESSAGE(WM_USER_POST_MSG, &CMsgTestDlg::HandlePostMsg)
	......
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


(4)運行結果:
4.1. 點擊BUTTON:SENDMSG 作以下工做:
::SendMessage(m_hWnd, WM_USER_SEND_MSG, NULL, NULL);

向窗體發送消息WM_USER_SEND_MSG,消息引擎在獲取到該消息後,從消息映射表中提取處理該消息的方法:CMsgTestDlg::HandleSendMsg,sendMessage函數在HandleSendMsg方法運行結束後才返回,不然阻塞
博客

 

4.2. 點擊BUTTON:POSTMSG,作以下工做:
消息隊列

::PostMessage(m_hWnd, WM_USER_POST_MSG,  NULL, NULL);

向消息隊列中發送消息後,當即返回,至於消息處理,不關個人事哈~界面與上圖相似,就不上傳


注:該片博客寫的很簡單,可是有不少概念沒有展開:
1. 從點擊控件,產生消息開始,到消息被處理的一個完整流程
2. 隊列消息、非隊列消息
3. MFC的消息映射和命令傳遞(CCmdTarget),整個MFC的消息網構建於傳遞
4. MFC程序的總體脈絡

總之,詳情,參考《深刻淺出MFC》
相關文章
相關標籤/搜索