【问题标题】:MFC: How to catch set focus of each control of dialog in one functionMFC:如何在一个函数中捕获每个对话框控件的设置焦点
【发布时间】:2013-09-30 04:27:29
【问题描述】:

我有“n”个具有相同基本对话框的对话框。每个对话框都有自己的控件

  • 编辑框
  • 组合框
  • 列出控件

在基本对话框中,如何设置每个控件的焦点消息,例如,给一个带有

的消息框
text("Hello I got focus, my ID is %d")?

【问题讨论】:

  • 您可能希望使用消息挂钩来捕获 WM_SETFOCUS 消息。
  • 嗯是这样的,但我试图在 PreTranslateMessage、OnChildNotify 和 OnNotify 中捕捉 WM_SETFOCUS 并没有任何帮助,也许我做错了什么。

标签: c++ mfc setfocus


【解决方案1】:

最简单的方法是使用经典的子类化方法。问题是WM_SETFOCUS 没有通过消息循环泵送,所以PreTranslateMessage 将无济于事。

你有一些不错的类,它们有助于在不干扰 MFC 的情况下进行额外的子类化。 Paul Di Lascia 写了CSubclassWnd。 PJ Naughter 写了CHookWnd。并且用 ATL 有CWindowsImpl

即使窗口已经被 MFC 子类化,所有这些类都允许轻松附加子类化。

您也可以使用“标准子类化”GetWindowLong/SetWindowLong

【讨论】:

    【解决方案2】:

    根据this SO article,可以hookWM_SETFOCUS消息。

    您可以通过使用GetDlgCtrlID 和钩子返回的hwnd 来获取控件ID。

    但要小心弹出MessageBox,这会改变焦点并触发你的钩子进程,使其进入循环!

    【讨论】:

      【解决方案3】:

      正如 Jerry 已经说过的那样做一个钩子,通过GetParent()SendMessage(hParentWND, WM_MESSAGE, lParam, wParam) 获取父窗口处理程序。
      当然,您应该在父窗口中处理 WM_MESSAGE。
      顺便说一句,当窗口获得焦点时,框架会调用 OnSetFocus 函数。

      【讨论】:

        猜你喜欢
        • 2011-12-04
        • 1970-01-01
        • 2020-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-22
        相关资源
        最近更新 更多