【问题标题】:How does a GUI framework switch windows/window views/forms on Windows?GUI 框架如何在 Windows 上切换窗口/窗口视图/窗体?
【发布时间】:2020-12-04 16:29:09
【问题描述】:

据我了解,GUI 将有其窗口、窗口类,并将它们用于主窗口以及所有按钮和选项卡等。

这些都将具有句柄并使用 Windows GDI 或其他后端(如 OpenGL)呈现。当用户交互时,比如通过点击一个小部件,将会有一个回调函数/事件处理程序,它会完成它的工作。但是当用户点击一个切换按钮时会发生什么(我不知道该怎么称呼它,所以我称之为“表单” - 我的意思是所有菜单和小部件和东西的可见集 -就像在谷歌浏览器上一样,我现在打开了这个选项卡,我可以移动到另一个显示不同网站和 GUI)表单的选项卡。

GUI 框架如何改变屏幕上的所有窗口?我可以理解它可以改变使用所选 API 渲染的内容,例如 OpenGL,但它如何摆脱所有旧窗口并加载新窗口?它是否通过它们的句柄禁用所有子窗口,并将它们留在屏幕上,但看不见并且不接受输入?它会删除所有内容并创建新窗口吗?它如何实际执行此更改(也有效)?我可能在这里从一个小山丘中变成一座山 - 如果我想太多,请告诉我!

我曾经使用 c Win32、GDI 和 Direct2D 制作了一个非常糟糕的游戏,当你按下“播放”时它会进入游戏,但我只是不得不以一种非常有问题的方式隐藏按钮 - 我不知道如何执行“切换”。

我从来没有使用过像 Qt 这样的“正确”的 GUI 框架,也没有自己构建过一个,所以对问题中的任何勘误表示歉意,请纠正我。我问是因为我想将自己的 GUI 框架作为一个长期项目(没什么特别的,只是我可以说我已经实现了),我不知道如何从低级的角度实现它,或者更确切地说,Qt 等行业标准将如何在尽可能低的级别实现这一点。

任何答案最好不要参考托管代码或任何脚本语言或外部库 - 我想知道如何在 c Win32 + 任何任意图形 API 中执行此操作。提前致谢。

【问题讨论】:

标签: c user-interface winapi


【解决方案1】:

这是通过在适当级别更改子级的 z 顺序(即窗口从离用户最近到最远形成一个堆栈)来实现的。每个窗口的直接子级都按某个 z 顺序排列,即使它们的排列方式实际上并不重叠。

例如,在选项卡控件的情况下,可能会有一个与每个选项卡关联的子项,该子项代表该选项卡的视图。单击按钮时,该选项卡的子项按 z 顺序移动,因此高于其所有同级(其他选项卡的表单)。子选项卡的这些窗口都将具有相同的大小(选项卡客户端窗口的空白区域),因此将子项置于其父项 z 顺序的顶部将覆盖所有其他视图。

在窗口 API 的情况下,您可以通过 SetWindowPos 更改 z-order 位置,如果您打算自己滚动(如 WPF 所做的那样),那么您将需要以某种方式重新实现这个想法。

【讨论】:

  • 所以现在当我使用谷歌浏览器时,它会实际运行和显示所有选项卡,但只有我正在使用的选项卡位于 z-stack 顶部?跨度>
  • 这是否也意味着我的用户输入只会进入 z-stack 上的最顶层窗口——这是 Windows 操作系统默认实现的?
  • 键盘消息转到有焦点的窗口,鼠标消息转到捕获鼠标的窗口(这样做时需要聚焦)或鼠标下的窗口,这将作为该处理的一部分获得焦点。我不知道焦点窗口不会位于 z 顺序之上的任何情况。
猜你喜欢
  • 2016-04-25
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多