Win32子类化与超类化

大家都知道,MS提供了很多丰富的控件(也叫窗体),但有些控件在实际的应用中可能还是不能满足要求,比如说,我想让BUTTON点击时变成另一种外观,我们怎么做呢?要改变外观就只能重新进行绘制,肯定就需要在HWND的WM_PAINT消息里面处理,问题是我们怎么才能得到这个HWND的消息呢?每一个窗体都是通过CreateWindow来创建的,在创建之前,都会注册一个类,这个类就相当于是模板,当然有些是系统自己注册的类,如BUTTON,EDIT等,注册类时就会指定一个消息处理过程函数的指针,我们可以想办法来替换这个指针,让它指向我们自己的函数,这样我们就可以接收到这个HWND的消息了。

 

子类化是什么?

子类化,就我个人的理解,它主要是针对窗体而言的。如果一个被子类化的窗体,我们能够捕获其消息,这样就可以处理我们感兴趣的消息了。

 

如何子类化?

1)在Windows中,每一个窗体都会有一个HWND,对窗体的所有操作,几乎都是通过这个HWND来进行的,子类化也不例外。Windows提供了一个API,GetWindowLong,通过这个函数得到HWND的原始消息处理过程函数的指针,将其保存起来,再调用SetWindowLong来设置一个新的函数指针,使这个指针指向我们自己的函数,这样,在我们的消息处理函数中,只处理我们关心的消息,不关心的消息就调用其原始的指针来处理消息。

2)通过SetWindowSubclass 函数,指定一个窗口过程函数指针。注意,在窗体Destroy前,调用RemoveWindowSubclass 来移除子类化回调函数。


    超类化, 用GetClassInfoEx获取原有的HWND的所有信息,然后用我们自定义的窗口处理过程取代原有的窗口过程 用我们自定义的类名“HexEdit”取代原有的类名“Edit” 然后用RegisterClassEx向windows注册我们的新类

代码如下:

WNDCLASSEX stWC;
    stWC.cbSize = sizeof(stWC);
    GetClassInfoEx(NULL, szEditClass, &stWC);
    lpOldProcEdit = stWC.lpfnWndProc;

// 更改其窗口过程函数指针
    stWC.lpfnWndProc = ProcEdit;
    stWC.hInstance = hInst;
    stWC.lpszClassName = szClass;

// 重新注册类
    RegisterClassEx(&stWC);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值