窗口子类化和超类化

子类化

改变一个已经存在的窗口实例的性质,消息处理与其他实例属性。

在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){}

}

子类化

子类化在窗口示例创建以后,把窗口实例的窗口过程用另一个用户定义窗口类的窗口过程函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值