# Frame 控件应用方案

## 知识概述

#### 1．Frame 控件的概述

Frame 控件用于为控件提供可标识的分组。下面分别介绍 Frame 控件的常用属性、方法和事件。

#### 2．Frame 控件的属性

（1）Caption 属性

Caption 属性用于确定显示在 Frame 控件中的文本信息。设置 Frame 控件的 Caption 属性效果如图 1 所示。

图 1 设置 Caption 属性效果

另外也可以通过代码来实现，其代码如下：

Frame1.Caption = "明日科技"

（2）BorderStyle 属性

BorderStyle 属性用于设置框架是否有边线。

当 BorderStyle 属性设置为 0 时，表示框架无边线；当 BorderStyle 属性设置为 1 时，表示框架有凹陷边线。其效果如图 2 所示。

图 2 设置 BorderStyle 属性效果

## 应用一：打印连续号码的标签

### 实例说明

本实例实现打印连续号码的功能。运行程序，如图 3 所示，设置字体、在字号后输入起始编号和结束编号，单击“打印”按钮，连续打印编号，直到编号结束为止，其中，某一编号的打印结果如图 4 所示。

图 3 打印设置窗体

图 4 某一编号的打印结果

### 思路与技术

Printer 对象的 NewPage 方法可以结束 Printer 对象中的当前页，并前进到下一页。

语法：

object.NewPage

object：所在处代表一个对象表达式。

说明：

NewPage前进到下一个打印机页，并将打印位置重置到新页的左上角。当调用NewPage时，它将Printer对象的Page属性加1。

### 开发步骤

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

（2）在 Form1 窗体中添加两个 Frame 控件、两个 CommandButton 控件。

（3）在 Frame1 控件中添加一个 Label 控件、一个 ComboBox 控件和一个 TextBox 控件。

（4）在 Frame2 控件中添加一个 Label 控件、一个 TextBox 控件数组（Text1(0)～Text1(1)）。

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

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

控件名 | 属性 | 值
ComboBox | Name | Combo1
CommandButton | Name Caption | Command1 打印
CommandButton | Name Caption | Command2 退出
Frame | Name | Frame1
Frame | Name | Frame2
Label | Name Caption | Label1 字体 字号
Label | Name Caption | Label2 起始编号 结束编号
TextBox | Name | Text1
TextBox | Name | Text2(0)
TextBox | Name | Text2(1)

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

Private Sub Form_Load()

Combo1.AddItem "隶书" '添加列表项

Combo1.AddItem "宋体" '添加列表项

Combo1.AddItem "楷体" '添加列表项

Combo1.ListIndex = 1 '选择列表第 2 项

Text1 = 100 '设置文本框内容

Text2(0) = 1 '设置文本框内容

Text2(1) = 100 '设置文本框内容

End Sub

Private Sub Command1_Click()

Dim i As Integer '声明整型变量

For i = Text2(0) To Text2(1) '循环

Printer.Font.Name = Combo1 '设置字体名称

Printer.Font.Size = Text1 '设置文字大小

Printer.CurrentX = 400 '设置打印输出横坐标

Printer.Print i '打印

Printer.NewPage '换页

Next i

Printer.EndDoc '终止打印

End Sub

Private Sub Command2_Click()

End

End Sub

## 应用二：带水平滚动条的 ListBox 控件

### 实例说明

在使用 ListBox 控件编写应用程序的时候，经常会遇到这样的情况：如果在 ListBox 控件中输入的文本信息过长，则有一部分文本信息会被挡住，这样将影响阅读；如果将 ListBox 控件的宽度加宽又会影响窗体的整体布局。下面将介绍如何在 ListBox 控件中添加滚动条。运行程序，在文本框中输入要添加的信息，按回车键即可将相应的信息添加到 ListBox 控件中。如本实例中，输入“明日科技”后，LisBox 中没有水平滚动条，输入“吉林省明日科技有限公司”后，ListBox 中出现水平滚动条。实现效果如图 5 所示。

图 5 带水平滚动条的 ListBox 控件

### 思路与技术

使用 API 函数中的 SendMessage 函数发送 LB_SETHORIZONTALEXTENT 消息给 ListBox 控件，设定 ListBox 控件的水平滚动条。

SendMessage 函数的作用是调用一个窗口的窗口函数，将一条信息发给那个窗口。直到信息被处理完毕，该函数才会返回。

