VC中自定義消息響應函數


這是從新對windows的自定義消息響應函數進行整理。因為我發現自定義消息響應函數還是非常有用的,尤其是在windows多編程中,用的類越多,有時候就比較有用。

Windows消息用"WM_"這個前綴,自定義的消息一般用"UM_這個前綴"。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

1.建立響應函數的原型:
在VS2005中,對於響應函數有了個比較嚴格的規定,導致以前VC6里面有很多不能直接使用,原型如下:

Cpp代碼 
  1. afx_msg LRESULT (CWnd::)MyFnx(WPARAM wParam,LPARAM lParam)  

 

對於返回類型與參數都不能少。將響應函數添加在頭文件當中:

Cpp代碼 
  1. ......     
  2. // 生成的消息映射函數     
  3. protected:     
  4. ......     
  5. afx_msg LRESULT MyFnx(WPARAM wParam, LPARAM lParam);     
  6. ......     
  7. DECLARE_MESSAGE_MAP()     
  8. ......    

 

2.定義消息:
在類的頭文件中添加一個自定義的消息:

Cpp代碼 
  1. #define UM_MYMSG WM_USER+1  

 

這樣UM_MYMSG就是對應的消息。
3.將消息映射到響應函數:
在類的源文件中添加映射關系:

Cpp代碼 
  1. .......     
  2. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)     
  3. ......     
  4. ON_MESSAGE(UM_MYMSG,MyFnx)     
  5. ......     
  6. END_MESSAGE_MAP()     
  7. ......   

 

4.響應函數的具體實現:
在源文件中添加上成員函數MyFnx的具體實現:

Cpp代碼 
  1. LRESULT CWnd::MyFnx(WPARAM wParam, LPARAM lParam)     
  2. {     
  3. ......     
  4. }   

 

5.在需要使用到該函數的地方發出消息

Cpp代碼
    1. PostMessage(MY_MSG,wParam,lParam);     
    2. //將消息加入等待隊列,不會馬上執行     
    3. //SendMessage(MY_MSG,wParam,lParam)則不同,會馬上執行 

////////////////////////////////////////////////////////////

下面我們舉一個實際的例子來說明該段過程.例如在對話框中設置一個按鈕,每隔3秒鍾會自動的彈出Message對話框:

(1)首先在頭文件或CPP文件中定義一個消息

#define CLICK_MESSAGE_BOX  WM_USER+100

 (2)然后在消息映射宏里面添加函數聲明:

 

	//{{AFX_MSG(CMy41Dlg)
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	afx_msg void OnButton1();
	afx_msg void OnTimer(UINT nIDEvent);
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
	afx_msg void OnResponse(int num);

 我們一般將自定義的消息卸載AFX_MSG的外面

(3)在CPP文件里面將消息和消息響應函數鏈接:

BEGIN_MESSAGE_MAP(CMy41Dlg, CDialog)
	//{{AFX_MSG_MAP(CMy41Dlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_WM_TIMER()
	ON_MESSAGE (CLICK_MESSAGE_BOX,OnResponse)//
	//}}AFX_MSG_MAP

	
END_MESSAGE_MAP()

 (4)定義響應函數

void CMy41Dlg::OnResponse(int num)
{
	CString str;
	str.Format("%d",num);
	MessageBox(str+"自定義的消息響應函數");
}

 (5)發送消息:

PostMessage(CLICK_MESSAGE_BOX,1);

 需要注意的是,PostMessage函數后面帶有參數,可以向響應函數里面傳參,例如上面的例子中,我們在(5)的消息函數中有一個int num,其實就是postMessage函數傳過來的參數1。 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM