【问题标题】:How to handle control's notifications when subclassing a control? Such as EN_CHANGE?子类化控件时如何处理控件的通知?比如EN_CHANGE?
【发布时间】:2012-08-28 02:23:51
【问题描述】:

一个通知由一个控件发送给它的父级。当我使用SetWindowSubclass 子类化控件时,如何处理通知?我不想在父窗口进程中处理它们。在子类 proc 中有什么我可以做的吗?

如果我将一个Edit控件子类化,如何处理子类中的EN_CHANGE通知?

更新

这是子类proc:

LRESULT CALLBACK MyEditWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
  switch (uMsg)
  {
  default:
    return DefSubclassProc(hWnd, uMsg, wParam, lParam);
  }
}

我用

SetWindowSubclass(GetDlgItem(hWnd, ID_MYEDIT), MyEditWindowProc, 0, 0);

对 Edit 控件进行子类化。

但是我应该处理哪条消息?当然不是WM_NOTIFY,因为它是由父级处理的。

【问题讨论】:

  • 如果你已经继承了它,你应该可以在子类 WndProc 中处理它。如果没有,你能发布一些代码吗?
  • @casablanca 但是我应该处理哪条消息?
  • EN_CHANGE等不都是WM_USER + x吗?我没有分类那么多,所以我不记得了。
  • @chris EN_CHANGE 是通知代码,而不是消息代码。
  • 啊,我看错了你的问题。我认为您不能通过子类化来处理通知。 MFC 有一个名为message reflection 的功能可以执行此操作,但我所知道的 Win32 API 中没有执行此操作。

标签: c winapi user-interface


【解决方案1】:

如果我将一个 Edit 控件子类化,如何处理子类中的 EN_CHANGE 通知?

简短的回答:你不能。如果您将编辑子类化,您只能看到发送给它的消息;您无法收听或拦截 它已经发送的消息(尽管您可以添加额外的传出消息)。

但是,如果您确实需要这样做,另一种技术可能是创建一个中间窗口,包装编辑,以便原始父对话框将您的包装器作为子对话框,而您的wrapper 将编辑作为子项。现在,您的包装器可以拦截和过滤任何方向的消息。

它必须小心手动转发所有相关消息,并处理调整大小和其他内务处理问题;您可以通过子类化获得一堆“免费”,但在包装时必须明确处理它。此外,由于鼠标/键盘输入仍将转到内部控件;如果你需要监听,那么子类化将是必要的除了包装。

【讨论】:

  • +1 表示一个有趣的解决方案,尽管实施起来可能很痛苦。
【解决方案2】:

据我所知,仅使用 Win32 API 没有直接的解决方案。子类化让您可以处理发送到控件的消息,而不是由控件发送的消息。 Win32 通知由控件直接发送到父级,我认为您无法更改此行为。

MFC 通过名为message reflection 的功能执行类似于您想要的操作——消息仍发送到父窗口,但父窗口在子窗口中查找“反射”处理程序并手动调用这些处理程序。

您可以自己编写类似于 MFC 反射的东西,但这需要一些努力,所以如果有更简单的替代方案,您应该使用它。

【讨论】:

  • Borland/codeGear/Embarcadero 的 VCL 做了类似的事情。 WM_COMMAND、WM_NOTIFY 和其他子发送的消息被父窗口捕获并转发给发送它们的子窗口,以便子类处理自己的消息。
【解决方案3】:

EN_CHANGE 等总是发送到父窗口。您无法在子类控件中处理它们,因为它们不是发送到控件,而是发送到父控件。

如果您正在寻找一种方法来创建一个独立的编辑控件子类,而无需向父窗口过程添加代码,并且您想要处理这些通知消息,唯一的方法是子类也是父窗口。

【讨论】:

  • 或者通过 SetWindowsHookEx() 使用本地消息挂钩,寻找发往父窗口的消息。只要钩子进程和窗口在同一个进程中,就不需要把钩子放在单独的DLL中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
相关资源
最近更新 更多