12

有没有办法在 C++ MFC 中创建一个始终位于应用程序中其他窗口之上的无模式对话框?我想的有点像 Visual Studio 2005 中的“查找”对话框——它位于顶部,但您仍然可以编辑底层文本。

(如果有什么不同,那不是 MDI;它是一个基于对话框的应用程序)

4

3 回答 3

17

注意:这在 Windows 10 下不起作用,并且可能在 Windows 7 和 8 下不起作用(报告各不相同)。

尼什

###让你的对话框保持在最前面

您没有看过具有“始终保持领先”选项的程序吗?令人难以置信的是,您只需一行代码就可以使您的对话框保持在最前面。只需将以下行放在对话框类的 OnInitDialog() 函数中。

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

基本上我们正在做的是使用 SetWindowPos 函数来改变我们的对话窗口的 Z 顺序。我们通过将对话框移动到 Z 顺序的顶部,使我们的对话框保持在所有其他窗口的顶部。现在,即使您激活了其他窗口,我们的窗口也将保持在顶部。但是我建议您确保在执行此操作时确切地知道自己在做什么,因为如果他们在想要这样做时无法将您的窗户移开,可能会惹恼他们。

正如您在评论中提到的,上面的行使窗口位于每个应用程序的顶部。你需要做

SetWindowPos(&this->wndTop,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

使窗口仅位于您的应用程序之上。

于 2009-02-27T03:37:42.410 回答
1

对于 Windows 7 或更高版本,接受的答案失败。(或者也许是我)但是将无模式对话框设置为弹出窗口而不是子窗口可以解决它。它现在位于主对话框窗口中,但您可以编写代码以在任何地方进行约束。使用无边框或顶栏使其成为一个简单的窗口。

于 2018-07-19T18:54:37.907 回答
0

它在 Microsoft Windows 版本中对我有用10.0.18362.476。必须放入并将对话框制作SetWindowPos(&this->wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);为.OnInitDialogPopUp

于 2021-09-03T16:38:10.870 回答