凡是用VB做相对高深一些的东西的时候,不可避免都会或多或少用到子类技术,我上一篇文章介绍的www.vbaccelerator.com网站,上面关于控件、图形等等几乎都用到了子类技术。
但是如果简单的用几个API来实现子类,那么只要你非正常关闭窗体或者加入中断点调试,不好意思,VB IDE崩溃,所有的一切都要重来。
有没有无崩溃的子类技术呢?我这里目前不光有一种,还有两种:)
第一种,也就是www.vbaccelerator.com网站常用的技术,就是用VB做了一个进程内组件DLL(SSubTmr6.dll),由它实现子类。效果不错,但是需要挂接一个COM组件,有背绿色软件之道,所以这个技术就不介绍了(详细代码,请上vba...网站,上面有源码)。
第二种,其实这是我看 HookMenu源码的心得,是高手的结晶,这里不敢夺爱。HookMenu作者高就高在,用汇编代码实现了窗口消息处理函数,然后编译成二进制码,由VB程序进行调用,这样仅需要在程序中添加一个类(外引用一个该类的接口文件SubclassingSink.tlb),就可以很绿色,并且无崩溃的实现了子类化,由于作者原代码包含内容较多,所以我简化了一下,自己重新封装了一个类,然后又做了一个示例。这样让高端技术平民化,让每一个VB爱好者都会使用。
示例代码如下:
'*************************************************************************
'**模 块 名:frmDemo
'**说 明:Sky Walker(天行者) 版权所有2006 - 2007(C)
'**创 建 人:叶帆
'**日 期:2006-01-02 17:29:24
'**修 改 人:
'**日 期:
'**描 述:窗口子类化示例(无崩溃)
'** :叶帆Blog:http://blog.csdn.net/yefanqiu
'**版 本:V1.0.0
'*************************************************************************
Option Explicit
Implements ISubclassingSink '接口定义 需引用接口文件SubclassingSink.tlb
Private mSubclass As CSubclass '实现类
Private Const WM_SIZE = &H5
Private Const WM_MOUSEWHEEL = &H20A
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205
'*************************************************************************
'**函 数 名:Form_Load
'**输 入:无
'**输 出:无
'**功能描述:初始化子类
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2006-01-02 17:33:02
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub Form_Load()
Set mSubclass = New CSubclass '初始化一个子类
'添加消息 (前截获)
mSubclass.AddBeforeMsgs WM_MOUSEWHEEL, WM_SIZE, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK
'添加消息 (后截获)
mSubclass.AddAfterMsgs WM_MOUSEWHEEL, WM_RBUTTONDOWN, WM_RBUTTONUP
'获取全部的消息
'mSubclass.AllAfterMsgs = True
'mSubclass.AllBeforeMsgs = True
'添加子类
mSubclass.Subclass hWnd, Me
End Sub
'*************************************************************************
'**函 数 名:Form_Unload
'**输 入:Cancel(Integer) -
'**输 出:无
'**功能描述:卸载子类
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2006-01-02 17:35:16
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub Form_Unload(Cancel As Integer)
mSubclass.UnSubclass
End Sub
'*************************************************************************
'**函 数 名:ISubclassingSink_After
'**输 入:lReturn(Long) -
'** :ByVal hwnd(Long) -
'** :ByVal uMsg(Long) -
'** :ByVal wParam(Long) -
'** :ByVal lParam(Long) -
'**输 出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2006-01-02 17:36:40
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub ISubclassingSink_After(lReturn As Long, ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long)
Debug.Print "ISubclassingSink_After " & " - " & Hex(uMsg) & " - " & Timer
End Sub
'*************************************************************************
'**函 数 名:ISubclassingSink_Before
'**输 入:bHandled(Boolean) -
'** :lReturn(Long) -
'** :hwnd(Long) -
'** :uMsg(Long) -
'** :wParam(Long) -
'** :lParam(Long) -
'**输 出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2006-01-02 17:36:41
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Private Sub ISubclassingSink_Before(bHandled As Boolean, lReturn As Long, hWnd As Long, uMsg As Long, wParam As Long, lParam As Long)
Debug.Print "ISubclassingSink_Before " & " - " & Hex(uMsg) & " - " & Timer
'bHandled = True 'ISubclassingSink_After消息不在触发,并且该消息不向原窗体下发
'lReturn=mSubclass.CallOrigWndProc(uMsg, wParam, lParam) '向原窗体发送消息
End Sub
类的代码就不在列举了,请大家看源码
源码下载地址:http://www.sky-walker.com.cn/YeFan/SourceCode/ISubClass.rar
分享到:
相关推荐
用VB进行子类化 是vb高级技巧之一
windows x86系统 dot net VBIDE.DLL包。
C#读取Excel实例 包含各种支持平台 VBIDE.dll
Interop.VBIDE.dll的最新文件,支持C++,C#编程。
VB 子类化重绘ListBox,抛弃原有ListBox难看的风格。
VB IDE滚轮支持插件 该插件装上后让VB开发环境自动增加滚动条,方便开发人员使用。
VB IDE界面使用XP样式 把附件放入VB.EXE同一目录 即可
VB单类模块实现子类化消息拦截源码,通用子类化模块,拦截本进程指定句柄的消息,经网友PctGL修正,代码更精简,执行效率更高。
VB IDE编程环境增强插件Amic For VB(多标签、滚轮、API、自动缩进)。 主要功能: 1、自动收集需要打包控件和动态链接库、 2、自带API字典和快捷生成器、 3、快捷代码记事本、 4、快捷窗体类似控件矩阵生成助手、 5...
为VB IDE添加鼠标滚轮和标签的功能 下载解压后建立一个批处理即可使用 内容 echo --------------------开始 RegSvr32 /S CodeHelp.dll RegSvr32 /S VB6MouseWheel.dll echo --------------------结束
VB源码之友是一款VB IDE插件,是继API浏览器之后,叶帆软件系列家族中又一款VB程序开发辅助软件。
vb实现阅读输入英文vb实现阅读输入英文vb实现阅读输入英文vb实现阅读输入英文vb实现阅读输入英文vb实现阅读输入英文vb实现阅读输入英文vb实现阅读输入英文vb实现阅读输入英文vb实现阅读输入英文vb实现阅读输入英文vb...
大家在使用VB6开发环境的查看引用DLL文件名称和详细路径时候,...该文件名称为VB6IDE.DLL,本站下载后解压缩到 X:\Program Files\Microsoft Visual Studio\VB98, 其中的X为您安装VB的真实路径。该版本为VB6 SP6版本。
VB6.0IDE集成开发工具精简版,最经典最好用的VB开发工具!
子类话VB6自带标准按钮,实现透明。 没账号的同学可以去我的博客下载 http://www.cnblogs.com/imez
对于初学者和需要重拾VB6进行VB或VBA开发的同仁,熟悉VB6IDE编写。
见好多人问怎么更改VB程序的默认图标,自己也看腻了,索性修改了一个传上来,没什么技术含量,有兴趣的就下来看看吧。新图标类似.net的默认图标,白底蓝边,自我感觉挺清爽的。 注: 1. 更改的是编译后程序的默认...
Word的类库,提供对Word的各种读写造作
功能非常强大,非常好用 1、自动收集需要打包控件和动态链接库 2、自带API字典和快捷生成器 3、快捷代码整理 4、代码记事本、鼠标滚轮支持、控制台程序等
讲述在VB高级编程中,子类技术SUBCLASS与消息捕获的工作原理,有实例