hwnd_top和hwnd_topmost,哪一个在最前面?

zrdongjiao 2013-10-22 07:50:41
很多人会说,肯定是hwnd_topmost啊,字面意思,肯定是它啊。

我们看msdn:

HWND_TOP:将窗口置于Z序的顶部。
HWND_TOPMOST:将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。

hwnd_topmost是非顶层窗口上,说明,下面是非顶层,其上面是顶层窗口,

hwnd_top是顶层窗口。

所以应该是hwnd_top是在hwnd_topmost上啊?

而实验的结果,出乎意料,比如类似QQ 的顶层窗口,据说是定时器不断的hwnd_topmost,而非hwnd_top.

我糊涂了。 什么是顶层窗口,什么是非顶层呢?二者的位置到底如何?
...全文
2698 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
weiwei22844 2014-03-28
  • 打赏
  • 举报
回复
简单来说hwnd_top只是一次生效,即设置完成后在桌面最上端,这是如果有其他窗口激活则其他窗口会覆盖掉被设置窗口上面,而hwnd_topmost设置完成后会始终在最上端,即便有其他窗口后来被激活仍在拥有hwnd_topmost属性的窗口下面
木四少 2013-12-08
  • 打赏
  • 举报
回复
大牛们,学习了。刚好最近有用到这个,一直没搞懂二者的区别,谢谢啊~~
xiaohuh421 2013-10-24
  • 打赏
  • 举报
回复
pop_up也是窗口, 原理是一样的撒. 如果是某个窗口中弹出的pop_up就会在这个窗口的上面. 如果是一个pop_up独立窗口, 那弹出来如果激活即会抢占HWND_TOP. 其实这些情况, 你都可以自己写代码来实验的, 别人说的都不一定完全正确, 代码与结果才是真实的反应. "实践才是检验真理的唯一标准"
引用 9 楼 zrdongjiao 的回复:
多谢了啊, 还有谁了解,pop-up与hwnd_top的关系, pop-up 一类的窗口,是否都是hwnd_top呢?
zrdongjiao 2013-10-24
  • 打赏
  • 举报
回复
引用 8 楼 xiaohuh421 的回复:
1. 是靠setwindowpos设置. 2. 所以说QQ那些需要定时的设置HWND_TOPMOST, 这样就能定时保证其在z-order的最前方式, 这个z-order是指所有有TOPMOST属性的窗口的z-order. 这个问题我已经在#6里说过, 就是你设置了TOPMOST, 其它窗口又设置了TOPMOST,就被"抢"了"沙发", 你只有重新再"插队"抢回来. BOOL SetWindowPos( HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags ); 你仔细看第二个参数的意思, 是指插入到哪个窗口的后面, HWND_TOPMOST就是指最上面了. HWND_TOP就是指非TOPMOST的最上面. HWND_xxxx都是代表一个插入位置.
多谢了啊, 还有谁了解,pop-up与hwnd_top的关系, pop-up 一类的窗口,是否都是hwnd_top呢?
xiaohuh421 2013-10-24
  • 打赏
  • 举报
回复
1. 是靠setwindowpos设置. 2. 所以说QQ那些需要定时的设置HWND_TOPMOST, 这样就能定时保证其在z-order的最前方式, 这个z-order是指所有有TOPMOST属性的窗口的z-order. 这个问题我已经在#6里说过, 就是你设置了TOPMOST, 其它窗口又设置了TOPMOST,就被"抢"了"沙发", 你只有重新再"插队"抢回来. BOOL SetWindowPos( HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags ); 你仔细看第二个参数的意思, 是指插入到哪个窗口的后面, HWND_TOPMOST就是指最上面了. HWND_TOP就是指非TOPMOST的最上面. HWND_xxxx都是代表一个插入位置.
zrdongjiao 2013-10-23
  • 打赏
  • 举报
回复
zrdongjiao 2013-10-23
  • 打赏
  • 举报
回复
引用 6 楼 xiaohuh421 的回复:
http://blogs.msdn.com/b/oldnewthing/archive/2005/11/21/495246.aspx 这里有个参考. 先不管父子窗口问题. 只说兄弟窗口 先要说说Z-ORDER, 即是一个窗口队列, 标识了了窗口层叠关系. 在这个z-order中TOPMOST窗口始终是在非TOPMOST窗口的上面, 这涉及到排序规则. 因为有TOPMOST属性, 就可以把窗口分为两类, TOPMOST和 非TOPMOST. 现在就好解释了. HWND_TOPMOST就是把窗口设置成最顶层窗口, 相当于直接把窗口放到队列的最前面. HWND_TOP就要分两种情况了, 1. 如果窗口本身是 非TOPMOST 的, 则窗口被提到所有 非TOPMOST 窗口的最前面, 但仍然在所以TOPMOST窗口的后面. 2. 如果窗口本身是TOPMOST, 这时效果跟HWND_TOPMOST相同. 所以说: "类似QQ 的顶层窗口,据说是定时器不断的hwnd_topmost,而非hwnd_top" 因为一次HWND_TOPMOST就可以实现, 为什么还要去HWND_TOP呢. 并且QQ还有可能被其它程序强行改成非TOPMOST的情况, 所以直接HWND_TOPMOST是最好的方法了.
大牛 2个小问题 1.TOPMOST属性 请问 这是什么属性,比如对话框,或者一个Cmainframe,我如何设置?是靠setwindowpos还是说创建窗口的时候,指定属性,这个我真不知道。 2.因为一次HWND_TOPMOST 一次是不可能搞定的, 其他全屏程序也可以hwnd_topmost的,依然会挡住你的窗口
xiaohuh421 2013-10-23
  • 打赏
  • 举报
