保持一个窗口始终以编程方式位于另一个窗口之上

时间:2015-09-07 15:04:53

标签: c++ winapi

我有一个(非商业)程序,它创建了两个窗口,一个显示滚动文本,您键入它们以发出命令。另一个显示响应这些命令的各种复杂图形。图形信息非常复杂,需要占用整个大型监视器。我通常将文本窗口放在第二个显示器上,这样就不会想到哪个窗口在“顶部”。

我现在希望让(非技术性)朋友能够使用我的程序,并希望它能够在单个监视器上工作。我想做的是将(小)文本窗口放置在一个角落的图形窗口顶部,但不知何故安排文本窗口保持在图形窗口的顶部,即使选择了图形窗口。可以这样做,如果是这样的话?

2 个答案:

答案 0 :(得分:3)

使您希望位于顶部的窗口归其他窗口所有。拥有的窗口始终高于其所有者。 documentation说:

  

拥有Windows

     

重叠或弹出窗口可以由另一个重叠或拥有   弹出窗口。拥有在窗口上设置了几个约束。

     
      
  • 拥有的窗口始终位于z订单的所有者之上。
  •   
  • 系统会在其所有者被销毁时自动销毁拥有的窗口。
  •   
  • 拥有的窗口在其所有者最小化时隐藏。
  •   
     

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

     

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

     

应用程序可以将GetWindow函数与GW_OWNER标志一起使用   检索窗口所有者的句柄。

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

  

hWndParent [in,optional]

     

正在创建的窗口的父窗口或所有者窗口的句柄。要创建子窗口或拥有的窗口,请提供有效的窗口句柄。此参数对于弹出窗口是可选的。

这样做会导致参数过载。对于弹出窗口,此参数指定所有者。当你想创建一个无主的窗口传递<?php namespace SimplyTimesheets\Listeners\User; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use App\Repos\User\UserRepoInterface; use App\Repos\User\RoleRepoInterface; class AssignRole { /** * Create the event listener. * * @return void */ public function __construct(UserRepoInterface $user, RoleRepoInterface $role) { $this->user = $user; $this->role = $role; } /** * Handle the event. * * @param $event * @return void */ public function handle($event) { $user = $this->user->findUserById($event->user->id); $role = $this->role->findRoleById($event->request->role_id); return $user->roles()->save($role, ['cust_id' => $event->user->cust_id]); } } 时。这就是弹出窗口可选参数的含义。对于子窗口,您可以在此参数中传递窗口的父窗口。

现在,在您的情况下,您想要创建一个拥有的弹出窗口,因此在此参数中传递所有者。

答案 1 :(得分:2)

您只需将图形窗口设置为所有者即可。这是与子窗口的父级相同的hWndParent参数。我建议您还提供一些方法使文本窗口或多或少透明。