Mar*_*ich -2 c++ 64-bit winapi
我试图通过它的ID获取子窗口的句柄,但要做到这一点我必须双重转换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
Run Code Online (Sandbox Code Playgroud)
第一种方式在正常条件下工作正常,是你应该使用的:
GetDlgItem(hParent, BASE_ID + i)
Run Code Online (Sandbox Code Playgroud)
它在代码中失败的原因是因为BASE_ID + i(又名101)与您传递给的ID不同CreateWindow().
在调用时CreateWindow(),你首先要转换BASE_ID常量BY ITSELF,然后添加i到该指针,从而调用指针算法,最终产生一个不同于你所期望的ID(在32位上为104,在64位上为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.您需要修复括号,以便执行加法FIRST,然后转换结果:
CreateWindow(... (HMENU)(BASE_ID + i), ...)
Run Code Online (Sandbox Code Playgroud)
然后GetDlgItem(hParent, BASE_ID + i)将按预期工作.