在以消息机制为核心的Windows系统下,通过消息传递可以帮助我们进行更为便捷的开发。但系统自带的ON_MESSAGE等消息的参数wParam、lParam等总是不能满足我们的特殊需要。因此有必要创建自己的消息映射宏。
一、创建消息映射宏
修改下面的宏,可以定义完全属于用户自己的消息映射宏:
#define ON_MY_MESSAGE(message,msgFunction)\
{\
message,0,0,0,AfxSig_iis,\
(AFX_PMSG)(AFX_PMSGW)\
(int (AFX_MSG_CALL CWnd::*)(int,LPTSTR))\
&memberFxn\
},
修改要点:
1、“\”符号为VC换行连接符。宏定义是需要在同一行显示的;
2、“message”为自己所定义的消息ID;
3、“msgFunction”为本消息映射宏对应的响应函数;
4、ON_MY_MESSAGE(message,msgFunction)中的参数可以自由按需增减;ON_MY_MESSAGE为宏名称,可像函数名一样按需修改;
5、“AfxSig_iis”为自定义宏映射的关键部分之一,它标识了响应函数的参数格式,如“AfxSig_iis”代表了响应函数的参数格式为:int (int,LPTSTR)、“AfxSig_lwl”代表了响应函数的参数格式为:LRESULT (WPARAM,LPARAM)。具体的参数格式定义可查找“AFXMSG_.H”文件;
6、隐秘的重点:笔者在参考书上查阅到的最后“}”后的符号为“;”,编译时总是报错,经查阅Afxmsg_.h中的ON_MESSAGE消息宏格式,发现应为“,”。不知是VC编译器版本不同,还是参考书有误,特此提出。
二、使用自定义宏
使用自定义宏就比较简单了
当然是先定义自己的消息ID
#define WM_MYMESSAGE WM_USER
然后消息消息响应函数
afx_msg int OnMyMsg(int nLen,LPTSTR sData);
int CMyClass::OnMyMsg(int nLen,LPTSTR sData)
{
m_sInputString=m_sInputString+sData;
return MY_OK;
}
最后在消息映射中添加我们的映射
BEGIN_MESSAGE_MAP(CSerialPort, CWnd)
//{{AFX_MSG_MAP(CSerialPort)
// NOTE - the ClassWizard will add and remove mapping macros here.
ON_MY_MESSAGE(MYMESSAGE, OnMyMsg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
本文由开源盛世-源代码下载网站长原创,转载请注明来源http://www.vscodes.com
打完收工!^_^