我正在開發一個 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()。
uj5u.com熱心網友回復:
根據EN_CHANGE標準 EDIT 控制元件的檔案:
引數
LOWORD 包含編輯控制元件的識別符號。HIWORD 指定通知代碼。
因此,代碼采用常量EN_CHANGE,將其位向左移動 16 位,然后對控制 ID 的位進行 OR'ing。因此,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()宏而不是手動移動 OR'ing 位,例如:
GetParent()->SendMessage(WM_NOTIFY, MAKEWPARAM(GetDlgCtrlID(), EN_CHANGE), (LPARAM) &pNMHDR);
現在,話雖如此,標準的 EDIT 控制元件EN_CHANGE通過WM_COMMAND而不是發送WM_NOTIFY。但是標準的無視窗RICHEDIT 控制元件發送EN_CHANGEvia WM_NOTIFY,它在wParam引數中僅攜帶控制元件 ID。命令 ID 攜帶在引數NMHDR指向的結構體中lParam(除了 RICHEDIT 使用的CHANGENOTIFY結構體,它與 無關NMHDR)。
所以,這段代碼的使用EN_CHANGE顯然是非標準的使用,使用了自定義的引數方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/428291.html
