两个窗口是兄弟关系,能不能设置他们之间的ZOrder,使得一个窗口总是在另一个的上面?,

统才 2013-12-26 08:56:18
即使鼠标点击下面的窗口,上面的窗口依然在上面?

就是想令这两个窗口实际上是兄弟关系,而效果是拥有被拥有的效果。

注:

这里说的兄弟窗口,是特指两个owned window, 而不是两个child window。



...全文
234 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2014-02-12
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
_船长_ 2013-12-26
  • 打赏
  • 举报
回复
假设这两个窗口分别为A和B,B始终位于A的前面,那么A处理WM_ACTIVE消息时,判断A是否被激活,如果被激活的话,就调用SetAcitveWindow函数,参数为B窗口的句柄,将B窗口设置为激活状态
allenhiman 2013-12-26
  • 打赏
  • 举报
回复
引用 4 楼 u013058273 的回复:
我这里不能用SetOwner,因为,当其中owner窗口销毁,就销毁了owned窗口了。 而这两个窗口,本身是兄弟关系,任何一个销毁,都不会导致另一个销毁的。 至于你说的OnWindowPosChanging,我不是很懂你的过程做了什么。(而且这个是需要SetOwner吗?) [quote=引用 2 楼 allenhiman 的回复:] 最好通过setower达到目的 如果窗口类你可控制的话 也可以响应 void CVirtualKioskDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos) { if( lpwndpos->hwnd == this->m_hWnd ) { lpwndpos->hwndInsertAfter = hwndAwaysOntop; lpwndpos->flags |= SWP_NOACTIVATE; lpwndpos->flags &= ~SWP_NOZORDER; } //#endif CHtmlWidget::OnWindowPosChanging(lpwndpos); }
[/quote] 所有popup类型的窗口 当它的zorder发生变化时 都会产生一个消息叫做WM_WINDOWPOSCHANGING 我是假设你用的是MFC CDialog类 那么你可以用IDE添加对于这个消息的响应函数 然后重写响应函数 hwndAwaysOntop 指的是 你希望永远位于上边的窗口句柄 这个操作 无需setowner
统才 2013-12-26
  • 打赏
  • 举报
回复
设置HWND_TOPMOST就更加不是我想要的效果了。 这样会遮住别人的窗口。
引用 1 楼 u010588063 的回复:
BOOL SetWindowPos( HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags ); hWndInsertAfter 设为 HWND_TOPMOST
统才 2013-12-26
  • 打赏
  • 举报
回复
我这里不能用SetOwner,因为,当其中owner窗口销毁,就销毁了owned窗口了。 而这两个窗口,本身是兄弟关系,任何一个销毁,都不会导致另一个销毁的。 至于你说的OnWindowPosChanging,我不是很懂你的过程做了什么。(而且这个是需要SetOwner吗?)
引用 2 楼 allenhiman 的回复:
最好通过setower达到目的 如果窗口类你可控制的话 也可以响应 void CVirtualKioskDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos) { if( lpwndpos->hwnd == this->m_hWnd ) { lpwndpos->hwndInsertAfter = hwndAwaysOntop; lpwndpos->flags |= SWP_NOACTIVATE; lpwndpos->flags &= ~SWP_NOZORDER; } //#endif CHtmlWidget::OnWindowPosChanging(lpwndpos); }
统才 2013-12-26
  • 打赏
  • 举报
回复
我用过这个函数了,效果不行。 不是说设置ZOrder失败。而是: 当我点击下面的窗口,操作系统首先把下面的窗口拖到最前来了,然后我再使用SetWindowPos来调整ZOrder,窗口又走下去了,这样造成了一个闪烁的效果缺陷。(就是说,他们的ZOrder曾经互换过) 真正的拥有和被拥有的效果,无论你点击上面,或是下面的窗口,他们之间的ZOrder,是不会出现互换的过程的,一直保持上下关系的,不曾互换的。
引用 1 楼 u010588063 的回复:
BOOL SetWindowPos( HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags ); hWndInsertAfter 设为 HWND_TOPMOST
allenhiman 2013-12-26
  • 打赏
  • 举报
回复
最好通过setower达到目的 如果窗口类你可控制的话 也可以响应 void CVirtualKioskDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos) { if( lpwndpos->hwnd == this->m_hWnd ) { lpwndpos->hwndInsertAfter = hwndAwaysOntop; lpwndpos->flags |= SWP_NOACTIVATE; lpwndpos->flags &= ~SWP_NOZORDER; } //#endif CHtmlWidget::OnWindowPosChanging(lpwndpos); }
u010588063 2013-12-26
  • 打赏
  • 举报
回复
BOOL SetWindowPos( HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags ); hWndInsertAfter 设为 HWND_TOPMOST

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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