VB编程技巧三则

Author: 黄立伟 Date: 2001年 3期

    一、创建自定义的光标
      当设计一个应用程序时,VB允许程序员将许多控件的MousePointer属性设计成12个预先定义好的鼠标指针(光标)之一。然而,有些程序员或许会希望显示一个预定义形状之外的光标。本文说明如何创建一个不同的光标,包括为一个没有MousePointer属性的控件创建光标。
      要在VB应用程序中将光标改变成不同的形状,可以通过添加代码来改变希望监视的控件的MouseMove和DragOver事件。
      MouseMove事件所包含的代码用于触发该控件的Drag方法。当鼠标在被选中的控件上移动的时候,轮流显示的鼠标指针。
      当鼠标指针离开该控件时,则DragOver事件被触发。在VB程序中,可以重新复位此Drag属性,使以前的鼠标指针能够被再次显示出来。
      下面的程序可实现当鼠标指针移动到一个文件列表框控件上时,将指针形状改变。
      首先采用缺省的方法建立Form1。在Form1上添加一个文件列表框控件,采用缺省的方法建立File1。将File1控件的DragIcon属性设置为所选择的.ICO文件。
      将如下代码添加到File1的MouseMove事件中:
      Private Sub File1-MouseMove(ButtonAs Integer,Shift As Integer,X As Single,Y As Single)??
      File1.Drag 1 'icon on
      End Sub
      将如下代码添加到Form1的DragOver事件中:
      Private Sub Form-DragOver(Source As Control, X As Single,Y As Single,State As Integer)??
      File1.Drag 0 'icon off
      End Sub
      按下F5功能键执行此程序。得到的运行结果是:将鼠标指针移动到该文件列表框控件上时,程序将把所选中的.ICO文件作为缺省的鼠标光标;将鼠标指针离开该控件时,光标则会自动恢复为原来缺省的形状。
      二、在窗体上点鼠标右键产生一个弹出式菜单的通用方法(PopUp Menu)
      1. 利用VB的菜单编辑器(Menu Editor)编辑你希望弹出的菜单及子菜单,注意,要将菜单的Visible属性设置为:False。
      2. 在窗体(Form1)的MouseDown事件中编写程序,来激发编辑好的菜单,假设菜单名为PopMenu,程序源码如下:
      Private Sub Form-MouseDown(Button As Integer,Shift As Integer,
      X As Single, Y As Single)??
      If Button = vbRightButton Then
      PopMenu.Visible = True
      PopupMenu PopMenu
      End If
      End Sub
      上述方法是针对窗体的,我们也可以针对任意控件,用鼠标右键点击控件时,也弹出一个快捷菜单。方法也很简单,只要把上述代码放到相应控件的MouseDown事件中,就可以了。
      三、动态地判断窗体上某区域内是否有控件存在
      在笔者的一个小程序中,想在窗体的某个区域输出数据,这就要求在这个区域内不能有其他控件存在,那么,怎么才能知道在窗体的某个区域内,是否有控件存在呢?我们可以利用以下程序来实现:
      Function GetControl(x1 As Single, y1 As Single, x2 as Single,y2 as Single)As Control
      Dim Control as Control
      For Each Control In Form1
      With Control
      If(x1 <= .Left)?燗nd (x2 >= .Left) And _
      (y1 <= .Top) And(y2 >= .Top) Or _
      (x1 <=.Left + Width) And (x2 >= .Left + Width) And _
      (y1 <= .Top) And(y2 >= .Top) Or _
      (x1 <= .Left)And(x2 >= Left)And _
      (y1 <= .Top + Height) And (y2 >= .Top + Height)Or _
      (x1 <= . Left + Width) And(x2 >= .Left + Width)And _
      (y1 <= .Top + Height) And(y2 >= .Top + Height)Then
      Set GetControl = Control
      Exit Function
      End If End With
      Next
      Set GetControl = Nothing
      End Function
      注:(x1,y1)和(x2,y2)分别为选定矩形区域的左上角和右下角点的坐标值。
      该程序通过计算窗体上所有控件的四个角的位置来判断控件是否与选定区域相交,并返回相交的控件。