自己编程模拟 MouseEnter,MouseExit 事件

 

自己编程模拟 MouseEnter,MouseExit 事件

 

很多第三方的控件都提供的 MouseEnter 和 MouseExit 事件来补充 MouseMove 事件的不足(MouseMove 事件不能有效的捕获鼠标是否已在控件外),但是这些控件或要注册,或集合了其他实际没有什么作用控件,另外在程序中加入太多的控件也会影响程序的性能,利用 Windows 的 API 函数,我们可以在 MouseMove 中模拟 MouseEnter 和 MouseExit,虽然我提供的源代码中没有真正的这两个事件,但的确提供了这两个事件所具备的功能。好了!让我们实现吧。

首先加载一个模块,在模块中声明以下两个 API 函数:

Public Declare Function SetCapture Lib "user32" _
  (ByVal hwnd As Long) As Long
Public Declare Function ReleaseCapture Lib "user32" () As Long

SetCapture 的功能是:设置鼠标捕获指定的窗口(Windows 每个控件都是一个窗口。比如桌面上显示的图标就是一个窗口,其实是两个,另一个显示描述这个图标的文本),系统将收到这个窗口所有的鼠标移动或击按的所有信息。

ReleaseCapture 的功能是:取消捕获鼠标信息。

Windows 系统就是一个消息系统,系统一直在等待用户的消息,并加一相应,但处理完一个消息后,系统有处以下一轮的等待。消息传递是 Windows 的核心。

让我们在 Form1 中放置一个按钮或其他控件,但此控件必须具有窗口句柄(hWnd),比如 VB 提供的 Image 控件是一个次图形控件,没有窗口句柄,而 Picture,Command Button 等控件就有窗口句柄,我们就拿 Command Button 来作示范,在 Form1 上放置一个 Command Button,在 Command1_MouseMove()事件内加入以下代码:

Private Sub Command1_MouseMove(Button As Integer, _
  Shift As Integer, X As Single, Y As Single)
  With Command1

       '当鼠标在越出控件外
    If Not ((X < 0) Or (Y < 0) Or _
      (X > .Width) Or (Y > .Height)) Then

            '鼠标指针在按钮外时,让其他控件也收到标事件
      ReleaseCapture

            '为了不让 MouseMove 事件反复触发
      If .Caption <> "outside" Then
        .Caption = "outside"
      End If

           '鼠标指针在按钮上,捕获他但鼠标移出是我们将收到鼠标事件
      SetCapture .hwnd

    Else
      .Caption = "inside"
    End If
  End With
End Sub

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

书名:《Visual Basic开发实战1200例(第I卷)》(清华大学出版社.孙秀梅.巩建华) PDF格式扫描版,全书分为6篇20章,共874页。2011年1月出版。 全书压缩打包成2部分,这是第2部分。 注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介   《Visual Basic开发实战1200例》分为I、II两卷共计1200个例子,包括了开发中各个方面最常用的实例,是目前市场上实例最全面的开发类图书;书中实例来源于多位工程师的多年积累,具有很强的实用性。 本书是第I卷,本书以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Visual Basic进行程序开发各个方面的知识和技巧。主要包括基础知识、窗体界面设计、控件应用等。全书分6篇20章,共计600个实例。每个实例都是经过笔者精心筛选的,具有很强的实用性,其中一些实例是开发人员难于寻觅的解决方案。   本书适合Visual Basic的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合Visual Basic程序员参考、查阅。 目 录 第1篇 编程基础篇 第1章 初识Visual Basic 1.1 Visual Basic 6.0的环境配置 实例001 启动VB 实例002 设置工程属性 实例003 定制工具栏 实例004 窗体的布局 实例005 对齐控件 实例006 在工程中查找文本 实例007 定制编程环境 1.2 VB应用程序的开发步骤 实例008 创建或打开新工程 实例009 建立并设计用户界面 实例010 添加程序代码 实例011 运行调试程序 实例012 保存程序并生成可执行文件 1.3 控件注册和对象引用 实例013 添加ActiveX控件 实例014 引用对象 实例015 添加第三方控件 实例016 加载和使用API阅览器 实例017 定制模板库 1.4 趣味程序 实例018 神秘的心理测试 第2章 语言基础 2.1 变量和常量 实例019 局部变量制作计数器 实例020 使用公用变量记录当前登录用户 实例021 使用自定义常量计算圆的面积 2.2 运算符与表达式 实例022 计算加权平均值 实例023 金额大小写转换 2.3 常用的函数与语句 实例024 大小写转换 实例025 程序立即退出 实例026 数字与字符串的转换 实例027 文本字数统计 实例028 一封家书 2.4 条件语句 实例029 使用If语句判断成绩优良 实例030 大了小了猜想 实例031 判断输入的是字母还是数字 实例032 使用Select Case语句判断成绩优良 实例033 制作简单计算器 实例034 测试十二生肖运势 2.5 循环与跳转语句 实例035 防止无限循环 实例036 0到100的累加 实例037 谁最大,谁最小 实例038 漂亮的星星 实例039 完数判断 2.6 对象与数据结构 实例040 将文本控件加入到集合中 实例041 创建包括12个月份的枚举类型 实例042 利用Object变量传递参数 实例043 有效使用Me关键字 实例044 利用CallByName函数对对象进行操作 实例045 打印住宿登记 第3章 数组与指针 3.1 数组的引用与算法 实例046 如何获取数组上限和下限 实例047 如何在数组中插入数组元素 实例048 如何删除数组元素 实例049 利用数组实现矩阵转换 实例050 对数组进行二分查找 3.2 数组的应用 实例051 利用数组统计文字段落数 实例052 利用数组随机抽取幸运观众 实例053 利用二维数组向MSFlexGrid表格添加数据 实例054 利用数组设置MSFlexGrid的表头和列宽 实例055 幼儿识字卡片 实例056 Visual Basic内嵌汇编语言 实例057 在Visual Basic 6.0中实现栈 3.3 控件数组 实例058 动态添加或删除控件 实例059 利用控件数组录入数据 实例060 利用控件数组设置控件状态 实例061 如何声明控件变量数组 3.4 指针地址获取 实例062 如何获取对象实例私有域的地址 实例063 获取字符串第一个字的地址 实例064 获取变量的地址 实例065 获取数组的地址 实例066 获取自定义过程地址 3.5 地址调用 实例067 传递对象指针 实例068 传递字符串指针 实例069 传递变量指针 实例070 利用地址偏移访问内存 3.6 指针综合应用 实例071 利用安全数组借用内存的方法 实例072 利用指针实现数组的插入 实例073 利用指针实现数组的拆分 实例074 利用指针过滤数组重复数据 实例075 使
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值