MFC 自定义消息四步曲与在参数中传递变量
今天自己也重學了一下 VC小自定義消息的使用,在網上查閱了相關資料,發現http://hi.baidu.com/atlight/blog/item/11ba969442df6218d21b70cd.html這篇博文介紹的最好(在此謝過原文作者),所以就轉過了,但自己增加了一些進一步的詳細說明,我也是剛自學,不一定全正確,所以歡迎大家指正。
1. 定義全局變量或宏
#define WM_MyMessage (WM_USER + n)
n為數字到少大于100
或者用 const UINT WM_MYMESSAGE = WM_USER + n
一般可以加在stdafx.h 或resource.h 或*.app.h中。
只要是在全局變量頭文件所以都可以.
2. 在所在類的*.H文件增加消息函數聲明. 這一步跟定義普通函數一樣,首先需要(在*.h)文件中對函數進行聲明。
protected:
//{{AFX_MSG(CChildView)
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
3.在所在類的實現文件*.CPP文件中增加消息映射(告訴程序當接受到WM_MyMessage消息時交付給哪一個函數響應消息) 和實現消息處理函數
BEGIN_MESSAGE_MAP(CChildView,CWnd )
//{{AFX_MSG_MAP(CChildView)
ON_MESSAGE(WM_MyMessage, OnMyMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//實現消息處理函數. 這一步類似于普通函數的具體實現
也就是說WM_MyMessage消息對應OnMyMessage函數
LRESULT 類名::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
return 0;
}
4. 以后就可以隨時使用SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam) 或?PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)?發送自定義的消息。
說明:
1:PostMessage()與SendMessage()函數的區別是:SendMessage()的消息直接發給窗口并調用相應的消息響應函數,消息不進消息隊列,但直到消息響應函數處理完后SendMessage()才返回。而PostMessage()將消息放入消息隊列后立即返回。
2:其中WPARAM wParam,LPARAM lParam二者為指針,所以發送自定義消息時如果想傳相關參數,可以將參數的地址賦給這2個參數之一即可。如在發送自定義的消息的部分程序如下:
#define ?MAX_LEN 50
?? ?char para[MAX_LEN];
?? ?strcpy(para, "this is a string parameter");
?? ?int val = 100;?? ?
?? ?this->PostMessage(WM_MY_MESSAGE, (WPARAM)para, (LPARAM)(&val));
那么消息響應函數OnMyMessage()函數中的部分代碼為:
#define MAX_STRING_LEN 100
?? ?char pstr[MAX_STRING_LEN+1];
?? ?strncpy(pstr, (char *)wParam, MAX_STRING_LEN);
?? ?pstr[MAX_STRING_LEN]='\0';
?
?? ?int val = *((int*)lParam);
?? ?CString msg;?
?? ?msg.Format("wParam = %s, val=%d\n", pstr,val);
?? ?this->MessageBox(msg);
注意:由于說明1的區別,在傳遞參數時一定要注意如果是傳遞局部變量一定是用SendMessage()函數,如果是傳遞全局變量(而且在消息函數響應之前該全局變量不會被注銷)則兩種消息傳遞函數均可使用。 例如,在A()函數中調用PostMessage()函數發送消息時還傳遞了參數B,則由于PostMessage()函數發消息發送至消息隊列之后立即放回,從而執行PostMessage()函數之后的語句,直至A()函數結束返回,這時A()函數中的所有局部變量(如B)全部被釋放,所以當消息響應函數捕獲到消息時,得到關于參數B的指針已經是一個野指針了;但是如果是用SendMessage()發送消息并傳遞參數B,由于A()中SendMessage()函數之后的語句要等消息響應函數處理完后才執行,所以在消息響應函數中的得到的B指針仍然有效。
原文:https://blog.csdn.net/code_robot/article/details/7724667?
?
總結
以上是生活随笔為你收集整理的MFC 自定义消息四步曲与在参数中传递变量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 视频解码优化
- 下一篇: 无法转化为项目财富的技术或功能就是垃圾