BringWindowToTop
,SetForegroundWindow
,SwitchToThisWindow
,SetWindowPos
,ShowWindow
所有被描述为示出与激活的窗口.
它们之间有什么真正的区别?何时以及为什么BringWindowToTop
首选SetForegroundWindow
,或者SwitchToThisWindow
甚至SetWindowPos
将标志设置为激活和显示?
Adr*_*thy 34
涉及许多密切相关的概念,相关术语经常被滥用,即使在官方文档中也是如此.
重要的窗户类型:
顶级窗口:没有父窗口的Windows.应用程序的主窗口几乎总是顶级窗口.它与z-order没有任何关系.
子窗口:父窗口包含的Windows.他们的位置总是相对于父寡妇的区域.子窗口通常是"控件":UI等按钮和编辑框.
父窗口:具有子窗口的Windows.顶级窗户经常有孩子.但请注意,子窗口也可能有子窗口,因此父窗口和子窗口都是.
拥有的窗口:由另一个窗口控制的Windows,但不一定是其他窗口的子窗口.一个例子是浮动工具调色板:它由应用程序中的另一个窗口拥有,但它没有锁定到其他窗口的区域.
所有者窗口:拥有自有窗口的Windows.
通常,所有者/拥有关系与父/子关系之间的区别并不重要,因此父和子术语通常用于两种情境,即使在文档中也是如此.在某些情况下,父字段和参数会重载为父母和/或所有者.
重要概念:
z顺序的顶部:字面意思是显示在其他窗口上方的窗口.
活动窗口:模糊概念,但它通常表示用户将认为是"当前"窗口的顶级窗口.活动窗口通常使用独特边框绘制,并且任务栏上的图块会突出显示.活动窗口通常位于所有其他顶级窗口中z顺序顶部或附近,并且它是具有键盘焦点的窗口的父级或所有者(可能是间接的).
键盘焦点:表示将接收键盘消息的窗口.从概念上讲,有一个带键盘焦点的窗口.通常,具有焦点的窗口是活动窗口的子(或孙子等).
foreground:活动窗口通常位于前台.这个名称似乎表明它位于z顺序的顶部,但它确实意味着创建窗口的线程获得了轻微的优先级提升.该活动窗口通常也是前景窗口.
因此,假设您已打开此浏览器窗口,并且还有一个记事本运行实例.如果在记事本中单击该文档,则会发生一连串的消息和状态更改.您实际上是在点击一个大编辑框,这是一个记事本顶层窗口的子窗口.该单击导致编辑框被激活,但子窗口实际上不能成为"活动"窗口,因此它只需要键盘焦点并通过其祖先传递激活消息,直到它到达顶级窗口.顶级窗口通过移动到z顺序的顶部来"激活",突出显示其边框等.它也成为前景窗口,因此其线程得到一点提升,使UI比其他任何一个响应更快视窗.
考虑到这些术语,您可以解析列出的功能的MSDN描述,以梳理出细微差别.
如果您正在尝试布置窗口的子项,只需使用SetWindowPos(或MoveWindow,SizeWindow和ShowWinow).在剩余的函数中,SwitchToThisWindow看起来已被弃用,与SetForegroundWindow基本相同.(请注意,在许多情况下,除非您是活动应用程序或活动应用程序已授予您使用权限,否则SetForegroundWindow将无法执行您想要的操作.)BringWindowToTop主要是将窗口置于z的顶部. order(你可以使用SetWindowPos),如果你在顶级窗口调用它,会产生类似SetForegroundWindow的额外副作用.
更新: Raymond Chen 在活动窗口和前景窗口之间发布了更明确的区别.报价:
前导窗口的概念是在输入被去同步时引入的,以便表达"真正的全局活动窗口",而SetActiveWindow则继续引用本地活动窗口.
归档时间: |
|
查看次数: |
13193 次 |
最近记录: |