CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

什么是子类化?

楼主10water()2003-03-03 09:49:16 在 VC/MFC / 基础类 提问

请各位高手谈谈什么 是子类化,什么 是控件子类化?先谢了。 问题点数:100、回复次数:7Top

1 楼zangyong(晶晶)回复于 2003-03-03 10:38:36 得分 10

就是用自己的窗口替换已有的窗口拉Top

2 楼snollow(坐井观蛙)回复于 2003-03-03 11:18:13 得分 10

Call   this   member   function   to   "dynamically   subclass"   a   window   and   attach   it   to   this   CWnd   object.   When   a   window   is   dynamically   subclassed,   windows   messages   will   route   through   the   CWnd’s   message   map   and   call   message   handlers   in   the   CWnd’s   class   first.   Messages   that   are   passed   to   the   base   class   will   be   passed   to   the   default   message   handler   in   the   window.Top

3 楼anjy(泡泡oοО○)回复于 2003-03-03 11:25:16 得分 70

你看看这个,可能对你有所帮助:  
   
   
  如果你曾经在   Windows   环境下编过程序,有时候就会发现:有一个现成的窗口,几乎有你所需要的全部功能,但还不完全一样(否则就没有必要讲这一节了)。你曾遇到过这样的处境吗,如果你需要一个具有过滤特殊字符功能的   Edit   控件。当然最直接的方法就是自己用代码来实现,但这的确是一个费时又很困难的任务,而窗口子类化就可以用来做这种事情。    
   
  窗口子类化允许你接管被子类化的窗口,使你对它有绝对的控制权。举个例子了来阐明一下:例如你需要一个只接受十六进制数字输入的文本编辑框,如果使用一个简单的   Edit控件,当用户输入十六进制以外的字符时,你既不知道也无计可施。也就是说,当用户进文本框中输入字符串   "zb+q*"   时,如果除了拒绝接受整个字符串以外几乎什么也不能做,至少这显得特别不专业。重要的是,你需要具有输入检测的能力,即每当用户输入一个字符到编辑框中时要能检测这个字符。  
   
  现在来解释实现细节:当用户往文本框中输入字符时,Windows   会给Edit控件的窗口函数发送   WM_CHAR   消息。这个窗口函数本身寄生于   Windows   中,因此不能直接修改它。但是我们可以重定向这个消息使之发送到我们自己编写的窗口处理函数。如果自定义窗口要处理这个消息那就可以处理它,如果不处理就可以把这个消息转发到它原来窗口处理函数。通过这种方式,自定义的窗口处理函数就把它自己插入到   Windows   系统和   Edit   控件之间。  
   
  看下面的流程:    
  窗口子类化之前    
  Windows   ==>Edit   控件的窗口处理函数。    
   
  子类化之后    
  Windows   ==>自定义的窗口处理函数==>   Edit   控件的窗口处理函数。    
   
  注意子类化并不局限于控件,可以子类化任何窗口,现在我们要把精力集中到怎样实现子类化一个窗口上。让我们想想Windows   怎样知道   Edit   控件的窗口处理函数放在什么地方。猜的?…肯定不是。原来   WNDCLASSEX   结构的成员   lpfnWndProc   指出了窗口函数地址。如果能用自己编写的窗口函数的地址来替换这个成员变量,那   Windows   不就把消息发到自定义的窗口函数了吗!   我们通过调用函数SetWindowLong   来实现这个任务,此函数的原型为:    
   
  SetWindowLong   PROTO   hWnd:DWORD,   nIndex:DWORD,   dwNewLong:DWORD  
   
  hWnd   =   将要实施子类化的窗口的句柄    
  nIndex   =   函数了功能索引    
  GWL_EXSTYLE   设置窗口的扩展风格.    
  GWL_STYLE   设置新的窗口风格  
  GWL_WNDPROC   设置新的窗口处理函数地址  
  GWL_HINSTANCE   设置新的应用程序句柄  
  GWL_ID   设置新的窗口标识  
  GWL_USERDATA   设置一个与这个窗口相关的给用户使用的32位的数据    
  dwNewLong   =   用来更新的数据    
  我们的工作还是比较简单的:    
   
  写一个窗口函数用于处理发给   Edit   控件的消息。    
  用参数GWL_WNDPROC调用SetWindowLong   函数,如果调用成功那么返回值就是与调用功能相联系的一个32位的整数    
  在我们的程序中,返回值就是原先窗口函数的地址。我们要保存这个值以便以后使用。   记住:有一些我们不处理的消息,需要把它们派遣给原来的窗口函数来处理,这就用到另外一个函数   CallWindowProc,   函数原型为:  
   
  CallWindowProc   PROTO   lpPrevWndFunc:DWORD,   hWnd:DWORD,   Msg:DWORD,   wParam:DWORD,   lParam:DWORD    
   
  lpPrevWndFunc   =   窗口原来函数的地址.   剩下的四个参数就是发给自定义函数的参数,直接把它们传给函数   CallWindowProc   就行了。  
   
  Top

4 楼ensionhower(阿斌)回复于 2003-03-03 12:37:10 得分 10

子类化SubclassWindow.就是动态的把一个窗口句柄附着到一个CWnd的对象上面,这个窗口的消息就会由这个Cwnd的消息处理函数来处理.Top

5 楼zswzwy(酒是穿肠毒药 @ 色是刮骨钢刀)回复于 2003-03-03 13:01:01 得分 0

派生类Top

6 楼KcSoft(猎鹰魔法)回复于 2003-03-03 13:08:04 得分 0

你的窗口:CYourCWnd   pYour;  
  子类化的窗口   CWnd*   p;  
  p->SubclassWindow(pYour);Top

7 楼lwg7603(刑满释放人员)回复于 2003-03-03 13:13:24 得分 0

本质上就是:  
  WNDPROC   pOldProc   =   (WNDPROC)::SetWindowLong(hWnd,   GWL_WNDPROC,   (LONG)pNewProc);  
  Top

相关问题

  • 什么是“子类化” ,有什么作用呢??
  • 请问什么是消息映射,和子类化?
  • 子类化==超类化?
  • 关于子类化
  • 求助高手~~~~Button子类化的问题~~不知道为什么CallWindowProc()这个函数来是出错呢?
  • comboBox子类化:我这样写,为什么老出错?
  • 什么是C类化了的B类地址?
  • 子类化的问题(vc++)
  • 关于Listbox的子类化
  • 我为自己的按钮写了窗口函数,但是消息没有传进去,为什么?(SDK编程,子类化的问题)

关键词

  • 函数
  • 控件
  • 字符
  • 消息
  • 用户
  • 子类化
  • 处理
  • gwl
  • 自定义
  • 句柄

得分解答快速导航

  • 帖主:10water
  • zangyong
  • snollow
  • anjy
  • ensionhower

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo