在子窗口的 OnShowWindow 中将焦点设置为父窗口不起作用
Setting focus to the parent window in the OnShowWindow of the child window doesn't work
一般来说,我有一些打开子窗口的按钮,第二次按下这个按钮应该关闭它。我用的是触摸屏。
问题是当我试图按下关闭子窗口的按钮时,它不是第一次按下,所以我需要再点击一次。
为了解决这个问题,我试图在打开子窗口后将焦点返回到父窗口。
我注册OnShowWindow
消息并在父窗口上调用SetFocus
:
void CFlashGuidanceSteps::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog::OnShowWindow(bShow, nStatus);
GetParent()->SetFocus();
}
当函数被调用时(我可以在调试器中看到它),焦点不会返回到父窗口。
但是,它适用于OnSetFocus
事件:
void CFlashGuidanceSteps::OnSetFocus(CWnd* pOldWnd)
{
CDialog::OnSetFocus(pOldWnd);
GetParent()->SetFocus();
}
为什么焦点没有保留在OnShowWindow
事件上?
说明
MFC中通常的规则是OnXxx
函数被调用来响应类似命名的窗口消息,例如WM_Xxx
。因此OnShowWindow
将被调用作为WM_SHOWWINDOW
的响应。
根据文档,WM_SHOWWINDOW
是
当窗口即将被隐藏或显示时发送给窗口。
这意味着在窗口实际显示之前发送。因此,当您将焦点设置为OnShowWindow
函数中的父窗口时,实际上没有发生任何事情,因为父窗口已经具有焦点。然后,在OnShowWindow
完成运行后,显示子窗口并要求焦点。就好像你从来没有想过要改变焦点。
OnSetFocus
对应于WM_SETFOCUS
,直到窗口获得焦点后才调用。所以当你在这里重新分配焦点时,它会工作,因为子窗口不会把焦点偷回来。
更好的主意
这解释了你所看到的行为,如你所知,当你调整OnSetFocus
的焦点时,事情会很好。但这真的不是解决问题的最好方法。
当窗口获得和/或失去焦点时手动更改焦点是一种错误的解决问题的方法,并且通常容易出错。您将获得各种难以调试的与焦点相关的错误。当你不希望焦点发生变化时,你最好想办法防止它发生变化。
在我看来,你想要防止子窗口在创建时获得焦点。有一种方法可以做到这一点。
当您显示子窗口时,可能是通过调用ShowWindow
函数或其在MFC中的等效函数,您应该传递SW_SHOWNA
标志。这会导致窗口显示,而不需要激活它(即,授予它焦点)。
- 将 SDL2 窗口设置为特定显示
- 如何在win32的窗口类中设置动态菜单?
- 如何设置与其背景图像大小相对应的窗口大小?
- 设置窗口几何图形特性的正确方法
- Win32 C++ 将窗口位置设置为右下角
- QT:即使在static_cast后也无法在主窗口中设置对象的位置
- C# - 显示对话框将所有者设置为非托管窗口
- 如何在窗口上设置使用 CreateProcess 创建的新进程的主线程的堆栈大小?
- 如何设置终端窗口的固定尺寸
- Win32/Gdigrab - 如何将另一个进程窗口设置为无边框
- 系统( "bcdedit /set safeboot" ) 未将窗口设置为安全启动
- 将我的窗口设置为C 类
- c++ qt 主窗口设置图像后的对话框"确定"按钮
- 移动窗口 - 设置最小宽度/高度
- 如何在OSX中使用C++opencv highgui将活动窗口设置为opencv图像
- 将Mac Eclipse更改为窗口设置
- 如何基于QProcess将窗口设置为活动窗口
- 如何将gtkmm窗口设置为在屏幕中央打开
- 将qtc++主窗口设置为始终在底部macosx上
- 当窗口设置为活动状态时获取通知