函数的声明过程如下：

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

参数说明：

l hWnd Long 型。要接收消息的那个窗口的句柄。

l wMsg Long 型。消息的标识符。

l wParam Long 型。具体取决于消息。

l lParam Any 型。具体取决于消息。

### 开发步骤

（1）新建一个标准工程，创建一个新窗体，默认名为 Form1。

（2）在窗体上添加一个 Frame 控件。

（3）在 Frame1 上添加两个 Frame 控件。

（4）在 Frame2 上添加一个 ListBox 控件，用于显示添加的数据信息。

（5）在 Frame3 上添加一个 TextBox 控件和一个 Image 控件。设置 Image 控件的 BorderStyle 属性为 1-Fiexed Single。

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

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

控件名 | 属性 | 值
Frame | Name | Frame1
Frame | Name Caption0 | Frame2 显示信息
Frame | Name Caption | Frame3 输入信息
Image | Name | Image1
ListBox | Name | List1
TextBox | Name | Text1

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

'声明 API 用于发送消息

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

Const LB_SETHORIZONTALEXTENT = &H194 '声明常量

Private Sub Form_Load()

Me.ScaleMode = vbPixels '窗体坐标的度量单位设置为像素

Me.Font.Size = List1.Font.Size '设置窗体文字大小

End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)

If KeyAscii = 13 Then '当回车时

List1.AddItem Text1.Text '添加列表项

'当窗体的文字宽度大于等于 List1 宽度乘以 0.07 的值时

If Me.TextWidth(Text1) >= 0.07 * Me.List1.Width Then

SendMessage List1.hwnd, LB_SETHORIZONTALEXTENT, 6 * Me.TextWidth(Text1), ByVal 0& '发送滚动条消息

End If

End If

End Sub

## 应用三：多表分组统计

### 实例说明

本实例是在图书销售信息表和图书库存信息表中查询图书的销售数量和现存数量，并按书号、书名等分组。运行程序，单击“查询”按钮，即可在下面的表格中显示图书的现存数量和销售数量信息，其实现效果如图 6 所示。

图 6 多表分组统计

### 思路与技术

本实例利用 SUM 函数统计图书销售数量。关于 SUM 函数的语法形式及使用方法参见实例“利用聚集函数 SUM 对销售额进行汇总”。本实例还利用 GROUP BY 子句对图书进行分组操作，关于 GROUP BY 子句的语法形式和使用方法参见实例“数据分组统计（单列）”。

本实例应用到的 SQL 语句的关键代码如下：

Adodc1.RecordSource = "select k.书号,k.书名,x.作者, k.现存数量 ,sum(x.销售数量)as 销售数量 from xsb x ,kcb k where x.书号=k.书号 group by k.书号,k.书名,x.作者, k.现存数量 "

本实例的实现过程如图 7 所示。

图 7 本实例的实现过程

### 开发步骤

（1）新建一个标准工程，创建一个新窗体，默认名为 Form1。

（2）在窗体上添加两个 Frame 控件。

（3）在 Frame1 上添加一个 Label 控件和两个 CommandButton 控件。

（4）在 Frame2 上添加一个 ADO 控件和一个 DataGrid 控件，由于这两个控件都属于 ActiveX 控件，因此，在使用之前必须把它们从“部件”对话框中添加到工具箱。添加方法如下：

在“工程”→“部件”对话框中勾选 Microsoft ADO Data Control 6.0（SP4）（OLEDB）列表项，以及 Microsoft DataGrid Control 6.0（SP5）（OLEDB）列表项。单击“确定”按钮，即可将 ADO 控件和 DataGrid 控件添加到工具箱中。设置 ADO 控件的 Visible 属性为 False。其中，ADO 控件用于连接数据表，DataGrid 控件用于显示数据信息。

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

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

控件名 | 属性 | 值
Adodc | Name | Adodc1
CommandButton | Name Caption | Cmd_Find 查询
CommandButton | Name Caption | Cmd_Refresh 刷新
DataGrid | Name | DataGrid1
Frame | Name | Frame1
Frame | Name Caption | Frame2 查询统计结果
Label | Name Caption ForeColor | Label1 查询统计图书的销售数量和现存数量 &H00FF0000&

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

Private Sub Cmd_Find_Click() '查询

'设置记录源

