1. 程式人生 > >VC++ 新增自定義訊息響應函式以及傳送訊息SendMessage投遞訊息PostMessage的簡單測試

VC++ 新增自定義訊息響應函式以及傳送訊息SendMessage投遞訊息PostMessage的簡單測試

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。