在VB5.0下有效控制鼠标的输入焦点 目前新推出的各种软件中都存在一种共同的特征，将用户界面中的图形、命令、说明文字融为一体，将鼠标的移动和操作融为一体。当将鼠标指针移动到各种命令区域上时，相应的命令按钮会凸起(也可能出现动态提示或按钮颜色变化)，以提示操作者，从而实现程序界面中的各种功能。用户界面中的这种超文本技术、动态技术和鼠标指示功能，给用户操作带来极大方便。 应用程序中的这种自动感应命令区域功能，就是鼠标输入焦点的控制功能。虽然上述控制技术在高级应用程序中才能见到，但在目前的可视化编程工具中实现起来并非特别困难。下面就以VB5.0为例，介绍笔者在自己的应用程序中实现鼠标输入焦点控制相关技术的详细实现方法和具体步骤。

定义鼠标输入焦点的命令区域

鼠标输入焦点(或称鼠标热点)是应用程序界面中响应鼠标(或键盘)输入命令的客户区域，这个区域通常是规则的矩形(也可以是不规则的)。要控制鼠标的输入焦点，就必须判断鼠标发生动作的屏幕位置是否位于命令的客户区域内。所以，只要将命令的客户区域坐标数据保存到数组中，然后将鼠标发生动作的位置与数组中数据比较，就不难获取当前鼠标的输入焦点。如果需要在位图文件.BMP和.DBI等中设置焦点，可以利用Windows下的可视开发工具Visual C＋＋和Visual Basic 等提供的热点编辑器。输入焦点的命令区域一般包括左上和右下两个坐标数值，除此之外还可包含一些与相关提示和执行动作有关的其他信息。
在VB5.0的窗体声明部分，可以利用自定义数据类型的方法来确定鼠标输入焦点的数据结构。如笔者定义的数据结构中包括提示信息、执行信息和矩形客户区域的坐标值等。
Private Type RectHot
DoMess As String ；执行信息
Butt As String ；按钮显示
Mess As String ；提示信息
LeftX As Integer ；客户区域坐标
TopY As Integer
RightX As Integer
BottomY As Integer
...... ；其他数据定义
End Type
Dim RectHots(8) As RectHot ；根据命令区域个数定义数组

鼠标输入焦点数据的初始化问题

确定了鼠标输入焦点的数据结构之后，首先要根据界面中的按钮、标签和图形命令等确定数据与命令区域之间的对应关系，然后在Form－Load(　)函数载入窗体时对数组中的成员进行初始化，以正确获取鼠标输入焦点。对于一般控件可直接在属性窗口中获得其准确坐标值，而对于图片等图形控件，可利用鼠标取得其命令区域的坐标值。初始化方法如下：
Form-Load()
RectHots(1).DoMess = ″Do RECT 1″
RectHots(1).Mess = ″Mouse RECT 1″
RectHots(1).LeftX = 1080
RectHots(1).TopY = 240
RectHots(1).RightX = 3120
RectHots(1).BottomY = 1040
RectHots(2).DoMess = ″Do RECT 2″
RectHots(2).Mess = ″Mouse RECT 2″
RectHots(2).LeftX = 1080
RectHots(2).TopY = 840
RectHots(2).RightX = 3120
RectHots(2).BottomY = 1840
......
End Sub

鼠标输入焦点的控制方法

在鼠标输入焦点捕捉客户区域设置完成后，接着就必须在MouseMove( )函数中判断当前的鼠标光标位置是否落入某个特定客户区域内，如果位于特定客户区域内，则通过变量设置可将当前客户区域设置为具有鼠标输入焦点的有效区域，并进行客户区域颜色或凸凹状态的改变或者利用鼠标光标形状的改变以及动态提示等，来提示当前鼠标输入焦点的有效捕捉客户区域。当鼠标指针移出当前客户区域，应恢复原来的客户区域状态和原来的鼠标光标指针，并清除动态提示窗口。当点击鼠标某个按键后，可通过MouseDown( )函数和设置的当前有效命令区域变量执行相应的功能。
鼠标移动函数中判断光标指针落入客户区域方法:
Private Sub Frame1－MouseMove(Button As Integer,
Shift As Integer, X As Single, Y As Single)
Dim CurHot As Integer
Dim i As Integer
For i = 1 To n ；依次判断n个命令区
If X>RectHots(i).LeftX And X<RectHots(i).RightX
And Y>RectHots(i).TopY And Y<RectHots(i).BottomY Then
CurHot = True ；鼠标指针落入命令区域
Exit For
End If
Next i

