旅途

如果想飞得高,就该把地平线忘掉

超类化

windows界面编程最基本的元素就是“窗口”,一个窗口的产生一般要经过填写窗口类结构,对窗口类注册,和创建窗口,最终显示出来给用户见到。大概代码如下:
 
//填写窗口类结构
WNDCLASS wcWin;
wcWind.lpfnWndProc = (WNDPROC)WndProc; //窗口消息处理
...
wcWind.lpszClassName = "winClassName"; //窗口类的名字
 
//注册窗口
RegisterClass(&wcWin);
 
//创建窗口
HWND hWnd = CreateWindow("winClassName", "my window", ...);
 
在WTL中,对windows的一套窗口机制提供了面向对象的封装,有着完善的windows界面架构,对一些常用的API,控件等等都做了封装,而且自己也可以继承性的在此基础上二次开发。所以在实际的编程中,可以省去不少的工作量。越扯越远了,ft。
 
在WTL/ATL中,提供了DECLARE_WND_CLASS, DECLARE_WND_CLASS_EX, or DECLARE_WND_SUPERCLASS 这三个宏来实现窗口类结构的填写,其中DECLARE_WND_SUP
ERCLASS 在msdn中的介绍是 :CWndClassInfo registers information for a window class that is based on an existing class but uses a different window procedure. This technique is called superclassing. 这段话大意就是讲 “可以基于一个已经存在的窗口类,但是使用一个不同的消息处理函数,去生成一个新的窗口类——这种技术就称为超类化” ,这个超类化的特点就是:
1,已经存在一个注册的窗口类A。(注意,此窗口类有自己的消息处理函数)
2,创建一个新的窗口类B,但是是以上面的A为基础(即窗口类的名字相同等)。
3,可以写个新的消息处理模块做为B的消息处理,此时窗口A的所有消息就被这个新的消息处理所截取了。
 
由上可知,在程序中使用超类,可以截取某个窗口创建之初的所有消息,从而可以达到一些目的,嘿嘿~
 
一个例子(设想):
API的MessageBox非常好用,调用很简单,但是如果想要对它的弹出位置等进行修改的话,确不容易,因为这个调用不会返回句柄,也没有消息可以获取,如果真要修改它弹出的默认位置的话,大概有下面几种办法:
1,自己写一个messagebox,要考虑到那么多的情况,写出来也不是很方便啊。
2,可以在调用MessageBox之前设置一个timer,在timer中不断FindWindow这个messagebox,找到后就可以得到句柄,从而就可以SetWindowPos改表位置了。
3,可以使用HOOK技术,截了messagebox的WN_INITDIALOG消息,在消息处理中就可以。。。
4,使用“超类化”!过程为:在本实例中找一个已知类名(可以用spy++先看MessageBox的类名)的MessageBox窗口类,找到后将此类 的信息赋给一个新的窗口类,将一个新的窗口消息处理过程赋给它,然后注册新窗口类,注册成功后,当这个MessageBox要被创建出来后发的消息就都自 己的新消息处理函数所截获了,在消息处理函数中就可以想怎么样就怎么样了。

 

posted on 2007-07-18 00:14 旅途 阅读(425) 评论(0)  编辑 收藏 引用 所属分类: 深入windows


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理