您现在的位置:首页 >> 网络教学 >> 常用控件 >> 内容

鼠标键盘

时间:2009-6-19 9:31:18 点击:2217

鼠标键盘

鼠标键盘是用户与计算机交流的重要工具。VB6.0应用程序可以响应多种鼠标事件和键盘事件。如前面经常用到的Click,双击DdlClick事件是最基本的鼠标事件。许多控件,如窗体,图像控件等都可以检测鼠标指针的位置,并响应相应的单击,双击,左()键按下等事件。同样,利用键盘事件也可以响应各种键盘操作,解释和处理ASCII字符。

7.8.1 鼠标器

1.鼠标事件

由用户操作鼠标所引起的,能够被VB6.0各种对象识别的事件即为鼠标事件。常用的鼠标事件有单击(Click),双击(DblClick),按下任意键(MouseDown),释放任意键(MouseUp),移动鼠标(MouseMove)等。

需要注意的是,鼠标事件应该被其操作的对象识别,即鼠标位于某个控件或窗体上,则该控件或窗体将识别鼠标事件。

鼠标事件的语法结构基本相同,下面以窗体上发生的MouseMove为例进行说明。

格式:Private Sub<对象名>_MouseMove([Index As Integer,Button As Integer,Shift As Integer,X As Single,Y As Single])

其中:

<对象名>:可以响应鼠标事件的对象名称。

Index:整数,用来唯一地标识一个在控件数组中的控件。如果不是控件数组次项省略。

Button:整数,对应鼠标各个按钮的状态,如果某个按钮按下,其中就有一个二进制位被设置。Button参数是具有相应于左按钮(   0),右按钮(1),中间按钮(2)的一个位字段。这些位置的值分别等于124。常数vbLeftButton,vbRightButton,vbMiddleButton分别代表这些值。Button参数指示这些鼠标按钮的整体状态。

Shift:整数,该整数指示【Shift】,【Ctrl】和【Alt】键的状态。某按键按下使得一个二进制位被设置。Shift参数是具有相应于【Shift(0),【Ctrl(1)和【Alt(2)键最少一个位字段。这些位的值分别等于124。常数vbShiftMask, vbCtrlMask, vbAltMask分别代表这些值。例如,【Ctrl】和【Alt】键都被按下,则Shift的值就是6

XY:指定鼠标指针当前位置的值。采用ScaleMode属性指定的坐标系。

注意:指针移动的越快,在任何两点之间所能识别的MouseMove事件越少,应用程序越能接二连三迅速识别大量的MouseMove事件。因此,一个MouseMove事件过程不适合去做那些需要大量计算时间的工作。

2.鼠标光标形状

在应用程序中,经常要根据鼠标光标所在位置或应用程序的状况来决定鼠标光标的形状,如“I”字型鼠标表示插入文本,“+”字型表示画出线或圆等。鼠标光标的形状由对象的MousePointer属性确定,具体值可在属性窗口了解或参考VB6.0帮助文件。

【例7.9】设计绘图程序。

要求:单击鼠标左键开始绘制,按下左键并移动鼠标进行绘制,释放鼠标则停止绘制,然后在新的位置开始绘制。用鼠标右键可以绘制较粗的线条。在窗体的左下角显示当前坐标值。

(1)界面设计。因为只是响应鼠标事件,界面设计相当简单。只需在窗体的左下角添加两个标签控件,分别用来显示当前的x坐标y坐标。

(2)编写如下代码:

Dim x0 As Integer, y0 As Integer

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

Dim k As Integer

k = k + 1

If k = 1 Then

    x0 = X: y0 = Y: Line (x0, y0)-(X, Y)       '设置绘图起点

End If

End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    If Button = 1 Then Line -(X, Y)                  '按下鼠标左键时绘制图形

    If Button = 2 Then Circle (X, Y), 25: Circle (X, Y), 30: Circle (X, Y), 35: Circle (X, Y), 40

                                               '用绘制圆的方式绘制粗线条

    Label1.Caption = Str(X): Label2.Caption = Str(Y)

End Sub

Private Sub Form_Resize()

    Label1.Top = Form1.ScaleTop + Form1.ScaleHeight - Label1.Height           '标签位于窗体底部

Label2.Top = Form1.ScaleTop + Form1.ScaleHeight - Label2.Height

End Sub

程序中,用绘制圆的方式绘制粗线条。如果鼠标移动较快,则可见圆的图形,如图7-16所示。因为鼠标移动越快,两点之间响应鼠标移动事件的次数就越少。

7.8.2 键盘

在需要处理文本的地方,经常会用到键盘,因而有必要对键盘事件进行编程。VB6.0中,常用的键盘事件有Keypress, KeyUp, KeyDown等事件。

1Keypress事件

当用户按下和松开一个ANSI键时发生Keypress事件。ANSI键包括数字,大小英文字母,【Enter】,【BackSpace】,【Esc】,【Tab】等键。方向键不会产生Keypress事件。

格式:

Private Sub <对象名>_ Keypress([Index As Integer,] KeyAscii As Integer)

其中:

Index:整数,它用来唯一标识一个在控件数组中的控件。

KeyAscii:为返回一个标准数字ANSI键代码的ASCII值。KeyAscii通过引用传递,对它进行改变可给对象发送一个不同的字符。将KeyAscii改变为0时可取消击键,此时对象接收不到字符。

