# Label 控件应用方案

## 知识讲解

#### 1．功能

Label 控件即标签控件，是 Visual Basic 控件中最基本的控件。Label 控件可以用来显示用户不能直接改变的文本信息。可以在属性窗口中设置控件的显示文本信息，也可以通过编写程序代码来改变控件的显示文本信息。Label 控件最常用的功能是用来标识控件，例如 TextBox 控件没有自己的 Caption 属性，这时就可以使用 Label 来标识 TextBox 控件。

#### 2．属性

Label 控件的部分常用属性如表 1 所示。

表 1 Label 控件的常用属性

编号 | 属性 | 说明
1 | AutoSize | 决定控件是否自动改变大小以显示其全部内容
2 | BackStyle | 用来指定 Label 控件的背景是否为透明
3 | BorderStyle | 返回或设置控件边框的样式
4 | Caption | 确定标签控件中显示的文本内容
5 | WordWrap | 返回或设置一个值，该值用来指示一个 AutoSize 属性设置为 True 的 Label 控件，是否要进行水平或垂直展开以适合其 Caption 属性中指定文本的要求

下面对比较重要的属性进行详细介绍。

（1）Caption 属性

确定标签控件中显示的文本内容。

语法：

object.Caption [= string]

object：对象表达式。

string：字符串表达式，其值是被显示为标题的文本。

示例：

下例在标签控件中显示当前系统的日期。在窗体启动时，在 Label 控件中显示当前系统的日期。如图 1 所示。

图 1 显示当前系统的日期

程序完整代码如下：

Private Sub Form_Load()

Label1.Caption = Date

End Sub

Caption 属性允许文本的长度最多为 1024 个字符。在默认情况下，当文本超过控件宽度时，文本会自动换行；当文本超过控件高度时，超出部分将被裁剪掉。

在程序中设置其属性的写法如下：

Label1.Caption = "供应商编号"

（2）BackStyle 属性

返回或设置一个值，它指定 Label 控件的背景是否为透明。

语法：

object.BackStyle [= number]

object：对象表达式。

number：数值表达式，用于确定透明性，当 Number 值为 0 时，表示 Label 控件为透明状态；当值为 1 时，表示 Label 控件为非透明状态。

BackStyle 属性用于设置标签控件的背景是否透明。在本实例中，将标签控件的 BackStyle 属性值设置为 0，Caption 属性设置为空，放置在窗体背景图片上，则可模拟按钮，从而达到美化界面的效果。如图 2 所示。

图 2 将标签控件的背景设置为透明

如将标签的背景设置成透明，其代码如下：

Label1.BackStyle = 0

（3）BorderStyle（边框）属性

该属性用来设置标签边框的样式，其属性值有两种状态：

当属性值取 0 时，表示控件的四周没有边框，如图 3 所示。在程序中设置其属性值的代码如下：

Label1.BorderStyle=0

当属性值取 1 时，表示控件的四周加上立体边框，如图 4 所示。在程序中设置其代码的属性值，其写法如下：

Label1.BorderStyle=1

图 3 不加边框的标签属性设置

图 4 加边框的标签属性设置

（4）AutoSize 和 WordWrap 属性.

AutoSize 属性确定标签是否会随标题内容的多少自动变化。如果 AutoSize 属性的属性值为 True，则随 Caption 内容的多少自动调整控件本身的大小，且不换行；如果值为 False，表示标签的尺寸不能自动调整，超出尺寸范围的内容将不显示。

如将 Label 控件的宽度设置成随文字长度自动调整，其写法如下：

Label1.AutoSize = True

Wordwrap 属性用来设置当标签在水平方向上不能容纳标签中的文本时，是否折行显示文本。当其值为 True 时，表示文本折行显示，标签在垂直方向上放大或缩小以适合文本的大小，标签水平方向的宽度保持不变；其值为 False 时，表示文本不换行。

上述两个属性主要用来确定文本如何在标签中显示。有时候，标签中的文字内容会动态地变化，此时，如果想保持标签水平方向的长度不变，应同时使 Wordwrap 和 AutoSize 属性为 True；若仅仅希望在水平方向上改变标签的大小，只需将 AutoSize 属性设为 True，而 Wordwrap 属性保持为 False 即可。

下面以设计合同管理系统中查看操作员窗体中的 Label 控件为例，来讲解一下 Label 控件的常用属性设置方法。

在如图 2.39 所示的窗体界面中，将 Label1 的 Caption 属性值设置为“当前操作员”，Alignment 属性值设置为 2-Center，BackStyle 属性设置为 0-Transparent，设置完的效果如图 5 所示。

图 5 Label 控件的属性设置

（5）Alignment 属性

Alignment 属性用于设置 Caption 属性中文本的对齐方式，其对齐方式有 3 种可选值：值为 0 时为左对齐（Left Justify）；值为 1 时为右对齐（Right Justify）；值为 2 时为居中对齐（Center Justify）。

如要将 Label1 标签内的文字设置成“居中对齐”显示，可以用如下的代码来实现：

