显示对话框后无法将焦点返回到主窗口

Posted

技术标签:

【中文标题】显示对话框后无法将焦点返回到主窗口【英文标题】:Can't return focus to the main window after showing dialog 【发布时间】:2014-05-14 15:02:54 【问题描述】:

我使用CWnd::DoModal 函数在 MFC 中创建对话窗口。 窗口在 CWinApp::OnIdle() 中实例化

CPatientFile pf;
pf.DoModal();

DoModal 函数返回时,焦点不会返回到主窗口。 我尝试手动设置焦点

AfxGetMainWnd()->SetFocus();

还尝试将主窗口设置为前台或活动窗口。

通常我有触摸屏,所以当我关闭对话框时,我需要按下主窗口上的按钮才能让它工作。

那么正确的做法是什么?

【问题讨论】:

那么谁才是焦点? 您是否考虑过在DoModal 之前缓存焦点窗口,然后在它返回后恢复它? 这个选项也被选中了:( 你能创建一个重现问题的 SSCCE 吗? 【参考方案1】:

只需检查 CPatientFile 的构造函数。它可能正在接受父窗口 CWnd *。将主窗口作为父窗口传递。

喜欢

CPatientFile pf(this); //if this code is in main window class itelf

CPatientFile pf(AfxGetMainWnd());

更新:

如果你已经从主窗口实例化了对话框,那么当对话框关闭时焦点会自动回到窗口。我怀疑您在创建主窗口后已经从应用程序类本身(CWinApp)实例化了对话框。如果是这种情况,则主窗口可能无法获得焦点,您必须从主窗口中创建对话框。或者,如果您在单独的线程中创建对话框。

作为一种解决方法,您可以使用 AfxGetMainWnd()->SetForegroundWindow() 或 AfxGetMainWnd()->SetActiveWindow()。但首先我会尝试找出问题的原因并尝试编写更好的代码(如上段所建议的)。

【讨论】:

我正在尝试从 CWinApp OnIdle 打开对话框。我尝试了您的解决方法,但没有奏效。【参考方案2】:

如果您复制粘贴,则该语句本身不正确:

CPatientFile pf();

下一行根本不应该编译。为什么?因为它声明了一个名为pf 的函数,它返回CPatientFile

如果正确,请问是否涉及多线程。另一个线程正在创建一个窗口吗? 如何检查父窗口是否(未)获得焦点?

【讨论】:

哎呀,你是对的。我错误地添加了这个。谢谢。

以上是关于显示对话框后无法将焦点返回到主窗口的主要内容,如果未能解决你的问题,请参考以下文章

showModalDialog和showModelessDialog使用心得

如何在不将焦点转移到另一个窗口的情况下显示 MFC 对话框

模型对话框移动到主窗口后面的 Qt 错误

失去焦点后无法取消对话框?

如何在pyqt中从对话框窗口检索数据到主窗口?

qt对话框失去焦点透明