Windows GUI 窗体的子类化和超类化

来源:互联网 发布:全球即时通讯软件排名 编辑:程序博客网 时间:2024/05/01 13:13

窗体子类化的作用:窗口子类化技术最大的特点就是能够截获windows的消息。一旦用户自定义的窗口函数截取了传向原窗口函数的消息,就可以对被截取的消息进行如下处理:

将其传给原窗口函数。这是对大多数消息应该采取的措施,因为子类通常只对原来的窗口特性做少量的改动。

截取该消息,阻止其向原窗口函数发送。

修改该消息,修改完毕以后再向原窗口函数发送。

Windows SDK提供了一些设计好的窗口类,如edit  listbox  treeview 等。通过截取这些通用窗口类的消息,用户程序可以为它们添加新的特性,改善其外观,扩充其功能

子类化的优点:不需创建新的窗口类,不需了解一个窗口的窗口过程。这在原来的窗口函数是由别人编写,而且创建过程不可见的情况下非常有用。子类化比较容易实现,因为只需写一个窗口函数

VC中实现窗口子类化:

VC基于SDK编程的窗口子类化的基本步骤如下:

正常创建原始窗口,得到窗口的句柄。

调用GetWindowLong得到原来的窗口函数OldWndProc

调用SetWindowLong设置新的窗口函数NewWndProc

新的窗口函数的代码如下所示:

LRESULT NewWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)

{

            if(msg==WM_USER+N)

            {

            }

            return CallWindowProc(OldWndProc,hwnd,msg,wParam,lParam);

}

注意:调用旧的窗口函数时,不能直接用OldWndProc(....),必须CallWndProc,否则出现堆栈错误;

 

窗口子类化允许你接管被子类化的窗口,使你对它有绝对的控制权

子类化并不局限于控件,可以子类化任意窗口,现在我们把精力集中于如何子类化一个窗口上,让我们想想Windows如何知道button控件的窗口处理函数放在哪里,

通过WNDCLASSEX 成员 lpfnWndProc指出了窗口函数地址,如果能用自己编写的窗口函数地址来替换这个成员变量,那Windows不就把消息发到自定义窗口函数了么,通过调用SetWindowLong来实现。工作还是比较简单的:写一个窗口函数用于处理发给button控件的消息,用参数GWL_WNDPROC调用SetWindowLong,如果调用成功就返回与调用功能相联系的一个32位整数。注意:有一些不处理的消息,需要派遣给原来的窗口函数来处理。

在创建了button控件后,通过调用SetWindowLong把原来的窗口函数地址替换为自定义函数的地址,从而对它实施了窗口子类化,要注意为了调用函数CallWindowproc,我们存储了原窗口函数地址,自己编写的hBmpButtonProc仅仅是个普通的窗口函数,当然也可以调用一次SetWindowLong来储存这个32位值

原创粉丝点击