概述
子类化
改变一个已经存在的窗口实例的性质,消息处理与其他实例属性。
在SDK编程范围内,子类化就是改变一个窗口实例的窗口函数(通过GetWindowLong和SetWindowLong)子类化所要实现的就是为某窗口实例编写新的窗口函数,其操作室在实例级别上进行的。
MFC中子类化的情况有所不同:所有MFC窗口有相同的窗口函数,由该窗口函数根据窗口句柄查找窗口实例,再把消息映射到该窗口类的消息处理函数上,为了利用MFC的消息映射机制,不真改变窗口函数名。MFC把子类化封装在函数SubclassWindow() 中,但子类化的本质没变,在实例级别影响窗口的消息及其处理。
Class B:public A
{
.......
}
A a; B b;
HWND ha=a.GetSafeWnd();
b.SubclassWindow(ha);//当然A和B不一定是继承关系。
超类化
窗口超类化是在窗口类---WNDCLASS或WNDCLASSEX级别进行的改变窗口类特征的。
使用:先获得一个已存在的窗口类,然后设置窗口类,最后注册窗口类。
WNDCLASSEX wc;
wc.cbsize=sizeof(wc);
GetClassInfoEx(hinst,"XXXX",&wc);
//hinst---定义窗口类XXXX的模块的句柄,如为系统定义的窗口类(如: Edit,Button)则hinst=NULL
wc.lpszClassName="YYYY";//必须改变窗口类的名字
wc.hbrBackground=CreateSolidBrush(RGB(0,0,0));
wc.lpfnWndProc=NewWndProc;//改变窗口过程
RegisterClassEx(&wc);
......
CreateWindow(_T("YYYY",.....);
故超类化只能改变自己创建的窗口的特性,而不能用于由Windows创建的窗口(如对话框上的按钮就不能进行超类化)。而子类化是实例级别的,只要能获得窗口实例,就可对其子类化。
模板类CWindowImplBaseT提供一个数据成员WNDPROC m_pfnSuperWindowProc并且初始化为 ::DefWindowProc.然而在窗口超类化处理时它存储了已注册窗口类的窗口过程,在窗口子类化时它保存窗口实例句柄原有的窗口过程,所有设置了bHandled=false的消息都由该数据成员处理。
template<class TBase=CWindow,class TWinTraits=CControlWinTraits>
class ATL_NO_VTABLE CWindowImplBaseT:public CWindowImplRoot<TBase>
{
public:
WNDPROC m_pfnSuperWindowProc;
CWindowImplBaseT():m_pfnSuperWindowProc(::DefWindowProc){}
}
子类化
子类化在窗口示例创建以后,把窗口实例的窗口过程用另一个用户定义窗口类的窗口过程函数
最后
以上就是安静鱼为你收集整理的窗口子类化和超类化的全部内容,希望文章能够帮你解决窗口子类化和超类化所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复