鼠标输入焦点的相关提示功能

当前有效的鼠标输入焦点相关提示功能，可根据应用程序的实际需要，选择其中的一种或几种。各种相关提示功能的实现方法如下：

1. 鼠标光标形状变化
可通过设置用户自定义鼠标光标形状的方法来实现，恢复时只需将其类型设置为默认值。
控件名.MousePointer=99:99为自定义光标形状
控件名.MouseIcon = LoadPicture(″C:\WINDOWS\CURSORS\HAND-RL.CUR″)；光标资源文件
只需将MousePointer设置为0即可恢复默认值。

2. 动态提示功能
通过设置标签控件及窗口背景色来实现，默认状态为不显示，在需要动态提示窗口时，重新设置其LEFT和TOP位置参数及其Caption属性的内容并置Visible属性为True(可见)，取消时只需将标签的属性Visible设置为False即可。
动态提示窗口设置：
Label1.Left = RectHots(i).LeftX
Label1.Top = RectHots(i).TopY
Label1.Caption = RectHots(i).Mess
Label1.Visible = True
动态提示窗口取消：
Label1.Caption = ″″
Label1.Visible = False

3. 改变颜色
只需变换当前客户区域控件的背景颜色值，恢复时只需将其设置成默认值即可。
颜色状态设置控件.BackColor=＆H00000018＆

颜色状态恢复控件.BackColor=＆H00000001＆
4. 改变命令区凸凹状态
如果命令区域为按钮格式，可通过绘图函数的异或(XOR)属性改变按钮的状态来实现相应的

提示功能，鼠标移动出客户区域后再恢复其原来状态。

5.通过使能属性进行提示
可通过某些控件的Enable属性来控制客户区域的有效状态。
设置方法：控件.Enable=True
取消恢复：控件.Enable=False

6. 其他提示方法
此外还可以通过设置某些控件的其他属性如控件边框的粗细等方法来实现有效区域的提示。

鼠标输入焦点的相关执行功能

当点击鼠标某个按键(左键或右键或双击操作)后，通过MouseDown(　)函数和设置的当前有效命令区域变量的内容，来确定命令区域应该执行什么样的相应功能。如显示对话框窗口信息的简单方法如下：
Private Sub Framel_MouseDown(Button As Integer,
Shift As Integer, X As Single, Y As Single)
If CurRect < > 0 Then
MsgBox RectHots(i).DoMess, 0, ″″
End If
End Sub

控制鼠标输入焦点的应用程序实例

本文提供了一个简单的鼠标输入焦点控制的应用程序实例。程序中设置了如下控件：
该程序中将Picture1的客户区域划分为3个部分(见文后程序中的Form－Load( )函数中的初始化数据)，用来演示鼠标移动过程中光标形状的变化和输入焦点控制功能以及相关的命令按钮提示、凸凹状态和执行操作等。程序中通过变量控制当前有效的客户命令区域，当然读者可根据实际需要将其修改为各种命令按钮或图片等。程序中的相关提示功能采用了最为常用的鼠标光标形状变化、动态提示窗口和按钮状态变化的提示方法，其中动态提示功能还在提示窗口首次显示前进行了一定延时处理，使其和当前的可视编程工具中的提示功能完全相同。程序中图版框中设置的命令按钮是在Picture1－Paint()函数中设置的，命令按钮的状态变化是通过UpLine()和DownLine()两个函数来实现的。当命令区域取得输入焦点后，为简化程序其执行功能只显示一个用户模态对话框。

本文程序在P200计算机、VB5.0和Windows 98测试版下调试通过，程序的运行结果见图1和图2，其中图1为程序运行时的界面，图2为当鼠标指针移动到命令按钮二上时鼠标光标、命令按钮的状态变化以及按钮的动态提示情况，当鼠标指针移开后，程序界面又恢复图1的状态。实际程序设计时可根据具体情况进行相应的功能取舍或补充。总之，在应用程序中灵活地控制鼠标输入焦点，可使开发的应用程序具有很高的专业水准和简单灵活的操作方法。
(杜蕴杰)