Label1.Alignment = 2

#### 3．方法

Label 控件常用方法介绍如表 2 所示。

表 2 Label 控件的常用方法

编号 | 方法 | 说明
1 | LinkExecute | 在一次 DDE 对话过程中将命令字符串发送给发送端应用程序
2 | LinkPoke | 在 DDE 对话过程中将 Label 控件的内容传送给发送端应用程序
3 | LinkSend | 在一次 DDE 对话中将 Label 控件的内容传输到接收端应用程序
4 | LinkRequest | 在一次 DDE 对话中请求发送端应用程序更新 Label 控件中的内容
5 | Move | 用以移动 MDIForm、Form 或控件

下面对比较重要的方法进行详细介绍。

（1）LinkExecute 方法

在一次 DDE 对话过程中将命令字符串发送给发送端应用程序。不支持命名参数。

语法：

object.LinkExecute string

object：对象表达式。

string：字符串表达式，它含有源应用程序所识别的命令。

例如建立一个 MicrosoftExcel 的 DDE 链接，将一些值放置到一个新工作单的第一行的单元里。LinkExecute 向 MicrosoftExcel 发送激活工作单的命令，如图 6、7 所示。

图 6 激活工作单

图 7 激活工作单后的效果

程序代码如下：

Private Sub Form_Click()

Dim Cmd, I, Q, Row, Z '声明变量

Q = Chr(34) '定义引用标记

'创建一个含有 Microsoft Excel 宏指令的字串

Cmd = "[ACTIVATE(" & Q & "SHEET1" & Q & ")]"

Cmd = Cmd & "[SELECT(" & Q & "R1C1:R5C2" & Q & ")]"

Cmd = Cmd & "[NEW(2,1)][ARRANGE.ALL()]"

If Label1.LinkMode = vbNone Then

Z = Shell("Excel", 4) '启动 Microsoft Excel

Label1.LinkTopic = "Excel|Sheet1" '设置连接主题

Label1.LinkItem = "R1C1" '设置连接项目

Label1.LinkMode = vbLinkManual '设置连接模式

End If

For I = 1 To 5

Row = I '定义行号

Label1.LinkItem = "R" & Row & "C1" '设置连接项目

Label1.Caption = Chr(64 + I) '将值放置在 Text 中

Label1.LinkPoke '将值放入单元

Label1.LinkItem = "R" & Row & "C2" '设置连接项目

Label1.Caption = Row '将值放置在 Text 中

Label1.LinkPoke '将值放入单元

Next I

On Error Resume Next

Label1.LinkExecute Cmd '执行 Microsoft Excel 命令

End Sub

注意：string 的实际值根据源应用程序而改变。例如，Microsoft Excel 和 Microsoft Wordfor Windows 接受括在方括号（[]）中宏命令所组成的命令字符串。要查看源应用程序所接受的命令字符串，请查阅该应用程序的文档。

（2）Move 方法

用以移动 MDIForm、Form 或控件。不支持命名参数。

语法：

object.Move left, top, width, height

Move 方法语法中各参数的说明如表 3 所示。

表 3 参数说明

参数 | 说明
object | 可选的参数。对象表达式
left | 必需的参数。单精度值，指示 object 左边的水平坐标值
top | 可选的参数。单精度值，指示 object 顶边的垂直坐标值
width | 可选的参数。单精度值，指示 object 新的宽度
height | 可选的参数。单精度值，指示 object 新的高度

示例：

下例演示的是当程序运行时，单击窗体上的控制按钮，将使 Label 控件移动到指定的位置。如图 8 所示。

图 8 移动控件的位置

程序完整代码如下：

Private Sub Command1_Click()

Label1.Move 600, 600, 1000, 300

End Sub

#### 4．事件

Label 控件的常用事件如表 4 所示。

表 4 Label 控件的常用事件

编号 | 事件 | 说明
1 | Change | 指示一个控件的内容已经改变。该事件在一个 DDE 链接更新数据或通过代码改变 Caption 属性的设置时发生
2 | Click | 此事件在标签控件上按下然后释放一个鼠标按键时发生。它也会在一个控件的值改变时发生
3 | DblClick | 当在标签控件上按下和释放鼠标按键并再次按下和释放鼠标按键时，该事件发生
4 | LinkClose | 此事件在一个 DDE 对话结束时发生。DDE 对话的两个应用程序任何时候都可以终止对话
5 | LinkError | 当一个 DDE 对话过程中出现错误时，该事件发生。仅在发生了一个 DDE 有关的错误并且没有 Visual Basic 代码被执行来处理这些错误时，才会将其错误号作为参数传递
6 | LinkOpen | 此事件在一个 DDE 对话正在启动时发生

下面对比较重要的事件进行详细介绍。

（1）Click 事件

此事件是在一个对象上按下然后释放一个鼠标按键时发生，它也会在控件的值改变时发生。

语法：

Private Sub object_Click([index As Integer])

object：对象表达式。

