MSDN - > " GetDlgCtrlID功能" - >备注: " ...虽然如果hwndCtl是顶级窗口的句柄,GetDlgCtrlID可能返回一个值,但顶级窗口不能有标识符,并且这样的返回值永远不会有效。"
这似乎是错误的信息 - "永远不会有效"。
至少对于Win2k ... Win8这个返回值只是指向hmenu(bar)的内核指针。
我的问题是(主要是对MS内部人士):为什么MSDN在这里不准确?
(截图:http://files.rsdn.ru/42164/gwl(-1)_tagwnd.png)
Upd(tagWND):
答案 0 :(得分:2)
这不是不准确的。使用CreateWindowEx()创建顶级窗口。看起来像这样:
HWND WINAPI CreateWindowEx(
_In_ DWORD dwExStyle,
_In_opt_ LPCTSTR lpClassName,
_In_opt_ LPCTSTR lpWindowName,
_In_ DWORD dwStyle,
_In_ int x,
_In_ int y,
_In_ int nWidth,
_In_ int nHeight,
_In_opt_ HWND hWndParent,
_In_opt_ HMENU hMenu,
_In_opt_ HINSTANCE hInstance,
_In_opt_ LPVOID lpParam
);
请注意您不在任何地方指定ID。但是细则是hMenu
参数的描述:
菜单句柄,或指定子窗口标识符,具体取决于窗口样式。对于重叠或弹出窗口,hMenu标识要与窗口一起使用的菜单;如果要使用类菜单,它可以为NULL。对于子窗口,hMenu指定子窗口标识符,即对话框控件用于向其父级通知事件的整数值。应用程序确定子窗口标识符;对于具有相同父窗口的所有子窗口,它必须是唯一的。
所以你可以有一个菜单或一个孩子ID。在winapi中,重载,很常见,子控件不能有菜单和顶层窗口不能有子ID。如果你继续前进并忽略这一点并且无论如何都要在顶层窗口上调用GetDlgCtrlID(),那么你将获取你在create调用中指定的hMenu参数的值。好吧,今天,总是按照api或者你可能会在某一天得到一个粗鲁的惊喜,你当然会使用GetMenu()代替。