一个简单问题:PreSubclassWindow与PreCreateWindow有何区别???

ZengYongChun 2001-07-21 11:27:21
...全文
386 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
ZengYongChun 2001-07-21
谢谢你的回答:子类化一个窗口是合意思???
回复
MSVCer 2001-07-21
PreSubclassWindow在子类化一个窗口时被调用
PreCreateWindow当然是建立一个窗口之前被调用了
回复
wangfeng 2001-07-21
学习学习!
回复
admireO 2001-07-21
不错不错,那请问,子类化和自己注册一个新的窗口类,有什么区别?
回复
spdia 2001-07-21
前面已提及,每个窗口都有一个在它的窗口类中定义的窗口进程。该窗口进程处理每个
发送到该窗口的消息。一个W M _ PA I N T 消息告诉窗口进程绘制窗口;一个W M _ D E S T R O Y 消息告诉窗口进程销毁该窗口。如果想自己编写窗口进程,修改它的行为是没有问题的。要绘制不同的窗口,只要改变W M _ PA I N T 处理函数。但是,如果该窗口进程属于别人,则将没有源代码进行修改。例如,应用程序中的每个按钮,都是由系统提供的B O T TO N 窗口类创建的,它有完全属于它自己的窗口进程。如果想改变该窗口的外观,则不能通过改变它的
W M _ PA I N T 处理函数来实现,因为它是不可得的。
因此,怎样才能改变按钮的外观,而无需重新编写原来的控件呢?只要用自己的窗口进
程的地址,替换窗口对象的初始窗口进程的地址即可。通过这样处理,用户不必写原来的窗
口进程,因为只需处理那些想用自己的窗口进程处理的消息,任何不想处理的消息可以发送
到最初的窗口进程。例如,可以截获W M _ PA I N T 消息,并直接传输W M _ D E S T R O Y 到初始窗口进程。甚至可以让W M _ PA I N T 消息先通过,并且当初始窗口进程返回时,可以为初始窗口进程添加任何附加的绘图功能。
改变一个已经建立的窗口对象中的窗口进程的地址叫做“子分类”。
在一个窗口类创建任何窗口之前,改变窗口类中的窗口进程的地址叫做“超分类”。
超分类与子分类相比,其优越性在于它允许处理W M _ N C C R E AT E 消息。如果用子分类,
则这些消息是不可用的。因为子分类包括修改一个窗口,而该窗口已经处理W M _ N C C R E AT E消息(该消息已经被建立)。然而,实际上超分类是很少使用的。使用超分类,必须为需要创建
的每种窗口类型创建一个新的窗口类,并且不能改变一个已有窗口的特性。如果需要用
W M _ N C C R E AT E 消息来改变创建窗口的方式,则以隐藏方式创建窗口并在创建后改变它。
可以用C W n d 的S u b c l a s s Window( )子分类一个窗口。首先,把需要子分类的窗口的句柄传给S u b c l a s s Window( );然后,S u b c l a s s Window( )将类的窗口进程的地址放入该窗口。用户可以截获和处理从类的成员函数发送到该窗口的任何消息。任何遗漏的消息发送到初始的窗口
进程。
回复
dsli 2001-07-21
收益非浅
回复
spdia 2001-07-21
每个窗口都有一个在它的窗口类中定义的窗口进程。该窗口进程处理每个
发送到该窗口的消息。一个W M _ PA I N T 消息告诉窗口进程绘制窗口;一个W M _ D E S T R O Y 消
息告诉窗口进程销毁该窗口。如果想自己编写窗口进程,修改它的行为是没有问题的。要绘
制不同的窗口,只要改变W M _ PA I N T 处理函数。但是,如果该窗口进程属于别人,则将没有
源代码进行修改。例如,应用程序中的每个按钮,都是由系统提供的B O T TO N 窗口类创建的,
它有完全属于它自己的窗口进程。如果想改变该窗口的外观,则不能通过改变它的
W M _ PA I N T 处理函数来实现,因为它是不可得的。
因此,怎样才能改变按钮的外观,而无需重新编写原来的控件呢?只要用自己的窗口进
程的地址,替换窗口对象的初始窗口进程的地址即可。通过这样处理,用户不必写原来的窗
口进程,因为只需处理那些想用自己的窗口进程处理的消息,任何不想处理的消息可以发送
到最初的窗口进程。例如,可以截获W M _ PA I N T 消息,并直接传输W M _ D E S T R O Y 到初始窗
口进程。甚至可以让W M _ PA I N T 消息先通过,并且当初始窗口进程返回时,可以为初始窗口
进程添加任何附加的绘图功能。
改变一个已经建立的窗口对象中的窗口进程的地址叫做“子分类”,即子类化
在一个窗口类创建任何窗口之前,改变窗口类中的窗口进程的地址叫做“超分类”。
超分类与子分类相比,其优越性在于它允许处理W M _ N C C R E AT E 消息。如果用子分类,
则这些消息是不可用的。因为子分类包括修改一个窗口,而该窗口已经处理W M _ N C C R E AT E
消息(该消息已经被建立)。然而,实际上超分类是很少使用的。使用超分类,必须为需要创建
的每种窗口类型创建一个新的窗口类,并且不能改变一个已有窗口的特性。如果需要用
W M _ N C C R E AT E 消息来改变创建窗口的方式,则以隐藏方式创建窗口并在创建后改变它。可以用C W n d 的S u b c l a s s Window( )子分类一个窗口。首先,把需要子分类的窗口的句柄传
给S u b c l a s s Window( );然后,S u b c l a s s Window( )将类的窗口进程的地址放入该窗口。用户可
以截获和处理从类的成员函数发送到该窗口的任何消息。任何遗漏的消息发送到初始的窗口
进程。
回复
nustchen 2001-07-21
子类化其实就是用你的类来接管控件的消息
回复
ZengYongChun 2001-07-21
高手请帮我解释一下,可否??
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2001-07-21 11:27
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……