Index：一个整数，用来惟一地标识一个在控件数组中的控件。

（2）LinkClose 事件

此事件在一个 DDE 对话结束时发生。DDE 对话的两个应用程序任何时候都可以终止对话。

语法：

Private Sub object_LinkClose([index As Integer])

object：对象表达式。

Index：一个整数，它用来惟一标识一个在控件数组中的控件。

示例

下例演示 Label 控件的 LinkClose 事件。LinkClose 事件在 DDE 对话之后发生，在关闭如图 9 所示的窗体时，触发 Label 控件的 LinkClose 事件，提示 DDE 对话已经结束的提示信息，如图 10 所示。

图 9 读取数据

图 10 提示信息

程序主要代码如下：

Private Sub Label1_LinkClose()

MsgBox "已经关闭 DDE 对话连接", 48, "提示信息"

End Sub

程序完整代码如下：

Private Sub Command1_Click()

Dim CurRow As String

' 确保连接不是活动的.

Label1.LinkMode = 0

Label1.LinkTimeout = 30

' 设置应用程序的名字和题目名.

Label1.LinkTopic = "Excel|Sheet1"

Label1.LinkItem = "R1C1" ' 设置 LinkItem.

Label1.LinkMode = 1 ' 设置 LinkMode 为自动.

Label1.LinkRequest '更新标签中的内容

Lab_sex.LinkMode = 0

Lab_sex.LinkTopic = "Excel|Sheet1"

Lab_sex.LinkItem = "R1C2"

Lab_sex.LinkMode = 1

Lab_age.LinkMode = 0

Lab_age.LinkTopic = "Excel|Sheet1"

Lab_age.LinkItem = "R1C3"

Lab_age.LinkMode = 1

Lab_jg.LinkMode = 0

Lab_jg.LinkTopic = "Excel|Sheet1"

Lab_jg.LinkItem = "R1C4"

Lab_jg.LinkMode = 1

Lab_dh.LinkMode = 0

Lab_dh.LinkTopic = "Excel|Sheet1"

Lab_dh.LinkItem = "R1C5"

Lab_dh.LinkMode = 1

Lab_dz.LinkMode = 0

Lab_dz.LinkTopic = "Excel|Sheet1"

Lab_dz.LinkItem = "R1C6"

Lab_dz.LinkMode = 1

End Sub

Private Sub Label1_LinkClose()

MsgBox "已经关闭 DDE 对话连接", 48, "提示信息"

End Sub

Private Sub Label1_LinkError(LinkErr As Integer)

If LinkErr = 1 Then

MsgBox "已经有另一个应用程序按照此错误的格式请求过数据", 48, "提示信息"

ElseIf LinkErr = 6 Then

MsgBox "接收端应用程序试图继续 DDE 对话。", 48, "提示信息"

ElseIf LinkErr = 7 Then

MsgBox "所有源链接都在使用中。", 48, "提示信息"

ElseIf LinkErr = 8 Then

MsgBox "更新控件中的数据失败", 48, "提示信息"

ElseIf LinkErr = 11 Then

MsgBox "无足够的内存给 DDE 使用", 48, "提示信息"

End If

End Sub

## 应用一：Label 控件区域控制中的应用

当鼠标在 Label 控件的区域时，处理一些事物；当鼠标不在 Label 控件的区域时，可以恢复事物为初始状态，以达到动态变化的效果。例如，当鼠标移动到 Label1 控件（作为命令按钮）上时，Label1 控件为按下状态；当鼠标移动到 Label2 控件的区域时，Label1 控件为抬起状态。设计结果如图 11 所示。

图 11 人事档案管理系统主界面

具体设计步骤如下：

（1）将图形化的主界面作为窗体背景。

（2）将 Label1 控件数组中的元素按顺序放置在不同功能的图形按钮上，设置 Caption 属性值为空、BackStyle 属性值为“0-Transparent”。

（3）调整 Label2 控件的大小，基本与窗体一样大，然后放置在窗体上。设置 Caption 属性值为空、BackStyle 属性值为“0-Transparent”。

注意：Label2 控件应置于 Label1 控件的底层。

4）程序代码如下：

Dim mousemove As Boolean

Dim i As Integer

'鼠标移动到标签上时标签为抬起状态

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

mousemove = (0 <= X) And (X < Label1(Index).Width) '设置鼠标移动状态

For i = 0 To 8 '循环

If mousemove = True Then '当状态为 True

If Index = i Then '当索引值与 i 相同

Label1(i).BorderStyle = 1 '设置边框样式为 1

Else

Label1(i).BorderStyle = 0 '设置边框样式为 0

End If

End If

Next i

End Sub

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

mousemove = (0 <= X) And (X < Label2.Width) '设置鼠标移动状态

For i = 0 To 8 '循环

If mousemove = True Then '当状态为 True

Label1(i).BorderStyle = 0 '设置边框样式为 0

End If

Next i

End Sub

## 应用二：Label 控件作为标题的应用

