据我所知,GUI将有其窗口、窗口类,并将它们用于主窗口、所有按钮和选项卡等。
这些都有句柄,可以用WindowsGDI或OpenGL等其他后端进行渲染。当用户进行交互时,比如点击一个小部件,就会有一个回调函数/事件处理程序,它会完成自己的工作。但是,当用户点击切换表单的按钮时会发生什么(我不知道该怎么称呼它,所以我称之为"表单"——我指的是所有菜单、小部件和其他东西的可见集合——比如在谷歌Chrome上,我现在打开了这个选项卡,我可以转到另一个显示不同网站和GUI的选项卡(
GUI框架如何更改屏幕上的所有窗口?我可以理解它可以改变所选择的API(如OpenGL(渲染的内容,但它如何摆脱所有旧窗口并加载新窗口?它是否通过句柄禁用了所有的子窗口,并将它们留在屏幕上,但看不见,不接受输入?它会删除所有内容并创建新窗口吗?它实际上是如何(高效地(执行这种更改的?我可能在这里小题大做——如果我想得太多,请告诉我!
我曾经做过一个非常糟糕的游戏,使用c Win32、GDI和Direct2D,当你按下";播放";它会进入游戏,但我不得不以一种非常小的方式隐藏按钮——我不知道如何执行";开关">
我从来没有用过";适当的";像Qt这样的GUI框架,我自己也从来没有构建过,所以很抱歉这个问题中有任何错误,请纠正我。我问这个问题是因为我想把我自己的GUI框架作为一个长期项目(没有什么特别的,只是我可以说我已经实现了(,我不知道如何从低级的角度实现它,或者更确切地说,Qt等行业标准将如何在尽可能低的水平上实现这一点。
任何答案最好不要引用托管代码或任何脚本语言或外部库-我想知道如何在cWin32+任何任意图形API中做到这一点。提前谢谢。
这是通过在适当的级别更改子级的z顺序(即窗口从离用户最近到离用户最远形成堆栈(来实现的。每个窗口的直接子窗口都是按z顺序排列的,即使它们的排列方式实际上并不重叠。
例如,在选项卡控件的情况下,每个选项卡可能都有一个子选项卡,该子选项卡代表该选项卡的视图。单击按钮时,该选项卡的子选项卡将按z顺序移动,使其高于其所有同级选项卡(其他选项卡的窗体(。选项卡子窗口的大小都相同(选项卡客户端窗口的空白区域(,因此将子窗口置于其父窗口的z顺序顶部将覆盖所有其他视图。
在窗口的API的情况下,您可以通过SetWindowPos更改z顺序放置,如果您要滚动自己的(就像WPF所做的那样(,那么您需要以某种方式重新实现这个想法。