带有菜单栏的顶级窗口的GetDlgCtrlID - 返回值

时间:2014-09-03 09:51:10

标签: winapi menubar hwnd

MSDN - > " GetDlgCtrlID功能" - >备注: " ...虽然如果hwndCtl是顶级窗口的句柄,GetDlgCtrlID可能返回一个值,但顶级窗口不能有标识符,并且这样的返回值永远不会有效。"

这似乎是错误的信息 - "永远不会有效"。

至少对于Win2k ... Win8这个返回值只是指向hmenu(bar)的内核指针。

我的问题是(主要是对MS内部人士):为什么MSDN在这里不准确?

(截图:http://files.rsdn.ru/42164/gwl(-1)_tagwnd.png


Upd(tagWND): enter image description here

同样演示:http://files.rsdn.ru/42164/gwl(-1)_tagwnd.zip

1 个答案:

答案 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()代替。