Label 控件通常用于通知用户一些在窗体上可见控件的意义，即作为标题使用。Label 控件作为标题，可以有很多效果。常见是它的默认效果，透明或者不透明，还有阴影效果、图形效果的标题等。各种效果如图 12 所示。

图 12 Label 控件作为标题的应用

具体设计方法如下：

效果 1：普通效果的标题是 Label 控件的默认效果，它可以透明，也可以不透明，主要取决于窗体或容器的背景色。如果窗体或容器的背景色与 Label 控件的背景色一致，那么可以不透明，否则，必须设置透明，这样才不会影响程序界面的效果。

另外，如果几个 Label 控件在一列或一行上，为了使界面整齐，可以设置 Label 控件左对齐或右对齐；顶端对齐或底端对齐。完成此设置可以使用“格式”菜单中的“对齐”命令。例如，在添加科室信息窗体中将“科室编号”等 Label 控件设置为左对齐，结果如图 13 所示。

图 13 设置 Label 控件左对齐

效果 2：阴影效果的标题。阴影效果的标题由两个或三个 Label 控件透明后错位叠加而成。其中作为阴影的文字，最好使用深色。调整这几个控件的位置可以使用快捷键：

说明：〈Ctrl+↑〉向上微移控件；〈Ctrl+↓〉向下微移控件；〈Ctrl+←〉向左微移控件；〈Ctrl+→〉向右微移控件

效果 3：图形效果的标题。图形效果的标题使用了三个 Label 控件。将最底下的两个 Label 控件一个设置为紫色，一个设置为黑色，黑色置于底层，以达到阴影效果，Caption 属性为空。在这两个 Label 控件的最上面放置另外一个 Label 控件，设置标题文字、设置透明效果。

## 应用三：按钮导航菜单

### 实例说明

在某些管理软件中，菜单不仅实现了调用程序执行任务的功能，并能给出相应功能按钮的流程图式菜单，非常直观。本实例就要实现这种菜单，效果如图 14 所示。

图 14 按钮导航菜单

### 思路与技术

本实例主要使用 Picture 控件和 Label 控件来制作按钮导航菜单。

通过在 Label 控件的 MouseMove 事件过程中编写代码来确定 Picture 控件（按钮）的位置，从而实现按钮变换的效果。下面介绍 MouseMove 事件。

当鼠标指针处于窗体和控件的边框内时发生 MouseMove 事件。

& 语法：

Private Sub object_MouseMove([index As Integer,] button As Integer, shift As Integer, x As Single, y As Single)

参数说明：

l object 对象表达式，其值是“应用于”列表中的一个对象。

l index 整数，用来惟一地标识一个在控件数组中的控件。

l button 整数，它与鼠标各个按键的状态相对应，如果某个按键被按下，其中就有一个二进制位被设置。button 参数是具有相应于左按键（位 0），右按键（位 1），以及中间按键（位 2）的一个位字段。这些位的值分别等于 1、2 和 4。它表示这些鼠标按键的整体状态，3 个二进制位中的一些、全部或一个也没有被设置表示这些按键中的一些、全部或一个也没有被按下。

l shift 一个整数，该整数与 Shift、Ctrl 和 Alt 键的状态相对应。某键被按下使得一个二进制位被设置。shift 参数是具有相应于 Shift 键（位 0）、Ctrl 键（位 1）以及 Alt 键（位 2）最少二进制位的一个位字段。这些位的值分别等于 1、2 和 4。shift 参数指示这些键的状态。这些位中可能有一些、全部或者一个也没有被设置，指示这些键中的一些、全部或者一个也没有被按下。例如，Ctrl 和 Alt 键都被按下，则 shift 的值就是 6。

l x, y 一个指定鼠标指针当前位置的数。x 和 y 的值表示的总是通过该对象 ScaleHeight, ScaleWidth, ScaleLeft 和 ScaleTop 属性所建立的坐标系统的方式。

### 开发步骤

（1）新建一个标准工程，创建一个新窗体，默认的“名称”属性为 Form1。

（2）在 Form1 窗体上添加一个 Label1 控件数组（Label1(0)～Label1(8)）和一个 Picture 控件，设置 Label1 控件数组的 ForeColor 属性为“&H00C00000&”。

（3）在 Picture1 控件中添加一个 Label 控件，设置其“名称”属性为 lbl1，ForeColor 属性为“&H000000C0&”

Form1 窗体中控件部分属性设置如表 5 所示。

表 5 Form1 窗体中控件部分属性设置

