全站数据
8 4 2 0 5 8 1

什么是窗口子类化

IT工程师 | 简单学习,快乐成才!         
问题更新日期:2024-10-29 23:33:14

问题描述

什么是窗口子类化急求答案,帮忙回答下
精选答案
最佳答案

如果你曾经在 Windows 环境下编过程序,有时候就会发现:有一个现成的窗口,几乎有你所需要的全部功能,但还不完全一样。如果你需要一个具有过滤特殊字符功能的 Edit 控件。当然最直接的方法就是自己用代码来实现,但这的确是一个费时又很困难的任务,而子类化就可以用来做这种事情。子类化允许你接管被子类化的窗口,使你对它有绝对的控制权。举个例子了来阐明一下:例如你需要一个只接受十六进制数字输入的文本编辑框,如果使用一个简单的 Edit控件,当用户输入十六进制以外的字符时,你既不知道也无计可施。也就是说,当用户进文本框中输入字符串

现在来解释实现细节:当用户往文本框中输入字符时,Windows 会给Edit控件的窗口函数发送WM_CHAR 消息。这个窗口函数本身寄生于 Windows 中,因此不能直接修改它。但是我们可以重定向这个消息使之发送到我们自己编写的窗口处理函数。如果自定义窗口要处理这个消息那就可以处理它,如果不处理就可以把这个消息转发到它原来窗口处理函数。通过这种方式,自定义的窗口处理函数就把它自己插入到 Windows 系统和 Edit 控件之间。

说明看下面的流程:

窗口子类化之前

Windows ==Edit控件的窗口处理函数。

子类化之后

Windows ==自定义的窗口处理函数== Edit 控件的窗口处理函数。

那Windows 不就把消息发到自定义的窗口函数了吗! 我们通过调用函数SetWindowLong 来实现这个任务,此函数的原型为:

SetWindowLong PROTOhWnd:DWORD, nIndex:DWORD, dwNewLong:DWORD

hWnd = 将要实施子类化的窗口的句柄 nIndex = 函数了功能索引

GWL_EXSTYLE 设置窗口的扩展风