现在的位置: 首页 > 综合 > 正文

Win32子类化与超类化

2018年09月03日 ⁄ 综合 ⁄ 共 1055字 ⁄ 字号 评论关闭

大家都知道,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);

抱歉!评论已关闭.