控件名 | 属性 | 值
CommonDialog | Name | CommonDialog1
Label | Name Caption | Label1(0) 日常业务管理
Label | Name Caption | Label1(1) 库存药品管理
Label | Name Caption | Label1(2) 药品查询统计
Label | Name Caption | Label1(3) 基本资料管理
Label | Name Caption | Label1(4) 系统管理
Label | Name Caption | Label1(5) 辅助工具
Label | Name Caption | Label1(6) 帮 助
Label | Name Caption | Label1(7) 关 于
Label | Name Caption | Label1(8) 退 出
Label | Name Caption | Label2(0) 计算器
Label | Name Caption | Label2(1) 记事本
Label | Name Caption | Label2(2) 密码修改
Label | Name Caption | Label2(3) 重新登录
Label | Name Caption | Label2(4) 在线帮助
Label | Name Caption | Label2(5) 退 出
Label | Name Caption | Label2(6) 计算器
Label | Name Caption | lbl1 日常业务管理
Label | Name | lbl2
PictuteBox | Name | Picture1
PictuteBox | Name | Picture2
PictuteBox | Name | Picture3
StatusBar | Name | StatusBar1

（4）菜单编辑器相关内容如图 5 所示:

图 15 菜单编辑器内容

（5）为 frm_main 窗体添加如下代码。

Dim mytag As String

Public picTag As Integer

'启动窗体并进行初始化

Private Sub Form_Load()

Picture3.Height = 5250: Picture3.Width = 8040

Picture3.Left = 3060: Picture3.Top = 2025

End Sub

Private Sub Form_Resize()

'不允许用户调整窗体的大小

On Error Resume Next

Me.Height = 8505

Me.Width = 12030

End Sub

'鼠标移动产生不同的效果

Private Sub Label1_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, y As Single)

'当鼠标移到左侧图形菜单上时，将 Picture1 移到该菜单上以产生不同的菜单效果

Picture1.Left = 240

Picture2.Top = -2000

Select Case Index

Case 0

Picture1.Top = 1560

Case 1

Picture1.Top = 2040

Case 2

Picture1.Top = 2550

Case 3

Picture1.Top = 3030

Case 4

Picture1.Top = 3525

Case 5

Picture1.Top = 4020

Case 6

Picture1.Top = 4515

Case 7

Picture1.Top = 5010

Case 8

Picture1.Top = 5525

End Select

lbl1.Caption = Label1(Index).Caption

End Sub

Private Sub label2_Click(Index As Integer)

'单击顶层图形菜单

If Index = 6 Then

Select Case Label2(6).Caption

Case "计算器"

Case "记事本"

Case "密码修改"

Case "重新登录"

Case "在线帮助"

Case "退 出"

Unload Me

End Select

End If

End Sub

Private Sub Label2_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, y As Single)

'当鼠标移到顶层图形菜单上时，将 Picture2 移到该菜单上以产生不同的菜单效果

Picture2.Top = 1500

Picture1.Top = -2000

lbl2.Visible = False

Select Case Index '判断控件索引

Case 0

Picture2.Left = 2910

Case 1

Picture2.Left = 4455

Case 2

Picture2.Left = 5940

Case 3

Picture2.Left = 7455

Case 4

Picture2.Left = 8940

Case 5

Picture2.Left = 10530

End Select

Label2(6).Caption = Label2(Index).Caption

End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

Dim Msg As String ' 声明变量。

' 如果正在退出应用。

Msg = "是否退出〖" & Me.Caption & "〗应用程序？"

' 如果用户单击 No 按钮，则停止 QueryUnload。

If MsgBox(Msg, vbQuestion + vbYesNo, Me.Caption) = vbNo Then Cancel = True

End Sub

Private Sub lbl1_Click()

'单击左侧图形菜单

Select Case lbl1.Caption

Case "日常业务管理"

Picture3.Picture = LoadPicture(App.Path & "\image\1.jpg")

picTag = 1

Case "库存药品管理"

Picture3.Picture = LoadPicture(App.Path & "\image\2.jpg")

picTag = 2

Case "药品查询统计"

Picture3.Picture = LoadPicture(App.Path & "\image\3.jpg")

picTag = 3

Case "基本资料管理"

Picture3.Picture = LoadPicture(App.Path & "\image\4.jpg")

picTag = 4

Case "系统管理"

Picture3.Picture = LoadPicture(App.Path & "\image\5.jpg")

picTag = 5

Case "辅助工具"

Picture3.Picture = LoadPicture(App.Path & "\image\6.jpg")

picTag = 6

Case "帮助"

Case "关于"

Case "退出"

Unload Me

End Select

End Sub

Private Sub Picture3_MouseMove(Button As Integer, Shift As Integer, X As Single, y As Single)

lbl2.Visible = False

Select Case picTag

Case 1

'药品入库

If X > 990 And X < 2100 Then

lbl2.Move 900, 2070 '移动标签位置

lbl2.Visible = True '显示标签

mytag = "m1"

End If

'药品销售

If X > 5700 And X < 6700 Then

lbl2.Move 5580, 2085

lbl2.Visible = True

mytag = "m2"

End If

'销售退货

If X > 3330 And X < 4500 Then

If y > 30 And y < 920 Then

lbl2.Move 3270, 75

lbl2.Visible = True

mytag = "m3"

End If

End If

'入库退货

If X > 3330 And X < 4500 Then

If y > 4200 And y < 5200 Then

lbl2.Move 3240, 4200

lbl2.Visible = True

mytag = "m4"