需要特别注意的是,只有具有焦点的对象才能接收KeyPress事件。一个窗体仅在它没有可视和有效的控件或KeyPreview属性被设置为True时才能接收该事件。KeyPress事件过程在截取TextBoxComBox控件所输入的击键时是非常有用的,它能够立即测试击键的有效性或在字符输入时对其进行格式处理。改变KeyAscii参数的值会改变所显示的字符。

如果KeyPreview属性被设置为True,窗体将先于该窗体的控件接受KeyPress事件。

2KeyDownKeyUp事件

当一个对象具有焦点时按下(KeyDown)或松开(KeyUp)一个键时发生KeyDownKeyUp事件。

格式:

Private Sub <对象名>_ KeyDown([Index As Integer,] KeyCode As Integer, Shift As Integer)

Private Sub <对象名>_ KeyUp([Index As Integer,] KeyCode As Integer, Shift As Integer)

其中:

KeyCode:是一个键代码,告诉用户事件过程所操作的物理键,并不区分大小写,如vbKeyF1(F1】键)vbKeyHome(Home】键)

其余参数的解释参见前面的鼠标事件和KeyPress事件。

对于KeyDownKeyUp事件可应用与大多数键,它们最经常的还是应用于扩展的字符,如功能键,定位键,键盘修饰键和组合键,区分数字小键盘和常规数字键。

下列情况不能引用KeyDownKeyUp事件:

(1)窗体有一个命令按钮,并且Default属性设置为True时的【Enter】键。

(2)窗体有一个命令按钮,并且Cancel属性设置为True时的【Esc】键。

(3)Tab】键

【例7.10】编写一个简易的指法练习程序。

要求最大限时1分钟。

(1)界面设计。在工程中添加窗体,在窗体上添加3个标签控件,用来动态显示英文字母,一个命令按钮用来开始和结束程序,两个计时器控件,Timer1用来控制标签的移动,Timer2用来控制总时间,设计界面如图7-17所示。

(2)属性设置。对象属性设置如表7-16所示。

7-16 对象属性设置

对象

属性

设定值

窗体

Name

Form1

KeyPreview

True

标签

Name

Label1

Caption

a

标签

Name

Label2

Caption

b

标签

Name

Label3

Caption

c

计时器

Name

Timer1

Interval

15

Enabled

False

计时器

Name

Timer2

Interval

60000

Enabled

False

命令按钮

Name

Command1

Caption

开始

(3)代码编写如下:

Dim n As Integer, m As Integer

Private Sub Command1_Click()

  If Command1.Caption = "开始" Then

     Timer1.Enabled = True: Timer2.Enabled = True: Command1.Caption = "结束"  

    Else

        Timer1.Enabled = False: Timer2.Enabled = False    '结束练习

    If m > 0 Then

        Form1.Print "击键次数:"; m & ""

        Form1.Print "正确率为:" & n / m * 100 & "%"

    End If

End If

End Sub

Private Sub Form_KeyPress(KeyAscii As Integer)

  m = m + 1                            '总击键数增1

  If Chr(KeyAscii) = Label1.Caption Then Label1.Caption = "": n = n + 1

                                       '击键正确,正确击键数增1,并清空标签

  If Chr(KeyAscii) = Label2.Caption Then Label2.Caption = "": n = n + 1

  If Chr(KeyAscii) = Label3.Caption Then Label3.Caption = "": n = n + 1

    End Sub

Private Sub Timer1_Timer()

  Randomize

  If Label1.Caption = "" Then

   '击键正确后产生新字符并将标签移到窗体底部,随机产生小写英文字母

  Label1.Top = Form1.Height - Label1.Height

  Label1.Caption = Chr(Int(Rnd * 26 + 97))

  Else

    Label1.Top = Label1.Top - 10

  End If

  If Label2.Caption = "" Then

  Label2.Top = Form1.Height - Label2.Height

  Label2.Caption = Chr(Int(Rnd * 26 + 97))

  Else

    Label2.Top = Label2.Top - 10

End If

If Label3.Caption = "" Then

  Label3.Top = Form1.Height - Label3.Height

  Label3.Caption = Chr(Int(Rnd * 26 + 97))

  Else

    Label3.Top = Label3.Top - 10

End If

If Label1.Top <= 0 Then Label1.Top = Form1.Height - Label1.Height

                                  '标签移到窗体顶部后 重新回到底部

If Label2.Top <= 0 Then Label2.Top = Form1.Height - Label2.Height

If Label3.Top <= 0 Then Label3.Top = Form1.Height - Label3.Height

End Sub

Private Sub Timer2_Timer()

  Command1_Click                    '时限到,调用"结束"时间过程

End Sub

程序运行结果如图7-18所示。

7-18 “指法测试”运行界面

作者:Admin  
相关文章
  • 没有相关文章
本类推荐
  • 没有
本类固顶
  • 没有
  • VB程序设计学习网站(赣南师范学院) © 2008 版权所有 All Rights Reserved.
  • 地址:江西省赣州市经济技术开发区 赣南师范学院数学与计算机科学学院 邮政编码:341000
    Email:ZQ188@163.com 技术支持QQ:87319633 移ICP备10086号
  • GnsySjxy! V2.4