`
阿尔萨斯
  • 浏览: 4414573 次
社区版块
存档分类
最新评论

无崩溃(VB IDE)子类技术实现

 
阅读更多

凡是用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.bjjr.com.cn/YeFan/SourceCode/ISubClass.rar




<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
分享到:
评论

相关推荐

    VB编程的好助手.rar_IDE 插件_VB源码_vb api_vb ide

    VB编程的好助手是一款专为Visual Basic (VB) 开发者设计的IDE插件,它极大地增强了VB集成开发环境的功能,提升了编程效率。VB源码之友作为叶帆软件系列的一员,它延续了API浏览器的良好传统,为程序员提供了一系列...

    dot net VBIDE.DLL 包

    3. **VBIDE组件**:VBIDE.DLL是VBA IDE的核心,它包含了编写、编辑和调试VBA代码所需的所有工具,包括代码编辑器、对象浏览器、项目管理器和断点设置等。 4. **x86与x64架构**:x86指的是传统的32位处理器架构,而x...

    用VB进行子类化

    子类化(subclassing)是Windows编程中的一个重要概念和技术,尤其在使用Visual Basic (VB)进行开发时,它允许开发者对现有的窗口类进行扩展或修改其行为。在Windows环境下,所有的图形界面都是基于消息传递的原理来...

    VB IDE滚轮支持插件

    VB IDE(Visual Basic Integrated Development Environment)是微软公司开发的Visual Basic编程语言的集成开发环境,为程序员提供了编写、测试和调试代码的全面平台。在早期版本的VB IDE中,滚轮滚动功能可能并不...

    C#读取Excel实例 包含各种支持平台 VBIDE.dll

    3. **VBIDE.dll**:在C#中直接使用VBIDE.dll是为了访问VBA(Visual Basic for Applications)代码编辑器,这在创建或修改Excel宏时可能会用到。在C#中使用VBIDE需要引用这个DLL,但请注意,这并不是用来读取Excel...

    VB单类模块实现子类化消息拦截源码.rar

    在VB(Visual Basic)编程环境中,子类化是一种常见的技术,它允许我们扩展或修改已有的控件或窗口类的功能,而无需改动其原始代码。这个"VB单类模块实现子类化消息拦截源码"就是一个这样的实例,通过一个单独的模块...

    Interop.VBIDE.dll

    Interop.VBIDE.dll的最新文件,支持C++,C#编程。

    VB IDE增强插件AmicForVB

    **VB IDE增强插件AmicForVB** AmicForVB是一款专为Visual Basic 6 (VB6)开发环境设计的强大插件,它极大地提升了VB IDE的功能性和开发效率。这款插件集成了多种实用工具,旨在简化开发过程,提高代码质量和开发者的...

    VB 子类化重绘ListBox

    子类化(Subclassing)是一种技术,允许开发者扩展或修改已有的控件功能,使其能够支持自定义的重绘操作。本文将详细介绍如何在VB中子类化ListBox控件,并实现自定义的重绘功能,以达到美化界面的目的。 首先,理解...

    VB6中单类模块子类化类,不需要再在标准模块中写消息处理过程了,作者PctGL

    总的来说,PctGL的子类化实现通过内嵌汇编技术提供了一种新的方法,使得在VB6中进行子类化变得更加模块化和高效。这种方法可以改善代码结构,减少标准模块中的混乱,并帮助开发者更好地管理和扩展工程。对于那些熟悉...

    VB IDE 滚轮支持插件

    VB IDE(Visual Basic Integrated Development Environment)是微软开发的一种集成开发环境,主要用于编写VB(Visual Basic)程序。在VB IDE中,开发人员可以进行代码编写、调试、编译和项目管理等任务。然而,原始...

    VB高级编程初探(子类技术SUBCLASS与消息捕获)

    在VB高级编程中,子类技术(SUBCLASS)和消息捕获是两个强大的工具,能够帮助开发者超越VB的固有限制,实现更复杂的系统交互。子类技术涉及到Windows消息处理的底层机制,允许程序员在消息到达目标窗口之前对其进行...

    VB6史无前例的子类化之透明按钮

    在本主题中,“VB6史无前例的子类化之透明按钮”着重讨论如何通过子类化技术使VB6中的标准按钮变得透明,从而实现更个性化的界面设计。 子类化的基本概念是创建一个新类,这个类继承自原有的控件类,然后重写或扩展...

    VB IDE界面使用XP样式

    VB IDE界面使用XP样式 把附件放入VB.EXE同一目录 即可

    vb插件:记录VB6IDE运行出错信息 VB6IDE_DebugMessage_Addin

    VB6IDE_DebugMessage_Addin是一款专为Visual Basic 6(VB6)开发环境设计的插件,其主要功能是帮助开发者记录并管理VB6集成开发环境(IDE)中的错误信息。这款插件对于调试和优化VB6代码尤其有用,因为它能够提供...

    VB6 IDE 默认图标更改版

    见好多人问怎么更改VB程序的默认图标,自己也看腻了,索性修改了一个传上来,没什么技术含量,有兴趣的就下来看看吧。新图标类似.net的默认图标,白底蓝边,自我感觉挺清爽的。 注: 1. 更改的是编译后程序的默认...

    vb6_IDE使用要点.docx

    VB6IDE,即VB6的集成开发环境,是用于编写VB和VBA(Visual Basic for Applications)代码的工具。VB6虽然已被微软停止更新,但它在数据处理、自动化和办公应用集成等领域仍有广泛应用。 安装VB6时,推荐使用原版的...

    修复VB6的IDE在WIN10中的显示异常

    在VB6 IDE中,.dll文件是非常重要的动态链接库,它们包含了各种功能的实现,如组件、服务或接口。vb6ide.dll是VB6 IDE的核心组件之一,负责处理IDE的各种操作。当这个文件出现故障或与系统不兼容时,可能会导致IDE的...

    对VB IDE的一些小改造

    为VB IDE添加鼠标滚轮和标签的功能 下载解压后建立一个批处理即可使用 内容 echo --------------------开始 RegSvr32 /S CodeHelp.dll RegSvr32 /S VB6MouseWheel.dll echo --------------------结束

    Class_Hook.rar_VB hook_hook_hook vb_子类化_钩子 vb

    这里我们将详细讨论VB中的子类化和钩子,以及如何通过内嵌汇编实现这些技术。 子类化(Subclassing)是一种技术,允许我们创建一个新类来扩展或修改已存在的类的功能。在VB中,这通常通过继承已有的控件或窗体类并...

Global site tag (gtag.js) - Google Analytics