我正在处理一个MFC项目,该项目有以下代码:
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()所做的事情。
发布于 2022-02-09 20:09:50
根据标准编辑控件的EN_CHANGE文档:
wParam
LOWORD包含编辑控件的标识符。HIWORD指定通知代码。
因此,代码采用常量EN_CHANGE,将其位移至左侧16个位置,然后对控制ID的位进行OR。因此,EN_CHANGE以位16-31结束,而控制ID以0-15结束:
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位,例如:
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显然是非标准使用,使用自定义的参数方案。
https://stackoverflow.com/questions/71055963
复制相似问题