SubclassWindow
在MFC中, SubclassWindow是CWnd类的一个成员函数;
原型如下:
/*
*概述 :调用此成员函数以“动态子类”窗口并将其附加到此 CWnd 对象;
*参数 :
HWND hWnd -> 窗口句柄
*/
BOOL SubclassWindow(HWND hWnd);
这个中文版的概述暂时看不懂啥意思…
为了更好理解, 查看了这个函数的英文概述
Call this member function to “dynamically subclass” a window and attach it to this CWnd object.
结合中英文理解了一下因该是这样的;(暂时的, 后面又完整例子)
CWnd Frm;
Frm.SubclassWindow(hWnd);
Frm调用了SubclassWindow函数用来 “动态化子类” 窗口(hWnd), 并将窗口(hWnd)附加到Frm对象当中.
现在有以下两个问题 :
- 什么是"动态子类"化
- 什么是附加
看看官方(MSDN)给出的注释
When a window is dynamically subclassed, windows messages will route through the CWnd’s message map and call message handlers in the CWnd’s class first. Messages that are passed to the base class will be passed to the default message handler in the window.
This member function attaches the Windows control to a CWnd object and replaces the window’s WndProc and AfxWndProc functions. The function stores a pointer to the old WndProc in the CWnd object.
翻译如下:
当窗口动态子类化时,Windows 消息将首先通过 CWnd对象“消息映射”路由并调用“(对象)类中的 CWnd消息处理程序。 传递给基类的消息将传递到窗口中的默认消息处理程序。
此成员函数将窗口控件附加到CWnd对象,并替换窗口WndProc和AfxWndProc函数。 该函数将指针存储在对象中旧 WndProc 对象中 CWnd 。
总的来看就做了两件事
1.附加:
把一个窗口实体附加到窗口类中(即把一个窗体的hwnd赋给该类)
2.子类化
让消息先被窗口类捕获在进入到窗口实体(传入的参数hwnd)之中.
举个例子
假如我们有一个CEdit的派生类 CMyEdit 我们让它在接收到输入时就弹出消息盒子. 我们可以改写WM_CHAR响应函数在使用SubclassWindow将CMyEdit子类化到一个对话框中的实体文本编辑框之中就可以了.
例子在VS2013中编译
免费例子下载