【问题标题】:How can I debug a constantly losing focus window (dialog, for instance) in MFC?如何在 MFC 中调试不断失去焦点的窗口(例如对话框)?
【发布时间】:2014-09-09 18:21:57
【问题描述】:

我正在维护我的大而成熟的应用程序,没有 MFC 范例和布局的背景。我有 Qt、OO 设计和 UI 框架方面的经验(我了解每个线程的职责、事件循环、事件处理层次结构等。

当我尝试配置我的应用程序时,我遇到了设置 CDialog 窗口不断失去焦点的问题。我还有一个文件浏览器对话框,其行为方式完全相同。两者都由 DoModal 调用激活。

我读到这可能是因为我有两个模态对话框争夺焦点。我该如何调试呢?我可以使用什么函数来获得有用的调用堆栈,以便找到有问题的代码?有没有MFC::focusWindow(WHND window) 或者我可以拦截的东西?

【问题讨论】:

  • 如果与焦点有关,请尝试远程调试而不是本地调试。这样您就不会在调试器获得焦点和对话框失去焦点之间感到困惑。

标签: c++ mfc modal-dialog


【解决方案1】:

根据您的描述,问题是您“有两个模态对话框争夺焦点”。这通常是不可能的,因为根据定义,模态对话框会接管应用程序,并且在对话框关闭之前不会将控制权返回到其启动点。在不了解应用程序架构的情况下,最简单的解决方案是使设置对话框无模式(创建它然后调用 ShowWindow(SW_SHOW) 而不是 DoModal。这将允许消息循环为其他模式对话框运行,但不会从您的设置对话框,除非它在自己的方法中明确执行。

【讨论】:

  • 我会尝试,至少尝试找到焦点小偷窗口是什么。我是为 Windows 构建的,它是一个桌面应用程序。恐怕主窗口(只有一个,然后是模态)正在作为模态打开。
  • 实际上,没有一个窗口获得焦点,至少我看不到。
  • 然后您可以通过在 InitDlg 消息处理程序中设置它来手动获取焦点,该处理程序在创建窗口之后但在它出现在屏幕上之前触发,因此所有控件对象都存在于该点。 m_MyButton.setFocus();主窗体窗口是任何对话框的父窗口,消息处理应遵循任何打开的子窗口。对话框是否被正确地创建为主窗口的子窗口?
  • 没有看到代码很难知道是什么原因造成的。但是还有其他东西正在运行消息循环并创建一个活动窗口,该窗口在代码中占据或获得焦点。
  • 是的,你完全正确。抱歉太含糊了。我给你正确答案的标志,因为你更彻底地解决了这个问题。
【解决方案2】:

使用 Spy++ 监视对话框中发生的消息/事件。

【讨论】:

  • 还不接受这个,但非常感谢你分享这个。 Spy++ 似乎是我理解 UI 元素的行为和交互所需要的。
【解决方案3】:

【讨论】:

  • Remarks The SetFocus function sends a WM_KILLFOCUS message to the window that loses the keyboard focus and a WM_SETFOCUS message to the window that receives the keyboard focus. It also activates either the window that receives the focus or the parent of the window that receives the focus. 我可能应该在WM_SETFOCUS 消息而不是SetFocus 函数上中断。 SetFocus 似乎是一个高级 API,它使用这些消息来实际达到预期的效果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
相关资源
最近更新 更多