VC++ 新增自定義訊息響應函式以及傳送訊息SendMessage投遞訊息PostMessage的簡單測試
阿新 • • 發佈:2019-01-24
1.自定義訊息ID。
MyMessageDlg.h中
#define WM_MY_MESSAGE (WM_USER + 100)
WM_USER為windows系統為非系統訊息保留的ID,這裡至少要用100,因為其它控制元件的訊息會佔用一部分。
2. 定義訊息處理函式。
訊息處理函式為訊息目標類的成員函式。同樣在標頭檔案中宣告。
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
3.在MyMessageDlg.cpp中對映訊息ID和訊息處理函式
BEGIN_MESSAGE_MAP(CMyMessageDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
ON_BN_CLICKED(IDC_MyMsgBtn, &CMyMessageDlg::OnBnClickedMymsgbtn)
END_MESSAGE_MAP()
4.在MyMessageDlg.cpp中實現訊息處理函式
LRESULT CMyMessageDlg::OnMyMessage( WPARAM wParam, LPARAM lParam )
{
MessageBox(_T("OH Yeah"));
return 0;
}
實驗函式:
void CMyMessageDlg::OnBnClickedMymsgbtn()
{
// TODO: Add your control notification handler code here
PostMessage(WM_MY_MESSAGE, 0, 0);
// SendMessage(WM_MY_MESSAGE, 0, 0);
// m_MyTxt.SetWindowText(_T("AAA"));
SetDlgItemText(IDC_MyTxt, _T("AAA"));
}
傳送訊息SendMessage函式在訊息被處理之後才返回。
投遞訊息PostMessage並不等訊息被處理就馬上返回.
訊息接收
PeekMessage與GetMessage不同的是,函式GetMessage只有佇列有訊息時才返回,PeekMessage無論佇列中是否有訊息都會返回。函式獲取到訊息返回非零,否則返回零。
所以,上面程式呼叫PostMessage時,在彈出傳送訊息WM_MY_MESSAGE導致MessageBox彈出時,程式繼續執行,Static變成了AAA。
上面程式呼叫SendMessage時,在彈出傳送訊息WM_MY_MESSAGE導致MessageBox彈出,點選MessageBox的確定按鈕後,才會繼續執行程式,這是Static變成了AAA。