簡體   English   中英

WINAPI C++ GetDlgItem 不返回有效句柄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM