显示对话框后无法将焦点返回到主窗口
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
。
如果正确,请问是否涉及多线程。另一个线程正在创建一个窗口吗? 如何检查父窗口是否(未)获得焦点?
【讨论】:
哎呀,你是对的。我错误地添加了这个。谢谢。以上是关于显示对话框后无法将焦点返回到主窗口的主要内容,如果未能解决你的问题,请参考以下文章