End If

End If

Case 2

If X > 3330 And X < 4500 Then

If y > 30 And y < 920 Then

lbl2.Move 3270, 75

lbl2.Visible = True

mytag = "m5"

End If

End If

If X > 990 And X < 2100 Then

lbl2.Move 900, 2070

lbl2.Visible = True

mytag = "m6"

End If

If X > 5700 And X < 6700 Then

lbl2.Move 5580, 2085

lbl2.Visible = True

mytag = "m7"

End If

Case 3

If X > 1900 And X < 3380 Then

lbl2.Move 1965, 1140

lbl2.Visible = True

mytag = "m8"

End If

If X > 4350 And X < 5700 Then

lbl2.Move 4320, 1140

lbl2.Visible = True

mytag = "m9"

End If

If X > 1900 And X < 3380 Then

If y > 2880 And y < 3980 Then

lbl2.Move 1920, 3045

lbl2.Visible = True

mytag = "m10"

End If

End If

If X > 4350 And X < 5550 Then

If y > 2880 And y < 3980 Then

lbl2.Move 4320, 3045

lbl2.Visible = True

mytag = "m11"

End If

End If

Case 4

If X > 2300 And X < 3400 Then

If y > 1050 And y < 2000 Then

lbl2.Move 2115, 1140

lbl2.Visible = True

mytag = "m12"

End If

End If

If X > 4500 And X < 5700 Then

If y > 1050 And y < 2000 Then

lbl2.Move 4380, 1170

lbl2.Visible = True

mytag = "m13"

End If

End If

If X > 1110 And X < 2100 Then

lbl2.Move 1110, 3060

lbl2.Visible = True

mytag = "m14"

End If

If X > 3500 And X < 4400 Then

If y > 3000 And y < 4000 Then

lbl2.Move 3315, 3045

lbl2.Visible = True

mytag = "m15"

End If

End If

If X > 5500 And X < 6800 Then

lbl2.Move 5565, 3060

lbl2.Visible = True

mytag = "m16"

End If

Case 5

If X > 1900 And X < 3380 Then

lbl2.Move 1965, 1140

lbl2.Visible = True

mytag = "m17"

End If

If X > 4350 And X < 5700 Then

lbl2.Move 4320, 1140

lbl2.Visible = True

mytag = "m18"

End If

If X > 1900 And X < 3380 Then

If y > 2880 And y < 3980 Then

lbl2.Move 1920, 3045

lbl2.Visible = True

mytag = "m19"

End If

End If

If X > 4350 And X < 5550 Then

If y > 2880 And y < 3980 Then

lbl2.Move 4320, 3045

lbl2.Visible = True

mytag = "m20"

End If

End If

Case 6

If X > 1900 And X < 3380 Then

lbl2.Move 1965, 1140

lbl2.Visible = True

mytag = "m21"

End If

If X > 4350 And X < 5700 Then

lbl2.Move 4320, 1140

lbl2.Visible = True

mytag = "m22"

End If

If X > 1900 And X < 3380 Then

If y > 2880 And y < 3980 Then

lbl2.Move 1920, 3045

lbl2.Visible = True

mytag = "m23"

End If

End If

If X > 4350 And X < 5550 Then

If y > 2880 And y < 3980 Then

lbl2.Move 4320, 3045

lbl2.Visible = True

mytag = "m24"

End If

End If

End Select

End Sub

## 应用四：利用 Label 控件模拟按钮动作

### 实例说明

Label 控件是用来显示文本的控件，通常用来标注和显示提示信息。本实例巧妙地应用 Label 控件实现了模拟按钮动作的功能，如图 6 所示。

图 16 利用 Label 控件模拟按钮动作

### 思路与技术

主要利用 Label 控件的 MouseMove 事件和 Image 控件的 MouseMove 事件来实现本实例。当鼠标移动到 Label 控件上时，设置 Label 控件为有边框形式，当鼠标离开 Label 控件移动到 Image 控件上时，设置 Label 控件为无边框形式。下面介绍一下 MouseMove 事件的用法。

MouseMove 事件在移动鼠标时发生。

其语法形式如下：

Private Sub object_MouseMove([index As Integer,] button As Integer, shift As Integer, x As Single, y As Single)

参数说明：

l object 一个对象表达式。

l index 一个整数，用来惟一地标识一个在控件数组中的控件。

l button 一个整数，它对应鼠标各个按钮的状态，如果某个按钮被按下，其中就有一个二进制位被设置。button 参数是具有相应于左按钮（位 0）、右按钮（位 1）以及中间按钮（位 2）的一个位字段，这些位的值分别等于 1、2 和 4。它指示这些鼠标按钮的整体状态，三个二进制位中的一些、全部或一个也没有被设置，指示这些按钮中的一些、全部或一个也没有被按下。

