首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解SendMessage wparam

理解SendMessage wparam
EN

Stack Overflow用户
提问于 2022-02-09 20:01:25
回答 1查看 174关注 0票数 1

我正在处理一个MFC项目,该项目有以下代码:

代码语言:javascript
复制
NMHDR pNMHDR;
pNMHDR.hwndFrom = GetSafeHwnd();
pNMHDR.idFrom = GetDlgCtrlID();
pNMHDR.code = EN_CHANGE;
GetParent()->SendMessage(WM_NOTIFY, (EN_CHANGE << 16) | GetDlgCtrlID(), ( LPARAM ) &pNMHDR);

请帮助我理解(EN_CHANGE << 16) | GetDlgCtrlID()所做的事情。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-09 20:09:50

根据标准编辑控件的EN_CHANGE文档:

wParam

LOWORD包含编辑控件的标识符。HIWORD指定通知代码。

因此,代码采用常量EN_CHANGE,将其位移至左侧16个位置,然后对控制ID的位进行OR。因此,EN_CHANGE以位16-31结束,而控制ID以0-15结束:

代码语言:javascript
复制
                              WPARAM
-----------------------------------------------------------------
|            EN_CHANGE          |             CtrlID            |
-----------------------------------------------------------------
 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0  

但是,代码应该使用MAKEWPARAM()宏,而不是手动移动+或‘’ing位,例如:

代码语言:javascript
复制
GetParent()->SendMessage(WM_NOTIFY, MAKEWPARAM(GetDlgCtrlID(), EN_CHANGE), (LPARAM) &pNMHDR);

尽管如此,标准的编辑控件通过EN_CHANGE通过WM_COMMAND而不是WM_NOTIFY发送。但是,标准的无窗口RICHEDIT控件通过EN_CHANGE通过WM_NOTIFY发送wParam,后者仅在wParam参数中单独携带控件ID。命令ID在NMHDR结构中由lParam参数指向(但是,RICHEDIT使用与NMHDR无关的CHANGENOTIFY结构)。

因此,这段代码使用EN_CHANGE显然是非标准使用,使用自定义的参数方案。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71055963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档