如何在子类化控件时处理控件的通知?比如EN_CHANGE?

时间:2012-08-28 02:23:51

标签: c winapi user-interface

控件将通知发送给其父级。当我使用SetWindowSubclass对控件进行子类化时,如何处理通知?我不想在父窗口proc中处理它们。我可以在子类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,因为它是由父母处理的。

3 个答案:

答案 0 :(得分:4)

  

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

简短的回答:你做不到。如果您对编辑进行子类化,则只能看到发送到的消息;您无法收听或拦截通过发送的消息(尽管您可以添加其他外发消息)。

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

必须注意手动转发所有相关信息,并处理调整大小和其他内务管理问题;你可以通过子类获得一堆'免费',但在包装时必须明确处理它。此外,由于鼠标/键盘输入仍将进入内部控制;如果您需要收听,那么继承子>

包装将是必要的。

答案 1 :(得分:2)

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

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

你可以自己编写类似于MFC反射的东西,但这需要付出一些努力,所以如果有更简单的选择,你应该选择它。

答案 2 :(得分:2)

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

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