l shift 一个整数，该整数相应于 SHIFT、CTRL 和 ALT 键的状态，某键被按下使得一个二进制位被设置。shift 参数是具有相应于 SHIFT 键（位 0）、CTRL 键（位 1）以及 ALT 键（位 2）最少二进制位的一个位字段，这些位的值分别等于 1、2 和 4。shift 参数指示这些键的状态，这些位中可能有一些、全部或者一个也没有被设置，指示这些键中的一些、全部或者一个也没有被按下。例如，CTRL 和 ALT 键都被按下，则 shift 的值就是 6。

l x，y 一个指定鼠标指针当前位置的数。x 和 y 的值所表示的总是通过该对象 ScaleHeight，ScaleWidth，ScaleLeft 和 ScaleTop 属性所建立的坐标系统的方式。

注意：

为了对鼠标按钮按下和释放所引起的事件进行处理，可以使用MouseDown和MouseUp事件过程。

### 开发步骤

（1）新建一个标准工程，创建一个新窗体，默认的“名称”属性为 Form1。

（2）在 Form1 窗体上添加一个 Image 控件，并设置其 Picture 属性。

（3）在 Image 控件上添加一个 ImageList 控件和一个 ListView 控件。这两个控件都属于 ActiveX 控件，在使用前应先将其添加到工具箱中，具体添加方法如下：

选择 VB 菜单的“工程”→“部件”，然后选取 Microsoft Windows Common Control 6.0（SP6），单击“确定”按钮。此时，几个新的控件出现在工具箱中。

（4）右击添加到窗体上的 ImageList1 控件，选择“属性”项，打开到“属性页”对话框设置备份卡图片。在“通用”选项卡中选择“32×32”单选按钮；切换到“图像”选项卡，单击“插入图片”按钮，选择要添加的图片，单击“打开”按钮，添加的图片将显示在“图像”列表框中，用相同的方法添加其他的图片；选择“图像”列表框中的任一图片，可以在窗体上面的“索引”列表框中看到此图片的索引值。

（5）右击添加到窗体上的 ListView1 控件，选择“属性”项，打开到“属性页”对话框。在“图像列表”选项卡中的“普通”下拉列表中选择 ImageList1，然后单击“应用”、“确定”按钮。

（6）添加 3 个 Label 控件，设置其 Caption 属性为无，分别用于显示操作员的姓名、编号和级别信息；添加一个 TextBox 控件，设置其 PasswordChar 属性为*，用于隐藏用户输入的密码。

（7）添加两个 Label 控件，设置其 Caption 属性为“确认”和“退出”；再添加一个 Label 控件，放置在窗体右上角的关闭按钮处，设置 Caption 属性为无；添加一个 TextBox 控件和一个 ADO 控件。ADO 控件属于 ActiveX 控件，在使用前应先将其添加到工具箱中，具体添加方法如下：

选择 VB 菜单的“工程”→“部件”选项，然后选取 Microsoft ADO Data Control 6.0（SP4）（OLEDB）选项，单击“确定”按钮。此时，ADO 控件出现在工具箱中。

Form1 窗体中控件部分属性设置如表 6 所示。

表 6 Form1 窗体中控件部分属性设置

控件名 | 属性 | 值
Adodc | Name | Adodc1
Label | Name ForeColor | bh &H000000FF&
Label | Name ForeColor | czy &H000000FF&
Label | Name ForeColor | jb &H000000FF&
Label | Name Caption | Label1 确认
Label | Name Caption | Label2 退出
Label | Name | Label3
Image | Name | Image1
ImageList | Name | ImageList1
ListView | Name | ListView1
TextBox | Name Password | Text1 *
TextBox | Name | Txttime

（8）为 Form1 窗体添加如下代码。

Dim adoCon As New ADODB.Connection

Dim adoRs As New ADODB.Recordset

Dim itmX As ListItem '声明一个 ListItem 对象

Dim MyIcon As Integer '声明一个整型变量

Dim text, MyMsg As String '声明字符串变量

Const HTCAPTION = 2

Const WM_NCLBUTTONDOWN = &HA1

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Declare Function ReleaseCapture Lib "user32" () As Long

Private Sub bh_Click()

End Sub

'窗体为可编辑状态时 text1 获得焦点

Private Sub Form_Activate()

Text1.SetFocus 'text1 获得焦点

End Sub

'窗体启动并进行初始化

Private Sub Form_Load()

'添加操作员

Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db_books.mdb;Persist Security Info=False"

Adodc1.RecordSource = "select * from qxb"

Adodc1.Refresh

If Adodc1.Recordset.RecordCount > 0 Then

With Adodc1.Recordset

.MoveFirst

czy.Caption = .Fields("操作员")

bh.Caption = .Fields("编号")

jb.Caption = .Fields("操作员级别")

Do While .EOF = False

text = .Fields("操作员")

MyIcon = Val(Right(.Fields("头像"), Val(Len(.Fields("头像")) - 2)))

Set itmX = ListView1.ListItems.Add(, , text, MyIcon)

.MoveNext

Loop

End With

End If

End Sub

'鼠标移动到标签上时标签的状态

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

Label1.BorderStyle = 0

