ON_MESSAGE宏
来源:互联网 发布:将03表格相同数据求和 编辑:程序博客网 时间:2024/05/21 17:37
为何在自定义消息处理函数中无法利用wParam或lParam传递指针?
ON_COMMAND()宏创建的自定义消息处理机制确实无法使用wParam与lParam参数,这是由于ON_COMMAND()宏决定的
使用wParam与lParam参数,那么应当使用ON_MESSAGE()宏,由它扩展生成的消息处理函数的原型中才有这两个参数
ON_MESSAGE响应的是自定义消息,有关自定义消息的处理请看如下步骤:
1.定义消息:
在"C实验ON_MESSAGEDlg"类的头文件中加入如下代码:
#define WM_CUSTOMIZE WM_USER+100
头文件中加入Customize的声明:
afx_msg LRESULT Customize(WPARAM wParam, LPARAM lParam);
2.cpp文件中加入消息的注册
ON_MESSAGE(WM_CUSTOMIZE, Customize)
3.加入消息响应函数实现
LRESULT C实验ON_MESSAGEDlg::Customize(WPARAM wParam, LPARAM lParam)
{
CString strTittle;
strTittle.Format("自定义消息参数:x=%d,y=%d",wParam,lParam);
//SetWindowText(strTittle);
setMessage(strTittle);
return 1;
}
void C实验ON_MESSAGEDlg::setMessage(LPCTSTR newInfo)
{
CEdit *pEdit = (CEdit *)GetDlgItem(IDC_EDIT1);
pEdit->SetWindowTextA(newInfo);
}
4.显式地发送消息:
在主框架的“帮助”主菜单中加入“自定义消息”子菜单,其ID设为ID_CUSTOMIZE,通过类向导响应该命令,函数名默认。其函数体如下:
void C实验ON_MESSAGEDlg::OnCustomize()
{
// TODO: 在此添加命令处理程序代码
HWND pdlg;
POINT pos;
//将消息参数定义为屏幕坐标值
GetCursorPos(&pos);
pdlg=this->GetSafeHwnd();
/::SendMessage(pdlg,WM_CUSTOMIZE,(UINT)pos.x,pos.y);
::PostMessage(pdlg, WM_CUSTOMIZE, (UINT)pos.x, pos.y);
}
void CWebServer::PostMsgToOwner(SERVER_INFO serverInfo)
{
//向所属窗体发送通知消息
if ( ::IsWindow(m_ownerHWND) )
{
LPARAM lParam = 0;
WPARAM wParam = 0;
if (serverInfo == SERVER_STARTED)
{
//用户只能配置客户端数、不需要知道临时并发数
lParam = MAKEWPARAM(m_cocurrentConstantClientNumber, m_serverConstantConnectPort);
wParam = MAKEWPARAM(0, serverInfo);
}
else
{
wParam = MAKEWPARAM(0, serverInfo);
}
::PostMessage(m_ownerHWND, WM_USER_SERVERINFO, wParam, lParam);
}
}
对这几个消息的理解要先了解一下Window消息的背景。
在Windows3.1里,控件会将mouse, keybord等等的消息通知它的父窗口, 使用的消息就只有WM_COMMAND, 事件种类和控件ID被包含在wParam中, 控件的句柄包含在lParam中。由于wParam和 lParam已经满了,当控件要向父窗口发送其它特殊消息同时附带很多信息的时候就没有地方可以存放它们了。所以Windows3.1中定义了许多其它的 消息种类,比如WM_VSCROLL, WM_CTLCOLOR等等,每种消息wParam,lParam中附带的信息是不同的。
当到了Win32后,控件的种类越来越多,当然不可以为每一个控件都定义一套消息,这样也不利于系统的扩充。所以在Win32中定义了唯一一个强大的消息 WM_NOTIFY。当然WM_NOTIFY也遵守原来的消息规则,既只带参数wParam和lParam。唯一不同处在于,此时的lParam中传送的 是一个NMHDR指针。不同的控件可以按照规则对NMHDR进行扩充,因此WM_NOTIFY消息传送的信息量可以相当的大,这个可以看看MSDN中的相 关说明,TreeControl中就有很多这种消息。
现在就可以知道为什么有ON_MESSAGE ,ON_COMMAND, , ON_NOTIFY了。
ON_MESSAGE是处理所有的Windows的消息的,因为所有的消息都以相同的格式传送,也就是ID, WPARAM, LPARAM.
ON_COMMAND是专门处理WM_COMMAND消息的,这样我们就不用自己解开WM_COMMAND中wParam和lParam中传送的控件ID, 事件种类…,所有的都在MFC内部解决了:),当然方便了。
ON_NOTIFY更是不用说了,看看他的处理函数,是不是把NMHDR解出来了。
- ON_MESSAGE宏
- ON_MESSAGE
- ON_MESSAGE / NOTIFY
- ON_MESSAGE使用方法
- ON_MESSAGE使用方法
- ON_MESSAGE使用方法
- PostMessaget ON_MESSAGE
- MFC 消息 ON_MESSAGE
- ON_MESSAGE ,ON_COMMAND, ON_NOTIFY
- ON_COMMAND ON_MESSAGE ON_NOTIFY
- on_message与on_registered_message
- PostMessaget与ON_MESSAGE
- VC2008 on_message的问题
- ON_MESSAGE ,ON_COMMAND, , ON_NOTIFY
- ON_MESSAGE和ON_REGISTERED_MESSAGE
- VS2005 on_message的问题
- ON_MESSAGE和ON_NOTIFY 区别
- PostMessaget与ON_MESSAGE
- 如何使用 Enterprise Library 3.0 的Cryptography Application Block 处理加密
- 老紫竹的南大通用面试PPT文档下载
- Search Engine Ranking Factors V2
- 9月25号-字符串类
- web下载的ActiveX控件自动更新
- ON_MESSAGE宏
- 2410 ARM 中的clock
- Query performance troubleshooting in SQL Server 2008: query_hash and query_plan_hash
- SAP FI/CO 顾问面试问题
- 用VB生成Excel报表
- 网络营销常用缩写术语说明
- 关于ActiveX、OLE和COM 的概念
- 利用Ruby简化你的Java测试
- Labview事件结构