如何使 MDI 子窗口保持在其兄弟窗口之上?

Posted

技术标签:

【中文标题】如何使 MDI 子窗口保持在其兄弟窗口之上?【英文标题】:How to make an MDI child window stay on top of its siblings? 【发布时间】:2009-02-27 11:17:16 【问题描述】:

此问题与my previous one.有关

我有一个 MFC (VC6) MDI 应用程序,它有多个 MDI 子窗口充当一个文档的不同视图。

是否可以将其中一个框架设置在其他框架之上? 我试过打电话

SetWindowPos(
   &GetParentFrame()->wndTopMost,
   0, 0, 0, 0,
   SWP_NOMOVE | SWP_NOSIZE);

ModifyStyleEx(0, WS_EX_TOPMOST);

来自 CMDIChildWnd,但似乎都不起作用。

【问题讨论】:

【参考方案1】:

在您的 CMDIChildWnd 类(通常是 CChildFrame)中,添加一个静态 HWND m_hTopWnd。将其设置为您希望始终位于顶部的孩子的 HWND。

CChildFrame 中处理WM_WINDOWPOSCHANGED。在处理程序中,检查当前的m_hWnd == m_hTopWnd。如果没有,请致电

::SetWindowPos(m_hTopWnd, HWND_TOP, 0, 0, 0, 0, 
    SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);

这样,每当设置任何 MDI 子窗口的位置时,“始终位于顶部”的窗口都会被推回顶部。

同时处理WM_CLOSE,当顶部窗口关闭时,设置m_hTopWnd = NULL。

另请参阅:CodeProject article 和 MSDN knowledgebase

【讨论】:

【参考方案2】:

您确定将子窗口置于其他窗口之上是一种好的 UI 设计吗?这不应该成为一个单独的最顶层框架吗?还是控制栏?

【讨论】:

我很确定它不是好的 UI 设计,但这个论点并不能说服决策者......

以上是关于如何使 MDI 子窗口保持在其兄弟窗口之上?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Qt 将 linux 子窗口保持在父窗口之上

如何更改 MDI 子窗口图标?

如何避免在添加新的MDI子窗口时出现屏幕跳动

MFC/VC 在多文档MDI程序中 子窗口初始最大化显示 如何去掉菜单栏右侧的最小化及向下还原按钮

如何从 MDI Visual C++ 2008 应用程序更改子窗口的背景

如何在vs 2005 中将mdi父窗口分割成两部分,一边treeview,一边显示子窗口(c# winform)