- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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?–得到默认的窗口消息处理过程的地址需要的APIPrivate?Declare?Function?GetWindowLong?Lib?user32?Alias?GetWindowLongA?(ByVal?hWnd?As?Long,?ByVal?nIndex?As?Long)?As?Long设置一个新的窗口消息处理过程的地址需要的APIPrivate?Declare?Function?SetWindowLong?Lib?user32?Alias?SetWindowLongA?(ByVal?hWnd?As?Long,?ByVal?nIndex?As?Long,?ByVal?dwNewLong?As?Long)?As?Long给指定的窗口消息处理过程传递消息需要的APIPrivate?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)