Label1.ForeColor = RGB(0, 0, 0)

Label2.BorderStyle = 0

Label2.ForeColor = RGB(0, 0, 0)

Label3.BorderStyle = 0

End Sub

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

If Button = 1 Then

X = ReleaseCapture()

ReturnVal = SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0)

End If

End Sub

Private Sub Label1_Click() '确认

Adodc1.RecordSource = "select * from qxb where 操作员 = '" + Trim(czy.Caption) + "'"

Adodc1.Refresh

'验证操作员及密码

If Text1.text = Adodc1.Recordset.Fields("密码") Then

If MsgBox("密码输入正确！！点击"是"退出！", 4, "信息提示") = vbYes Then

End

End If

Else

If czy.Caption = "" Then

MsgBox "请选择操作员！", , "信息提示"

ListView1.SetFocus

Else

If Text1.text <> Adodc1.Recordset.Fields("密码") Then

MsgBox "密码错误,请重新输入密码！", , "信息提示"

Txttime.text = Val(Txttime.text) + 1

Text1.SetFocus

End If

End If

If Txttime.text = "3" Then '密码错误 3 次，退出系统

MyMsg = MsgBox("密码输入错误,请向系统管理员查询！", , "信息提示")

If MyMsg = vbOK Then End

End If

End If

End Sub

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

Label1.ForeColor = RGB(255, 0, 0)

Label1.BorderStyle = 1

End Sub

Private Sub Label2_Click() '退出

End

End Sub

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

Label2.ForeColor = RGB(255, 0, 0)

Label2.BorderStyle = 1

End Sub

Private Sub Label3_Click()

End

End Sub

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

Label3.BorderStyle = 1

End Sub

Private Sub ListView1_Click()

If ListView1.ListItems.Count > 0 Then

'查询操作员信息

Adodc1.RecordSource = "select * from qxb where 操作员='" + ListView1.SelectedItem + "'"

Adodc1.Refresh

With Adodc1.Recordset

If .RecordCount > 0 Then

'赋值给 czy.caption 等

czy.Caption = .Fields("操作员")

bh.Caption = .Fields("编号")

If .Fields("操作员级别") <> "" Then jb.Caption = .Fields("操作员级别")

End If

End With

End If

End Sub

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)

'回车使 CmdOk 按钮获得焦点

If KeyCode = vbKeyReturn Then Label1_Click '按回车键调用 Label1_Click 事件

End Sub

Public Function Cnn() As String '声明函数

Cnn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db_books.mdb;Persist Security Info=False"

End Function

## 应用五：利用 Label 控件制作滚动文字

在 Visual Basic 中要想实现文字的滚动，可以通过将 Label 控件的 Left、Top 属性和 Timer 控件相结合，使 Label 控件每隔一段时间就移动一次位置，如果时间间隔合适，就可以实现 Label 中显示的文字在移动的效果。

如下例利用 Label 控件来实现文字的滚动。实现文字向左或向右移动，可以设置 Label 控件的 Left 属性，例如“Label1.Left = Label1.Left + 100”。

运行程序，如图 7 所示。其中，上面的文字是从左向右滚动的，下面的文字是从右向左滚动的，中间的文字是从下向上滚动的。

图 17 滚动文字

程序开发步骤如下。

（1）新建一个标准工程，创建一个新窗体。

（2）在窗体上添加两个 Label 控件，一个 PictureBox 控件和一个 Timer 控件，设置 Timer 控件的 Interval 属性为 200。

（3）在 Picture1 上添加一个 Label 控件。

（4）程序完整代码如下：

Sub ChangeColor(Ctl As Control, Color1 As Integer, Color2 As Integer, Color3 As Integer, Color4 As Integer)

' 改变字体颜色

If Val(Ctl.Tag) = Color1 Then

Ctl.Tag = Color2

ElseIf Val(Ctl.Tag) = Color2 Then

Ctl.Tag = Color3

ElseIf Val(Ctl.Tag) = Color3 Then

Ctl.Tag = Color4

ElseIf Val(Ctl.Tag) = Color4 Then

Ctl.Tag = Color1

Else

Ctl.Tag = Color1

End If

Ctl.ForeColor = QBColor(Ctl.Tag)

End Sub

Private Sub Timer1_Timer()

If Label1.Left < Me.Width Then '从左到右滚动

Label1.Left = Label1.Left + 100

ElseIf Label1.Left > Me.Width Then

Label1.Left = -Label1.Width

End If

Call ChangeColor(Label1, 1, 3, 5, 9) '调用自定义函数，改变文字颜色

Label2.Left = Label2.Left – 100 '从右到左滚动

If Label2.Left < -Label2.Width Then

Label2.Left = Me.ScaleWidth

End If

Call ChangeColor(Label2, 1, 3, 5, 9) '调用自定义函数，改变文字颜色

Label3.Top = Label3.Top – 100 '从下往上滚动

If Label3.Top < -Label3.Height Then

Label3.Top = Picture1.ScaleHeight

End If

End Sub