窗口的子类化与超类化

简介: 1. 子类化 改变一个已经存在的窗口实例的性质:消息处理与其他实例属性。在SDK编程范畴内,子类化就是改变一个窗口实例的窗口函数(通过GetWindowLong()和SetWindowLong()),子类化所要做的就是为某窗口实例编写新的窗口函数。

1. 子类化 
改变一个已经存在的窗口实例的性质:消息处理与其他实例属性。
在SDK编程范畴内,子类化就是改变一个窗口实例的窗口函数(通过GetWindowLong()和SetWindowLong()),子类化所要做的就是为某窗口实例编写新的窗口函数。其操作是在实例级别上进行的。
在MFC中子类化的情况有所不同:所有MFC窗口有相同的窗口函数,由该窗口函数根据窗口句柄查找窗口实例,在把消息映射到该窗口类(class)得消息处理函数上。为了利用MFC的消息映射机制,不宜改变窗口函数(名),MFC也把子类化封装在函数SubclassWindow()中。但子类化的本质没有变:在实例级别影响窗口的消息及其处理。例:
Class  B :public A 

  ……
}
A  a; 
B  b; 
HWND ha=a.GetSafeHwnd();
b.SubclassWindow(ha); #当然A 和B 不一定是继承关系。
注意:在被子类化的窗口销毁之前,必须执行窗口的反子类化: 
b.UnSubclassWindow(); 


2 超类化
窗口超类化是在窗口类——WNDCLASS或WNDCLASSEX(非MFC类概念)级别进行的改变窗口类特征的
使用过程:首先获得一个已存在的窗口类,然后设置窗口类,最后注册该窗口类。
例:
WNDCLASSEX  wc; 
wc.cbSize=sizeof(wc); //Windows用来进行版本检查的,与窗口特征无关 
GetClassInfoEx(hinst,”XXXXXX”,&wc);
 // hinst—定义窗口类XXXXXX的模块的句柄,如为系统定义的窗口类(如:EDIT、BUTTON)则hinst=NULL.。 
wc.lpszClassName = “YYYYYYY”;//必须改变窗口类的名字 
wc.hbrBackGround = CreateSolidBrush(RGB(0,0.0));//改变背景刷 
wc.lpfnWndProc = NewWndProc;//改变窗口函数 
……
RegisterClassEx(&wc);// 注册新窗口类 
//使用窗口类 
……
::CreateWindow(_T(“YYYYYYYY”,……);

故超类化只能改变自己创建的窗口的特征,而不能用于由Windows创建的窗口(如对话框上的按钮就不能进行超类化) 。而子类化是实例级别上的,只要能获得窗口的实例,就可对其子类化,这是唯一的子类化对于超类化的优势。另外,凡是子类化可实现的,超类化都可实现,不过超类化用起来较麻烦。


3. 总结

(0) 子类化修改窗口过程函数,  超类化修改窗口类(新的窗口类名)
(1) 子类化是在窗口实例级别上的,超类化是在窗口类(WNDCLASS)级别上的。 
(2) 超类化可以完成比子类化更复杂的功能,在SDK范畴上,可以认为子类化是超类化的子集。 
(3) 子类化只能改变窗口创建后的性质,对于窗口创建期间无能为力(无法截获ON_CREATE 事件),而超类化可以实现;超类化不能用于Windows创建的窗口,子类化可以。 


4. 其他
在 眼见为实(2):介绍Windows的窗口、消息、子类化和超类化 这里有一个例子.. 
可以得出结论
a) 子类化的classname 是不会变化的, 而超类化使用新注册classname
b) 子类化 & 超类化 描述的是一个动作 和实现方法没什么关系..... 主要是子类化是SubclassWindow, SubclassDlgItem, 而超类化是RegisterClassEx(&newwindowclass)
c) 感觉具体没有必要区分这些, 实现功能就行了, 呵呵 

目录
相关文章
|
10月前
|
机器学习/深度学习 存储 大数据
在大数据时代,高维数据处理成为难题,主成分分析(PCA)作为一种有效的数据降维技术,通过线性变换将数据投影到新的坐标系
在大数据时代,高维数据处理成为难题,主成分分析(PCA)作为一种有效的数据降维技术,通过线性变换将数据投影到新的坐标系,保留最大方差信息,实现数据压缩、去噪及可视化。本文详解PCA原理、步骤及其Python实现,探讨其在图像压缩、特征提取等领域的应用,并指出使用时的注意事项,旨在帮助读者掌握这一强大工具。
569 4
|
11月前
|
存储 监控 API
史上最全最完整,最详细,软件保护技术-程序脱壳篇-逆向工程学习记录(二)
本文详细介绍了软件保护技术中的程序脱壳过程,包括IAT(导入地址表)的重建、OD(OllyDbg)跟踪输入表、HOOK-API技术以及FSG、UPX和WinUpacx等常见压缩壳的加脱壳方法。文章通过具体实例和详细步骤,帮助读者理解并掌握逆向工程的基本技巧。[原文链接](https://developer.aliyun.com/article/1618653)
276 0
|
11月前
|
SQL 数据采集 安全
扫描工具原理
扫描工具原理
游戏辅助 -- 三种分析角色坐标方法(CE、xdbg、龙龙遍历工具)
游戏辅助 -- 三种分析角色坐标方法(CE、xdbg、龙龙遍历工具)
521 0
|
网络协议 Linux
Cannot assign requested address解决办法
Cannot assign requested address解决办法
|
Java Shell Android开发
Android11 有线网和wifi优先级设置
Android11 有线网和wifi优先级设置
1006 0
|
存储 人工智能 并行计算
计算机架构:漫游CPU的奥秘世界(二)
计算机架构:漫游CPU的奥秘世界
346 0
|
程序员 索引
《操作系统真象还原》——0.9 物理地址、逻辑地址、有效地址、线性地址、虚拟地址的区别
物理地址就是物理内存真正的地址,相当于内存中每个存储单元的门牌号,具有唯一性。不管在什么模式下,不管什么虚拟地址、线性地址,CPU最终都要以物理地址去访问内存,只有物理地址才是内存访问的终点站。
2549 0
|
监控 安全 开发工具
Baumer工业相机堡盟相机如何使用飞拍功能( 飞拍功能的优点和行业应用)
Baumer工业相机堡盟相机如何使用飞拍功能( 飞拍功能的优点和行业应用)
377 0