MFC:如何在一个函数中捕获对话框的每个控件的设置焦点

MFC: How to catch set focus of each control of dialog in one function

本文关键字:对话框 焦点 设置 控件 一个 MFC 函数      更新时间:2023-10-16

我有"n"个对话框,它们具有相同的基本对话框。每个对话框都有自己的控件

  • 编辑框
  • 组合框
  • 列表控件
  • 等。

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

text("Hello I got focus, my ID is %d")?

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

这些类很好,有助于在不干扰MFC内容的情况下进行额外的子类化。保罗·迪·拉西亚写了CSubclassWnd。PJ Naughter写道CHookWnd。随着ATL的CWindowsImpl.

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

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

根据这篇SO文章,您可以挂钩WM_SETFOCUS消息。

可以通过将 GetDlgCtrlID 与挂钩返回的hwnd一起使用来获取控件 ID。

但要小心弹出一个MessageBox,这会改变焦点并触发你的钩子过程,让它进入循环!

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