如何使 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 子窗口保持在其兄弟窗口之上?的主要内容,如果未能解决你的问题,请参考以下文章
MFC/VC 在多文档MDI程序中 子窗口初始最大化显示 如何去掉菜单栏右侧的最小化及向下还原按钮