VB进行子类化.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
VB进行子类化目录何谓子类化(ubClassing)Visual Basic 6子类化的实现Visual Basic .NET子类化的实现1. 何谓子类化(subclassing)   众所周知,Windows是一个基于消息的系统,消息在Windows的对象之间进行着传递。子类化和Windows的钩子机制存在于消息系统之中,我们可以利用这些机制来操纵、修改甚至丢弃那些在操作系统或是进程中传递的消息,以求改变系统的一些行为。子类化技术用来截取窗口或控件之间的消息,当然是消息在到达目的窗口之前完成的操作。这些被截获的消息既可以保留也可以修改它们的状态,之后就继续发送到目的地。子类化技术实现了一些正常情况下无法实现的功能,试想鼠标右键单击TextBox,系统默认弹出Undo、Cut、Copy、Paste等菜单,我们就可以利用子类化技术来改变这个系统菜单。   简单的说,子类化就是创建一个新的窗口消息处理过程,并将其插入到原先的默认窗口消息处理过程之前。   子类化分为三类:实例子类化(instance subclassing)—从窗口或控件的单一实例截获消息,这种子类化技术最普遍;全局子类化(global subclassing)—能够截获从相同的窗口类创建出来的多个窗口或控件的消息;超类化(superclassing)—和全局子类化很类似,区别在于可以应用在新的窗口类上面。 2. Visual Basic 6子类化的实现   在Visual Basic 6子类化的实现中我将通过一段代码的实例来介绍这一技术在VB6中的应用。现在很多开发社区中经常谈到的一个话题就是界面开发如何Skin,这种技术有很多解决方式,如使用可以贴图的控件或使用第三方开发的换肤ActiveX控件。其实Skin技术需要处理的是WM_DRAWITEM、WM_MEASUREITEM、WM_NCPAINT消息,这些消息的主要用途就是可以重画控件和窗口的非客户区。想要对这些VB6无法处理的消息进行编程就必须用到子类化,这些消息都会被发送到能够自绘的控件的窗口上,因此下面的例子就是利用窗口子类化来重画Button控件。 创建工程  启动Visual Basic 6同时创建一个标准EXE工程。 窗口布局  在FORM1上放置3个Button控件,并将前两个Button的Style属性设置为1-Graphical,因为只有Style属性设置为Graphical的Button才可以Owner-drawn。 ③在窗体中录入代码 Private?Sub?Command3_Click()? 通过Enabled属性的控制,来显示重画控件在Unenabled状态时的效果? If?Command1.Enabled?Then? Command1.Enabled?=?False? Else? Command1.Enabled?=?True? End?If? End?Sub? Private?Sub?Form_Load()? 安装子类化入口? Call?Init(Me.hWnd)? End?Sub? Private?Sub?Form_Unload(Cancel?As?Integer)? 卸载子类化? Call?Terminate(Me.hWnd)? End?Sub ④加入一个模块并录入代码? Option?Explicit ?--?引用Win32Api?– 得到默认的窗口消息处理过程的地址需要的API Private?Declare?Function?GetWindowLong?Lib?user32?Alias?GetWindowLongA?(ByVal?hWnd?As?Long,?ByVal?nIndex?As?Long)?As?Long 设置一个新的窗口消息处理过程的地址需要的API Private?Declare?Function?SetWindowLong?Lib?user32?Alias?SetWindowLongA?(ByVal?hWnd?As?Long,?ByVal?nIndex?As?Long,?ByVal?dwNewLong?As?Long)?As?Long 给指定的窗口消息处理过程传递消息需要的API Private?Declare?Function?CallWindowProc?Lib?user32?Alias?CallWindowProcA?(ByVal?lpPrevWndFunc?As?Long,?ByVal?hWnd?As?Long,?ByVal?Msg?As?Long,?ByVal?wParam?As?Long,?ByVal?lParam?As?Long)?As?Long 内存拷贝 Private?Declare?Sub?CopyMe

文档评论(0)

502992 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档