带有资源ID的工具窗口

时间:2011-07-22 18:12:54

标签: c winapi

我该怎么做?

以下似乎有效:

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

但是没有(窗口没有显示):

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

但是,当我添加WS_CHILD样式时它会起作用,但这不会创建浮动窗口。

1 个答案:

答案 0 :(得分:0)

顶级窗口使用ID槽作为HMENU(或者更确切地说,子窗口使用HMENU槽作为控制ID);所以子窗口不能有HMENU,顶级HWND也不能有ID。

可能发生的情况是,当您省略WS_CHILD时,Windows会将ID视为HMENU,并且由于它不是有效的HMENU,因此无法通过CreateWindow调用。

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

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

您最好的选择可能是拯救HWND本身,并在需要时直接使用它。

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

Raymond Chen(其博客应被视为所有Win32开发人员必读的内容)对父母与所有者问题here有一个很好的解释。