Adodc1.RecordSource = "select k.书号,k.书名,x.作者, k.现存数量 ,sum(x.销售数量)as 销售数量 from xsb x ,kcb k where x.书号=k.书号 group by k.书号,k.书名,x.作者, k.现存数量 "

Adodc1.Refresh '刷新 ADO 控件

Set DataGrid1.DataSource = Adodc1 '与 ADO 控件绑定

End Sub

Private Sub Cmd_Refresh_Click() '刷新

Adodc1.RecordSource = "select * from kcb" '设置记录源

Adodc1.Refresh '刷新 ADO 控件

Set DataGrid1.DataSource = Adodc1 '与 ADO 控件绑定

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 kcb" '设置记录源

Adodc1.Refresh '刷新 ADO 控件

Set DataGrid1.DataSource = Adodc1 '与 ADO 控件绑定

End Sub

## 应用四：利用选择控件实现权限设置

### 实例说明

为了防止非法用户或没有相关权限的用户登录系统查看或修改相关数据，最好的办法就是为程序设计权限设置模块，通过权限设置可以为每个用户设置不同的权限。本例运行后，选择相应模块前的复选框，则当前用户可以使用该模块；如果取消相应模块前复选框的选择，则该模块处于不可用状态，即当前用户无权使用该模块。实现结果如图 8 所示。

图 8 利用选择控件实现权限设置

### 思路与技术

本实例中使用了 CheckBox 控件来实现权限设置。将 CheckBox 控件的 Value 属性赋给菜单的 Enabled 属性。CheckBox 控件常被用来处理 True 和 False 状态间的切换，选择该控件将显示“√”，而取消选择后，“√”消失。该控件可以用来提供 True/False 或者 Yes/No 选项。下面介绍一下 CheckBox 控件的 Value 属性。

CheckBox 控件的 Value 属性用于返回或设置控件的状态。

其语法形式如下：

object.Value [= value]

参数说明：

l object 对象表达式。

l value 该值指定控件的状态。

l Value 设置值为 0 是复选框未被选定（缺省值），1 是复选框被选定，2 是复选框变灰（变暗）。

### 开发步骤

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

（2）选择 VB 菜单的“工具”→“菜单编辑器”，进入“菜单编辑器”窗口。在“标题”文本框中输入“基础信息设置”，在“名称”文本框中输 Menu，“索引”文本框中输入 0；单击“下一个”按钮，设置下一个菜单信息，索引值为 1；依次设置其他的菜单项，如图 2 所示。

（3）在 Form1 窗体上添加一个 Frame 控件。

（4）在 Frame1 控件上添加一个 ListView 控件，默认“名称”属性为 ListView1。该控件属于 ActiveX 控件，在使用前应先将其添加到工具箱中，具体添加方法如下：

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

（5）在 Frame1 控件上添加一个 Frame 控件。

（6）在 Frame2 控件上添加一个 CheckBox 控件数组（Check1(0)～Check1(4)），设置其 Caption 属性分别为“基础信息设置”、“计划信息设置”、“生产设备管理”、“生产入库管理”和“系统维护”，Value 属性都设置为 1-Checked。

（7）在 Frame1 控件上添加一个 Image 控件，并设置其 Picture 属性。

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

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

控件名 | 属性 | 值
CheckBox | Name Caption | Check1(0) 基础信息设置
CheckBox | Name Caption | Check1(1) 计划信息设置
CheckBox | Name Caption | Check1(2) 生产设备管理
CheckBox | Name Caption | Check1(3) 生产入库管理
CheckBox | Name Caption | Check1(4) 系统维护
Frame | Name Caption | Frame1 权限设置
Frame | Name | Frame2
Image | Name | Image1
ImageList | Name | ImageList1
ListView | Name | ListView1

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

图 9 菜单编辑器内容

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

Private Sub Check1_Click(Index As Integer)

For i = 0 To Check1.UBound '遍历菜单数组元素

Form1.Menu(i).Enabled = Check1(i).Value '设置菜单是否可用

Next i

End Sub

Private Sub Form_Load()

ListView1.ListItems.Clear '清除列表项

Set Item = ListView1.ListItems.Add(, , "黎莉", 1) '添加列表项

For i = 0 To Check1.UBound '遍历菜单数组元素

Form1.Menu(i).Enabled = Check1(i).Value '设置菜单是否可用

Next i

End Sub