【发布时间】:2010-10-10 06:06:03
【问题描述】:
有没有办法在 C++ MFC 中创建一个 modeless 对话框,该对话框始终位于应用程序中其他窗口的顶部?我的想法有点像 Visual Studio 2005 中的“查找”对话框 - 它位于顶部,但您仍然可以编辑底层文本。
(如果有什么不同,那不是 MDI;它是一个基于对话框的应用程序)
【问题讨论】:
标签: c++ mfc dialog modeless always-on-top
有没有办法在 C++ MFC 中创建一个 modeless 对话框,该对话框始终位于应用程序中其他窗口的顶部?我的想法有点像 Visual Studio 2005 中的“查找”对话框 - 它位于顶部,但您仍然可以编辑底层文本。
(如果有什么不同,那不是 MDI;它是一个基于对话框的应用程序)
【问题讨论】:
标签: c++ mfc dialog modeless always-on-top
注意:这在 Windows 10 下不起作用,在 Windows 7 和 8 下可能不起作用(报告各不相同)。
来自Nish:
###让你的对话框保持在顶部
你没看过有 “始终保持领先”选项?好吧 令人难以置信的是,你可以 让你的对话保持在最前面 一行代码。简单地说 对话类中的以下行 OnInitDialog() 函数。
SetWindowPos(&this->wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);基本上我们正在做的是使用 要更改的 SetWindowPos 函数 我们对话窗口的 Z 顺序。我们 让我们的对话始终处于首位 将其他窗口移到顶部 Z 顺序。现在即使你 激活另一个窗口,我们的窗口 将保持在顶部。但我会建议你 确保你确切地知道你的 当你这样做的时候正在做,因为它 如果他们不能得到,可能会惹恼人们 当他们挡住你的窗户时 想这样做。
正如您在 cmets 中提到的,上面的行使窗口位于每个应用程序的顶部。你需要这样做
SetWindowPos(&this->wndTop,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
使窗口仅位于您的应用程序之上。
【讨论】:
对于 Windows 7 或更高版本,接受的答案失败。 (或者也许是我) 但是将无模式对话框作为弹出窗口而不是子窗口可以解决它。 它现在位于主对话框窗口中,但您可以编写代码来约束任何地方。 使用无边框或顶栏使其成为一个简单的窗口。
【讨论】:
它在 Microsoft Windows 版本 10.0.18362.476 中对我有用。必须将SetWindowPos(&this->wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); 放入OnInitDialog 并将对话框设为PopUp。
【讨论】: