以编程方式将一个窗口始终置于另一个窗口之上

Keep one window always on top of another programatically

本文关键字:窗口 另一个 一个 方式 编程      更新时间:2023-10-16

我有一个(非商业)程序,它创建了两个窗口,一个显示滚动文本,您可以在其中输入以发出命令。另一个显示各种复杂图形以响应这些命令。图形信息是如此详细和复杂,它需要占用整个大显示器。我通常把文本窗口放在第二个显示器上,所以从来没有考虑过哪个窗口是"在上面"。

我现在想让一个(非技术的)朋友使用我的程序,他想让它在一个显示器上工作。我想做的是将(小)文本窗口放置在图形窗口的一个角落的顶部,但以某种方式安排文本窗口保持在图形窗口的顶部,即使图形窗口被选中。这可以做到吗?如果可以,如何做到?

让您希望放在顶部的窗口由另一个窗口拥有。自己拥有的窗户总是比它的主人高。文档说:

拥有Windows

一个重叠的或弹出的窗口可以被另一个重叠的或弹出窗口。被拥有会对窗口施加一些约束。

  • 一个被拥有的窗口总是在它的所有者的z轴上。
  • 当窗体的所有者被销毁时,系统会自动销毁该窗体。
  • 当其所有者最小化时,已拥有的窗口将被隐藏。

只有重叠或弹出的窗口可以是所有者窗口;一个孩子窗口不能是所有者窗口。应用程序创建一个拥有的通过将所有者的窗口句柄指定为hwndParent参数创建窗口时使用WS_OVERLAPPED或WS_POPUP样式。hwndParent参数必须确定重叠窗口或弹出窗口。如果hwndParent标识一个子窗口时,系统将所有权分配给顶级父窗口子窗口的窗口。创建一个自有窗口后应用程序无法将窗口的所有权转移到另一个窗口。

对话框和消息框是默认拥有的窗口。一个应用程序在调用函数时指定所有者窗口创建对话框或消息框。

应用程序可以使用带有GW_OWNER标志的getwwindow函数获取窗口所有者的句柄。

因此,使用CreateWindowExhWndParent参数指定窗口的所有者。文档有点难以理解。它说:

hWndParent [in, optional]

正在创建的窗口的父窗口或所有者窗口的句柄。要创建子窗口或自有窗口,请提供有效的窗口句柄。

可选参数。

这意味着形参被重载了。对于弹出窗口,此参数指定所有者。当您希望创建一个无主窗口时,通过NULL。这就是该参数对于弹出窗口是可选的意思。对于子窗口,在此参数中传递窗口的父窗口。

现在,在您的示例中,您想要创建一个自有的弹出窗口,因此在此参数中传递所有者。

您可以将图形窗口设置为所有者。这是与子窗口的父参数相同的CreateWindow参数。我可以建议你也提供一些方法,使文本窗口或多或少透明。