窗口的子类化与超类化

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) 感觉具体没有必要区分这些, 实现功能就行了, 呵呵 

时间: 2024-09-28 19:20:22

窗口的子类化与超类化的相关文章

眼见为实(2):介绍Windows的窗口、消息、子类化和超类化

眼见为实(2):介绍Windows的窗口.消息.子类化和超类化 这篇文章本来只是想介绍一下子类化和超类化这两个比较"生僻"的名词.为了叙述的完整性而讨论了Windows的窗口和消息,也简要讨论了进程和线程.子类化(Subclassing)和超类化(Superclassing)是伴随Windows窗口机制而产生的两个复用代码的方法.不要把"子类化.超类化"与面向对象语言中的派生类.基类混淆起来."子类化.超类化"中的"类"是指W

C++ 中超类化和子类化及他们的区别

C++ 中超类化和子类化 超类化和子类化没有具体的代码,其实是一种编程技巧,在MFC和WTL中可以有不同的实现方法. 窗口子类化: 原理就是改变一个已创建窗口类的窗口过程函数.通过截获已创建窗口的消息,从而实现监视或修改已创建窗口类的行为属性.可以用来改变或者扩展一个已存在的窗口的行为,而不用重新开发.比如要获得那些预定义控件窗口类(按钮控件.编辑控件.列表控件.下 拉列表控件.静态控件和滚动条控件)的功能而又要修改它们的某些行为. 子类化的优点主要体现在以下两个方面:首先,它不需要创建新的窗口

汇编教程之超类化

在这一讲我们将学习什么是超类化以及它有什么作用:同时你还会学到怎样在自己的窗口中用Tab键在控件中切换这一技巧. 理论: 在你的程序生涯中你肯定遇到过这样的情况,你需要一系列的控件,但它们之间却只有一点点的不同.例如,你可能需要10个只接受数字的 Edit 控件,当然你可以通过多种方法来达到这个目的. 创建自己的类并用它实例化为那些控件 创建那些 Edit 控件并把它们全部子类化 超类化Edit 控件 第一种方法太乏味了,因为你必须自己实现Edit 控件的每个功能,但这项工作不是轻松就能完成的.

[技术学习]浅谈MFC中超类化技术的实现 .

自 Panr 的 Blog // 关键词:// 面对对象编程.超类化.子类化.Superclassing// MFC.CWnd::SubclassWindow// 通用控件.CMNCTRL//// 主题:// 通过CWnd::SubclassWindow 函数的分析,浅谈MFC中超类化技术的实现////// 背景// 我在2002-12月见了mahongxi (烤鸡翅膀)(色摸)在CSDN上的一个帖// 介绍了MFC中窗体的超类化的概念,以下是对我个人回贴的总结//// 日志// 修改:Panr

专访阿里云闵万里:云上逐鹿,ET大脑要做行业化、垂直化的创新运用

2017杭州云栖大会详情请戳这里! 闵万里,阿里云人工智能科学家,ET大脑负责人.2004年博士毕业以后加入IBM,参与IBM智慧城市研究,主攻大数据的研发和运用,2010-2012年在IBM新加坡做智慧城市,推动创新项目落地.2012年加入Google,担任数据科学家,做广告竞价的竞价模型.2013年9月加入阿里巴巴,组建了数据科学团队,支持聚划算和天猫做数据化运营.2015年加入阿里云,组建大数据孵化器团队,探索DT技术在垂直行业的创新及落地.2017年开始担任阿里云大数据事业部的总经理继续

移动界面扁平化设计:扁平化的设计理念

文章描述:总而言之,拟物化有拟物化的优点,扁平化有扁平化的长处,只有两者相结合,才能使易用性与简洁性得到更好的体现. 如果UI 界面使用了拟物化的风格,看起来跟生活实物一模一样,你一定会有按下去的欲望;而扁平化思想是一种让设计者在界面设计过程中减少信息层级的思想 当下 UI 设计的扁平化浪潮可谓如日中天,从微软的 Windows 8 开始,还有后来 Google 的 Android,到现在的苹果 iPhone 的 iOS,都采用了扁平化的设计理念.可是,你真的理解什么是扁平化吗?这不禁要画上一个

devexpress-DevExpress怎么汉化 求汉化包跟汉化方法 步骤

问题描述 DevExpress怎么汉化 求汉化包跟汉化方法 步骤 DevExpress怎么汉化 求汉化包跟汉化方法 步骤................................

信息化DIY成潮 管理软件迷你化和工具化

问题描述 信息技术和网络技术的发展加速了企业信息化建设的步伐,越来越多的企业依托信息化建设来加强内控,实现自己的业务管理.信息化建设让企业由原来高投入.高消耗.低效率转变成了现在的高效率.高收益.低投入.同时信息化建设也和企业业务融为一体,互相促进共同发展.也正因此,管理软件作为企业信息化建设的常规工具之一越来越多的为企业所用.而在标准管理软件的应用过程中,越来越的企业发现:随着企业规模的壮大.业务的发展,标准的管理软件已经很难满足企业的多样化.个性化.广范围的需求.这不仅是企业面临的困境,对于

未来共享拼车服务或许会向垂直化、场景化的方向发展

摘要: 看到Bandwagon之后,我在想未来共享拼车服务或许会向垂直化.场景化的方向发展. Bandwagon是个很有意思的拼车产品,它并不倡导用户在平日里泛泛地把寻找愿意和自己一块搭车的人,而 看到Bandwagon之后,我在想未来共享拼车服务或许会向垂直化.场景化的方向发展. Bandwagon是个很有意思的拼车产品,它并不倡导用户在平日里泛泛地把寻找愿意和自己一块搭车的人,而是选择了一个很刚需的场景--我们通常在大型的活动.会议散场之后,都会排一个长长的队列等待的士,如果是深夜这个等待就