在VB程序中实现鼠标右键双击_第1页
在VB程序中实现鼠标右键双击_第2页
在VB程序中实现鼠标右键双击_第3页
在VB程序中实现鼠标右键双击_第4页
在VB程序中实现鼠标右键双击_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在 VB 程序中实现鼠标右键双击 在 Microsoft Visual BASIC(VB)中,窗体(Form)和控件(Control)等对象的单击(Click)和双击(Double-Click)事件都是指鼠标左键而言的。鼠标右键的单击和双击事件在 VB 中没有对应的事件驱动过程去响应和处理。但是在实际应用中(特别是一些可视化的图形软件) 可能对鼠标键的功能定义比较丰富,单靠鼠标左键的单击和双击难以满足复杂的需要。因此有必要开发和扩充 VB 应用程序对鼠标右键的响应能力。 VB 定义的鼠标事件 VB 定义的鼠标事件有五种: 单击(Click)、双击(DblClick)、鼠标键按下(MouseDown)、鼠标键松开(MouseUp)和鼠标光标移动(MouseMove)。其中前两种事件单击和双击是专指鼠标左键而言,后三种则适用于所有鼠标键。后三种鼠标事件的事件驱动过程有如下的形式: Sub对象名- 鼠标事件(Button As Integer,Shift As Integer, X As Single, Y As Single) 用户插入的事件响应和处理代码 End Sub 传递给事件过程的参数中,整型数 Button 的最低三位从右到左分别对应鼠标左、右、中三个键。事件发生时,哪个或哪些键处于被按下的状态,Button 的对应位就为 1,否则为 0。程序中可以用 VB 的位运算 AND 来检测鼠标键的状态。整数 Shift 的最低三位从右到左分别对应事件发生时键盘的 Shift、Ctrl 、Alt 键。事件发生时,Shift、Ctrl、Alt 中的哪个或哪些键处于被按下的状态,参数 Shift的对应位就为 1,否则为 0。单精度值 X 和 Y 存放的是事件发生时鼠标光标的 X-Y 坐标值。该值对于窗体对象而言是鼠标光标在窗体客户区中的坐标,对于控件对象则是鼠标光标在窗体客户区中相对于控件左上角的坐标。 鼠标右键事件的检测 实际上,鼠标的单击事件可以被分解为 MouseDown 和MouseUp 两个事件,所以我们可以用 MouseDown 事件来取代单击事件。同样,鼠标双击事件也可以分解为两个非常紧凑的单击事件。根据这一思路,我们可以在 MouseDown 事件过程中判定鼠标右键的单击和双击事件,并作出相应的响应和处理。 1.右键单击的判断和处理 鼠标右键单击事件的判断很简单,只需在 MouseDown 事件过程中检测一个 Button 参数。如下所示: Sub 对象名-MouseDown(Button As Integer,Shift As Integer, X As Single, Y AsSingle) If Button = 2 Then 鼠标右键按下 鼠标右键单击的响应和处理代码 End If End Sub 2.右键双击的判断和处理 Windows 对鼠标双击的定义是:同一鼠标键的两次快速按动-放开。只要两次按键的时间间隔不超过某一阈值,Windows 就作为双击对待,否则认为是两次单击。这一阈值称为 DoubleClickSpeed,它是在 Widnows 启动时从初始化文件 WIN.INI 中读入的。这一阈值在 WIN.INI 文件Windows段的 Dou-bleClickSpeed 项中存放,以毫秒为单位。一般情况下DoubleClickSpeed 值为 452 毫秒,但是也可以在 WIN.INI 中人为地改变这一设定。 为了判断鼠标右键的双击事件,我们需要在程序中读取 WIN.INI 中的 DoubleClick-Speed 值。以后每次鼠标右键按下时,在 Mouse-Down 事件过程中都要读当前的系统时间,并与上次按键的时间比较,看是否超过 Dou-bleClickSpeed 值:如果没超过,则转到双击事件的响应呼处理代码,否则作为单击事件处理。 这里涉及读 WIN.INI 的问题。虽然 WIN.INI 是格式固定的文本文件 ,但是用读文本文件的方法去查找DoubleClickSpeed 还是很麻烦。Windows 系统专门提供了一组函数用于访问 Windows 的初始化文件,这组函数同其它一些函数包含在 Windows 的三个系统动态链接库(DDL)中。在 Windows 的软件开发环境中,一般都提供了访问这些函数的能力,这是通过 Windows 的应用程序接口(API)实现的。Windows API 函数库中包含了几百个功能强大的系统函数,VB 程序可以通过调用 API 函数完成很多 VB 系统本身不提供的功能。 在 VB 中调用 API 函数之前,首先要用 Declare 语句对调用的函数、函数所在的动态链接库、函数的参数和返回类型进行必要的声明。声明格式为: Declare Function API 函数名 Lib“动态链接库名“(形式参数表 ) As 返回类型 为了读取 WIN.INI 文件中某一项的值,我们需要调用 API 函数GetProfileInt,它的声明为 Declare Function GetProfileInt Lib “Kernel“(ByVal lpAppName As String,ByVal lpkeyName As String,ByVal nDefault As Integer)As Integer 其中字符串 lpAppName 为段名,lp-KeyName为项的名字,整型量 nDefault 为该项不存在时返回的缺省值。 因此,以下语句可以读出 Dou-bleClickSpeed 值: DoubleClickSpeed=GetProfileInt(“Windows“,“DoubleClickSpeed“,452) 此外,VB 程序只能读到以秒为单位的时间,精度显然不够。为了读到较为精确(毫秒为单位) 的系统时间,需要求助于另外一个 API 函数:GetTickCount,它返回自 Windows 启动时经过的时间,以毫秒为单位。GetTickCount 的声明如下: Declare Function GetTickCount Lib“User“ () As Long 有了以下的技术准备,就可以在MouseDown 事件过程中判断和处理鼠标右键的双击事件了。 首先,在窗体启动时的加载(Load)事件过程中读取 Windows 系统的双击时间阈值 DoubleClickSpeed。然后对 MouseDown 事件过程编程如下: Dim DoubleClickSpeed As Integer Dim FirstClickTick As Long 前一次鼠标右键按下的时刻 Sub 对象名-MouseDown(Button As Integer,Shift As Integer, X As Single, Y AsSingle) If Button=2 Then 鼠标右键按下 Dim CurrentTick As Long CurrentTick = GetTickCount() 读取当前系统时间 If CurrentTick - FirstClickTick 按钮名.Width Or Y 按钮名.Height Then 鼠标光标移到了按钮以外 tmp = SendMessage(按钮名.hwnd, BM_SETSTATE, 0, 0如果再移回按钮中,按钮再次显示被按下。这就和用鼠标左键做类似动作时的效果完全一样了。 程序示例 以下是一个完整的 VB 程序例子。该程序实现了对鼠标右键双击事件的判断和响应处理,并从功能和外观上都达到了和左键双击一样的效果。程序的界面部分非常简单:一个标准的窗体 Forml 和一个位于窗体正中的标准的命令钮 Command1。运行后,每当用户双击按钮时,程序都发出“嘟“ 的一声。该程序在 Microsoft Visual BASIC 4.0 版下调试通过,Windows 系统用的是 3.2 中文简体版。 FORM1.FRM 源文件: VERSION 4.00 Begin VB.Form Form1 Caption = “Form1“ ClientHeight = 4230 ClientLeft = 1095 ClientTop = 1515 ClientWidth = 6720 Height = 4635 Left = 1035 LinkTopic = “Form1“ ScaleHeight = 4230 ScaleWidth = 6720 Top = 1170 Width = 6840 Begin VB.CommandButton Command1 Caption = “Command1“ Height = 495 Left = 2760 TabIndex = 0 Top = 1920 Width = 1215 End End Attribute VB_Name = “Form1“ Attribute VB_Creatable = False Attribute VB_Exposed = False Private Declare Function GetTickCount Lib “User“ () As Long Private Declare Function GetProfileInt Lib “Kernel“ (ByVal lpappName As String, ByVal lpKeyName As String,ByVal nDefault As Integer) As Integer Private Declare Function SendMessage Lib“User“(ByVal hwnd As Integer, ByVal wMsg As g As Integer,ByVal wParam As Integer,lParam As Any) As Long Const BM_SETSTATE = HookDebug.Print GetLastErrorEnd IfEnd FunctionPublic Function gWindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongSelect Case uMsgCase WM_CONTEXTMENUDebug.Print “WM_CONTEXTMENU“gWindowProc = TrueCase WM_SYSCOMMANDDebug.Print “WM_SYSCOMMAND“gWindowProc = TrueCase ElsegWindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)End SelectEnd FunctionPublic Function UnHook() As LongDim Result As LongResult = SetWindowLong(ghWnd, GWL_WNDPROC, lpPrevWndProc)UnHook = ResultIf UnHook = 0 ThenDebug.Print “ErrorCode:“; UnHookDebug.Print GetLastErrorEnd IfEnd Function=F5 运行。Its ok.Good Luck!Me.PopUpMenu yourMenuNameTop2 楼 chuxinfo(binbin)回复于 2005-05-16 18:10:39 得分 0 yourMenuName 是什么东东,能具体点吗? 非常感谢! Top3 楼 chuxinfo(binbin)回复于 2005-05-16 18:11:34 得分 0 最好给俺个例子 Top4 楼 phlac(天下)回复于 2005-05-16 18:41:13 得分 2在菜单编辑器中定义 mnuFile 菜单,并把的可见性设为 False,然后写下下面窗体事件。 Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbRightButton Then PopupMenu mnuFile End If End SubTop5 楼 xwk(xwk )回复于 2005-05-16 18:41:27 得分 2Private Sub List1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 2 Then“2“这就是右键 PopupMenu popmenu End If End Sub 上面的 popmenu 就是你在菜单编辑器里建的菜单,记得去掉可见的钩 Top6 楼 chuxinfo(binbin)回复于 2005-05-16 22:57:09 得分 0 我在我的 MDIFORM 中已经使用了菜单编辑器(工具-菜单编辑器) 来做我的菜单栏,不知道还能否使用PopupMenu 功能; 另外我新建了一个 form,然后点击( 工具-菜单编辑器) 建立菜单项(标题:登陆,name:FormLogin,索引:0) (标题:确定,name:FormLogin,索引:1) (标题:登陆,name:FormLogin,索引:2) 窗体代码为: Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 2 Then Me.PopupMenu FormLogin End If End Sub 错误提示:实时错误 428 弹出菜单至少要有一个子菜单 我该怎么修正?Top7 楼 phlac(天下)回复于 2005-05-16 23:17:06 得分 2标题:登陆,name:FormLogin,索引:0) (标题:确定,name:FormLogin,索引:1) (标题:登陆,name:FormLogin,索引:2) 这三个,你要把后两个设为前一个的子菜单 你在菜单编辑器界面选定(标题: 确定,name:FormLogin, 索引:1), 然后单击右光标键(),前面出现.号即可,(标题:登陆,name:FormLogin,索

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论