欢迎来到天天文库
浏览记录
ID:61022593
大小:30.50 KB
页数:6页
时间:2021-01-20
《windows sdk编程系列文章17 ---- 窗口子类化.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、windowssdk编程系列文章----窗口子类化2008-04-1623:49在这一讲,我们将学习什么是窗口子类化和怎样按你所想要的方式方便地使用它。理论:如果你曾经在Windows环境下编过程序,有时候就会发现:有一个现成的窗口,几乎有你所需要的全部功能,但还不完全一样(否则就没有必要讲这一节了)。你曾遇到过这样的处境吗,如果你需要一个具有过滤特殊字符功能的Edit控件。当然最直接的方法就是自己用代码来实现,但这的确是一个费时又很困难的任务,而窗口子类化就可以用来做这种事情。窗口子类化允许你接管被子类化
2、的窗口,使你对它有绝对的控制权。举个例子了来阐明一下:例如你需要一个只接受十六进制数字输入的文本编辑框,如果使用一个简单的Edit控件,当用户输入十六进制以外的字符时,你既不知道也无计可施。也就是说,当用户进文本框中输入字符串"zb+q*"时,如果除了拒绝接受整个字符串以外几乎什么也不能做,至少这显得特别不专业。重要的是,你需要具有输入检测的能力,即每当用户输入一个字符到编辑框中时要能检测这个字符。现在来解释实现细节:当用户往文本框中输入字符时,Windows会给Edit控件的窗口函数发送WM_CHAR消息
3、。这个窗口函数本身寄生于Windows中,因此不能直接修改它。但是我们可以重定向这个消息使之发送到我们自己编写的窗口处理函数。如果自定义窗口要处理这个消息那就可以处理它,如果不处理就可以把这个消息转发到它原来窗口处理函数。通过这种方式,自定义的窗口处理函数就把它自己插入到Windows系统和Edit控件之间。看下面的流程:窗口子类化之前Windows==>Edit控件的窗口处理函数。子类化之后Windows==>自定义的窗口处理函数==>Edit控件的窗口处理函数。注意子类化并不局限于控件,可以子类化任何窗
4、口,现在我们要把精力集中到怎样实现子类化一个窗口上。让我们想想Windows怎样知道Edit控件的窗口处理函数放在什么地方。猜的?…肯定不是。原来WNDCLASSEX结构的成员lpfnWndProc指出了窗口函数地址。如果能用自己编写的窗口函数的地址来替换这个成员变量,那Windows不就把消息发到自定义的窗口函数了吗!我们通过调用函数SetWindowLong来实现这个任务,此函数的原型为:LONGSetWindowLong(HWNDhWnd, intnIndex, LONGdwNewLong
5、);·hWnd=将要实施子类化的窗口的句柄·nIndex=函数了功能索引·GWL_EXSTYLE设置窗口的扩展风格.·GWL_STYLE设置新的窗口风格·GWL_WNDPROC设置新的窗口处理函数地址·GWL_HINSTANCE设置新的应用程序句柄·GWL_ID设置新的窗口标识·GWL_USERDATA设置一个与这个窗口相关的给用户使用的32位的数据·dwNewLong=用来更新的数据我们的工作还是比较简单的:1.写一个窗口函数用于处理发给Edit控件的消息。2.用参数GWL_WNDPROC调用SetWin
6、dowLong函数,如果调用成功那么返回值就是与调用功能相联系的一个32位的整数在我们的程序中,返回值就是原先窗口函数的地址。我们要保存这个值以便以后使用。记住:有一些我们不处理的消息,需要把它们派遣给原来的窗口函数来处理,这就用到另外一个函数CallWindowProc,函数原型为:LRESULTCallWindowProc(WNDPROClpPrevWndFunc, HWNDhWnd, UINTMsg,
7、 WPARAMwParam, LPARAMlParam);lpPrevWndFunc=窗口原来函数的地址.剩下的四个参数就是发给自定义函数的参数,直接把它们传给函数CallWindowProc就行了。例子:见光盘FirstWindow18#include"Windows.h"#include"tchar.h"#include"commctrl.h"#pragmacomment(lib,"comctl32.lib")TCHARClassName[]=_T("SubclassWinClass");TC
8、HARAppName[]=_T("SubclassingDemo");TCHAREditClass[]=_T("EDIT");TCHARMessage[]=_T("YoupressedtheEnterkeyinthetextbox!");HINSTANCEg_hInstance;HWNDhwndEdit;WNDPROCOldWndProc;INT_PTRCALLBACKEditWndProc(HWNDhWnd,U
此文档下载收益归作者所有