3

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

如果我将编辑控件子类化,如何处理EN_CHANGE子类中的通知?

更新

这是子类过程:

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);

子类化编辑控件。

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

4

3 回答 3

4

如果我将编辑控件子类化,如何处理子类中的 EN_CHANGE 通知?

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

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

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

于 2012-08-28T03:01:11.137 回答
3

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

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

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

于 2012-08-28T02:58:46.457 回答
2

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

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

于 2012-08-28T03:00:31.853 回答