<2024年3月>
252627282912
3456789
10111213141516
17181920212223
24252627282930
31123456

统计

  • 随笔 - 44
  • 文章 - 0
  • 评论 - 86
  • 引用 - 0

常用链接

留言簿(6)

随笔分类(31)

随笔档案(44)

Mining

最新随笔

搜索

  •  

最新评论

阅读排行榜

评论排行榜

窗口的子类化与超类化

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


posted on 2007-08-24 18:58 泡泡牛 阅读(6788) 评论(7)  编辑 收藏 引用 所属分类: Develop

评论

# re: 窗口的子类化与超类化 2008-06-13 11:31 张明

我看完关闭,特再来发言,
这是我见过的在这个问题上,描述得如些清楚的文章,
谢谢了。
  回复  更多评论    

# re: 窗口的子类化与超类化 2008-08-20 09:40 OXCC

讲得很清楚,

非常感谢。
  回复  更多评论    

# re: 窗口的子类化与超类化[未登录] 2008-09-26 15:13 a

WIN32 windows 的思想相当超前,其实就是面向对象的C,
只不过根对象都是HWND,,
  回复  更多评论    

# re: 窗口的子类化与超类化 2011-06-09 15:47 FFDAF

现在有个疑问,感觉子类化,这个词用得让人疑惑。为什么叫子类化呢?有思考过么?
  回复  更多评论    

# re: 窗口的子类化与超类化 2011-06-09 15:58 FFDAF

还有,超类化 这个词就更让你迷茫了,微软至少没有类似SubClass这样的词,我想我要总结并更改成可理解的中文术语。
  回复  更多评论    

# re: 窗口的子类化与超类化 2011-06-09 16:22 FFDAF

另外,凡是子类化可实现的,超类化都可实现
这一句我看到很多次了,才发现是矛盾的。 (如对话框上的按钮就不能进行超类化) 这一句已经说明了,不是么?
或许应该是反过来,待思考。
  回复  更多评论    

# re: 窗口的子类化与超类化 2013-10-23 09:27 贾可

@FFDAF
Subclass 和 Superclass 不就是微软提出的吗
  回复  更多评论    

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