C 具有资源ID的工具窗口

C 具有资源ID的工具窗口,c,winapi,C,Winapi,我该怎么做 以下似乎有效: CreateWindowEx(WS_EX_TOOLWINDOW, szToolWndClass, "Title", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 240, 320, hWnd, NULL, hInstance, NULL) 但这不会(窗口不显示): 但是,当我添加WS\u CHILD样式时,它可以工作,但这不会创建浮动窗口。顶级窗口使用ID槽作为控件ID(或者更确切地说

我该怎么做

以下似乎有效:

CreateWindowEx(WS_EX_TOOLWINDOW, szToolWndClass, "Title",
WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 240, 320,
hWnd, NULL, hInstance, NULL)
但这不会(窗口不显示):


但是,当我添加
WS\u CHILD
样式时,它可以工作,但这不会创建浮动窗口。

顶级窗口使用ID槽作为控件ID(或者更确切地说,子窗口使用控件ID);因此,子窗口不能有HMENUs,顶级HWND不能有ID

可能发生的情况是,当您省略WS_CHILD时,windows将该ID视为一个humenu,并且由于它不是有效的humenu,因此CreateWindow调用失败

一般来说,ID仅在已知容器的上下文中才有意义。因此,在对话框的上下文中,ID是有意义的,因为对话框拥有其中的控件,并且作者可以确保没有重复项,而GetDlgItem将做一些合理的事情

但是在桌面上,每个窗口都来自不同的来源,因此没有办法确保唯一的ID,因此这个概念在那里无论如何都没有意义

您最好的办法可能是保存HWND本身,并在需要时直接使用它

需要注意的一点是,当您不使用WS_CHILD时,您的新窗口实际上是桌面窗口的子窗口,但它属于您传入的HWND,而不是该窗口的子窗口。枚举该所有者窗口的子窗口将不会返回新窗口

Raymond Chen(他的博客应该被认为是所有Win32开发人员的必读资料)很好地解释了家长与所有者之间的问题

CreateWindowEx(WS_EX_TOOLWINDOW, szToolWndClass, "Title",
WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 240, 320,
hWnd, (HMENU) IDD_TOOL, hInstance, NULL)