回复
http://blogs.msdn.com/b/oldnewthing/archive/2005/11/21/495246.aspx 这里有个参考. 先不管父子窗口问题. 只说兄弟窗口 先要说说Z-ORDER, 即是一个窗口队列, 标识了了窗口层叠关系. 在这个z-order中TOPMOST窗口始终是在非TOPMOST窗口的上面, 这涉及到排序规则. 因为有TOPMOST属性, 就可以把窗口分为两类, TOPMOST和 非TOPMOST. 现在就好解释了. HWND_TOPMOST就是把窗口设置成最顶层窗口, 相当于直接把窗口放到队列的最前面. HWND_TOP就要分两种情况了, 1. 如果窗口本身是 非TOPMOST 的, 则窗口被提到所有 非TOPMOST 窗口的最前面, 但仍然在所以TOPMOST窗口的后面. 2. 如果窗口本身是TOPMOST, 这时效果跟HWND_TOPMOST相同. 所以说: "类似QQ 的顶层窗口,据说是定时器不断的hwnd_topmost,而非hwnd_top" 因为一次HWND_TOPMOST就可以实现, 为什么还要去HWND_TOP呢. 并且QQ还有可能被其它程序强行改成非TOPMOST的情况, 所以直接HWND_TOPMOST是最好的方法了.
zrdongjiao 2013-10-23
  • 打赏
  • 举报
回复
引用 4 楼 g6785654 的回复:
HWND_TOP是窗口队列的置顶,不过其实就是置于父窗口顶部,所以你不指定父窗口有时候是无效的。 而HWND_TOPMOST是所有窗口置顶,不管有没有父窗口,它都是跑到最顶层。
z序按位置有3类,一类是pop-up, 一类是子控件,另一类是类似QQ那种,顶到最前面。 默认的窗口都是pop-up 或者 overlapped风格的,它们在z序的顶层, 他们的父窗口是 桌面。 是第一类。 还有一类窗口,是通过代码 将窗口顶到 z序的最前端,通过hwnd_topmost顶上去的。这是第3类。 以上是我的知识积累得到的结论。 我们看 百度对setwindowpos中的hwnd_topmost的解释,还有msdn的解释,都解释hwnd_topmost为: "在非顶层窗口",这里所说的非顶层 容易误解人。 比如,子控件,如按钮等也是属于非顶层。 用定时器hwnd_top 试试,看 普通窗口会不会顶到最前面去, 结果大吃一惊,发现窗口是会顶到最前面。 但是在某些情况下,依然无法顶到最前面。 至于原因,我不清楚。 但是定时器hwnd_topmost,就一定可以顶到最前面。 总结: hwnd_top似乎不是对应着我说的第1类。 hwnd_topmost似乎是对应着我说的第3类
Ginie 2013-10-23
  • 打赏
  • 举报
回复
HWND_TOP是窗口队列的置顶,不过其实就是置于父窗口顶部,所以你不指定父窗口有时候是无效的。 而HWND_TOPMOST是所有窗口置顶,不管有没有父窗口,它都是跑到最顶层。
boylafong 2013-10-23
  • 打赏
  • 举报
回复
引用 2 楼 zrdongjiao 的回复:
没高手吗,我晕,都一天了啊
我没试过,是不是是这样的。 hwnd_top是让一个窗口一直保持顶层,,所谓的Z序应该是窗口的创建顺序。比如顺序创建有3个窗口A,B,C,其中C为hwnd_top,那么即使选中A让起处于激活状态,C仍然在A上面。 hwnd_topmost也是让一个窗口保持在顶层,假如创建有4个窗口A,B,C,D,AB为非顶层,CD为顶层,那么即使选种AB任何一个处于激活状态,C或D还是在顶层;但当C或D其中一个处于选中激活状态,都会处于另外三个之上,这也就是说明了,为什么QQ选择hwnd_topmost;假如你开了2个QQ,那么那个选择了就处于那个之上,但两个QQ都处于其他的窗口之上。 至于hwnd_top跟hwnd_topmost,你可以试下那个在上面。
zrdongjiao 2013-10-23
  • 打赏
  • 举报
回复
没高手吗,我晕,都一天了啊

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