[英]WINAPI C++ GetDlgItem does not return a valid handle
我試圖通過其 ID 獲取子 Window 的句柄,但要做到這一點,我必須對 ID 進行雙重轉換,否則將無法正常工作。 還有其他方法嗎? 我錯過了什么?
WINAPI x64 C++
代碼:
#define BASE_ID 100
UINT8 i = 1;
CreateWindow(... (HMENU)BASE_ID + i, ...)
//later in code
HWND hWnd = GetDlgItem(hParent, BASE_ID + i); // This won't work (Returns null handle)
HWND hWnd = GetDlgItem(hParent, (int)((HMENU)BASE_ID + i)); //Works but I get compiler warning
第一種方法在正常條件下工作得很好,並且是您應該使用的方法:
GetDlgItem(hParent, BASE_ID + i)
它在您的代碼中失敗的原因是BASE_ID + i
(又名 101)與您傳遞給CreateWindow()
ID 不同。
調用CreateWindow()
,您首先通過BASE_ID
強制轉換BASE_ID
常量,然后將i
添加到該指針,從而調用指針算法,最終產生與您期望的不同的 ID(32 位為BASE_ID
位為 108)( 101)。
因此, GetDlgItem(hParent, BASE_ID + i)
無法找到匹配的 ID,而GetDlgItem(hParent, (int)((HMENU)BASE_ID + i))
成功,因為它使用了您在調用CreateWindow()
,從而找到匹配的 ID。
(HMENU)BASE_ID + i
轉換的優先級高於加法,因此(HMENU)BASE_ID + i
被編譯器解釋為((HMENU)BASE_ID) + i
。 您需要修復括號,以便首先執行加法,然后轉換結果:
CreateWindow(... (HMENU)(BASE_ID + i), ...)
然后GetDlgItem(hParent, BASE_ID + i)
將按預期工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.