将焦点设置到子窗口的OnShowWindow中的父窗口不起作用

一般来说,我有一些button,打开子窗口,第二次按这个button应该closures它。 我使用触摸屏。

问题是当我尝试按下closures子窗口的button时,第一次没有按下,所以我需要再次单击。

为了解决这个问题,我试图在子窗口打开后将焦点返回到父窗口。

我注册OnShowWindow消息并在父窗口上调用SetFocus

 void CFlashGuidanceSteps::OnShowWindow(BOOL bShow, UINT nStatus) { CDialog::OnShowWindow(bShow, nStatus); GetParent()->SetFocus(); } 

当函数被调用(我可以在debugging器中看到它),焦点不会返回到父窗口。

但是,它与OnSetFocus事件一起使用:

 void CFlashGuidanceSteps::OnSetFocus(CWnd* pOldWnd) { CDialog::OnSetFocus(pOldWnd); GetParent()->SetFocus(); } 

为什么焦点没有被OnShowWindow事件保留?

说明

在MFC中通常的规则是调用OnXxx函数来响应类似命名的窗口消息,例如WM_Xxx 。 所以OnShowWindow将被调用以响应WM_SHOWWINDOW

根据文档 , WM_SHOWWINDOW

当窗口即将被隐藏或显示时,发送到窗口。

这意味着它是实际显示窗口之前发送的。 因此,当您将焦点设置到OnShowWindow函数内的父窗口时,实际上并没有发生,因为父窗口已经有了焦点。 然后,在OnShowWindow完成运行后,显示子窗口并要求重点。 就好像你从来没有试图改变焦点。

相比之下,对应于WM_SETFOCUS OnSetFocus只有在窗口获得焦点才会调用。 所以当你在这里重新分配焦点的时候,它会起作用,因为子窗口不会偷回焦点。

更好的主意

这就解释了你所看到的行为,正如你所知道的,当你在OnSetFocus调整焦点时,事情就可以正常工作。 但这真的不是解决问题的最好方法。

当一个窗口变得焦点和/或失去焦点时,手动改变焦点的方法是错误地接近问题,并且通常容易出错。 你会得到各种与焦点相关的难以调试的错误。 当你不想要的时候,你最好寻找方法来防止焦点改变。

这听起来像你想要防止子窗口创建时得到焦点。 有一种方法可以做到这一点。

当你显示子窗口,大概是通过在MFC中调用ShowWindow函数或其道德等价物,你应该通过SW_SHOWNA标志。 这会导致窗口显示而不激活它(即将其授予焦点)。