# PictureBox 控件应用方案

## 知识讲解

#### 1．功能

PictureBox 控件提供了更多的功能和绘图的方法。可以利用 PictureBox 控件提供的方法在其上面绘制图形，还可以把 PictureBox 控件作为容器，将其他控件放在其中，从而实现分组的效果。

#### 2．属性

PictureBox 控件的常用属性如表 1 所示。

表 1 PictureBox 控件的属性

编号 | 属性 | 描述
1 | Appearance | 返回或设置 MDIForm 或 Form 对象上的控件在设计时的绘图风格。在运行时是只读的。
2 | BackColor | 返回或设置对象的背景颜色
3 | ForeColor | 返回或设置在对象里显示图片和文本的前景颜色
4 | DataChanged | 返回或设置一个值，它指出被绑定的控件中的数据已被某进程改变，这个进程不是从当前记录中检索数据的进程。该在设计时不可用
5 | DataField | 返回或设置数据使用者将被绑定到的字段名
6 | DataFormat | 设置或返回 StdDataFormat 对象，一个绑定对象将附加到它。在设计时或运行时都可读写
7 | DataMember | 从数据供应程序提供的几个数据成员中返回或设置一个特定的数据成员
8 | DragIcon | 返回或设置图标，它将在拖放操作中作为指针显示
9 | DragMode | 回或设置一个值，确定在拖放操作中所用的是手动还是自动拖动方式
10 | Enabled | 返回或设置一个值，该值用来确定一个窗体或控件是否能够对用户产生的事件作出反应
11 | Font | 返回一个 Font 对象
12 | FontBold | 按 Bold 格式设置字体样式
13 | FontItalic | 按 Italic 格式设置返回或设置字体样式
14 | FontStrikethru | 按 Strikethru 格式返回或设置字体样式
15 | FontUnderline | 按 Underline 格式返回或设置字体样式
16 | FontName | 返回或设置在控件中或在运行时画图或打印操作中，显示文本所用的字体
17 | FontSize | 返回或设置在控件中或在运行时画图或打印操作中，显示文本所用的字体的大小
18 | Height、Width | 返回或设置对象的维数、或 DataGrid 控件 Columns 对象的宽度
19 | HelpContextID | 为一个对象返回或设置一个相关联上下文的编号。它被用来为应用程序提供上下文有关的帮助
20 | hWnd | 返回窗体或控件的句柄。
21 | Index | 返回或设置唯一标识控件数组中某一控件的数。只有当控件是控件数组的一部分时，才可用该属性
22 | Left | 返回或设置对象内部的左边与它的容器的左边之间的距离
23 | Top | 返回或设置对象的内顶部和它的容器的顶边之间的距离
24 | MouseIcon | 返回或设置自定义的鼠标图标
25 | MousePointer | 返回或设置一个值，该值指示在运行时当鼠标移动到对象的一个特定部分时，被显示的鼠标指针的类型
26 | Name | 返回在代码中用于标识控件、或数据访问对象的名字。在运行时是只读的
27 | OLEDropMode | 返回或设置目标部件如何处理放操作
28 | Parent | 返回包含控件、或其它对象或者集合的窗体、对象、或集合
29 | RightToLeft | 返回布尔值，它指示双向系统上的文本显示方向和控件可见的外观
30 | ScaleHeight | 当使用图形方法或调整控件位置时，返回或设置对象内部的垂直(ScaleHeight)度量单位
31 | ScaleWidth | 当使用图形方法或调整控件位置时，返回或设置对象内部的水平(ScaleWidth)度量单位
32 | ScaleLeft | 当使用图形方法或调整控件位置时，返回或设置一个对象左边(ScaleLeft)的坐标
33 | ScaleTop | 当使用图形方法或调整控件位置时，返回或设置一个对象上边垂直(ScaleTop)的坐标
34 | ScaleMode | 当使用图形方法或调整控件位置时，返回或设置一个值，该值指示对象坐标的度量单位
35 | TabIndex | 返回或设置父窗体中大部分对象的〈Tab〉键次序
36 | TabStop | 返回或设置一个值，该值用来指示是否能够使用〈Tab〉键来将焦点从一个对象移动到另一个对象
37 | Tag | 返回或设置一个表达式用来存储程序中需要的额外数据。与其它属性不同，Tag 属性值不被 VB 使用；可以用该属性来标识对象
38 | ToolTipText | 返回或设置一个工具提示
39 | Visible | 返回或设置一指示对象为可见或隐藏的值
40 | WhatsThisHelpID | 返回或设置一个与对象关联的上下文编号。用以为应用程序提供使用 Windows 95 Help 中的“这是什么”弹出式窗口的上下文敏感的 Help
41 | Align | 返回或设置一个值，确定对象是否可在窗体上以任意大小、在任意位置上显示，或是显示在窗体的顶端、底端、左边或右边，而且自动改变大小以适合窗体的宽度
42 | AutoRedraw | 返回或设置从图形方法到持久图形的输出
43 | AutoSize | 返回或设置一个值，以决定控件是否自动改变大小以显示其全部内容
44 | BorderStyle | 返回或设置对象的边框样式。对 Form 对象和 Textbox 控件在运行时是只读的
45 | ClipControls | 返回或设置一个值，决定 Paint 事件中的图形方法是重绘整个对象，还是只绘刚刚露出的区域。它还决定 MicrosoftWindows 运行环境是否创建一个不包括该对象的非图形控件的剪裁区。在运行时为只读
46 | Container | 返回或设置 Form 上控件的容器。在设计时不能使用
47 | CurrentX | 返回或设置下一次打印或绘图方法的水平(CurrentX)坐标。设计时不可用
48 | CurrentY | 返回或设置下一次打印或绘图方法的垂直(CurrentY)坐标。设计时不可用
49 | DataSource | 返回或设置一个数据源，通过该数据源，数据使用者被绑定到一个数据库
50 | DrawStyle | 返回或设置一个值，以决定图形方法输出的线型的样式
51 | DrawWidth | 返回或设置图形方法输出的线宽
52 | FillColor | 返回或设置用于填充形状的颜色：FillColor 也可以用来填充由 Circle 和 Line 图形方法生成的圆和方框
53 | FillStyle | 返回或设置用来填充 Shape 控件、以及由 Circle 和 Line 图形方法生成的圆和方框的模式
54 | FontTransparent | 返回或设置一个值，该值用来决定 PictureBox 控件上的背景文本和图形被显示在字符周围的空区
55 | hDC | 返回一个句柄，该句柄是由 Microsoft Windows 运行环境提供给一个对象的设备描述体
56 | HasDC | 返回或设置一个值，以决定唯一显示上下文（或 hDC）是否被分配给控件
57 | Image | 返回持久图形的句柄，该句柄由 Microsoft Windows 运行环境提供
58 | IMEMode | 该属性返回或者设置的数值用来确定被选定的对象的 IME（Input Method Editor，输入方法编辑器）状态
59 | LinkItem | DDE 与另一个应用程序会话时，返回或设置传给接收端的数据
60 | LinkMode | 返回或设置用于 DDE 会话的链接类型并同时激活下面的连接： 允许 Visual Basic 窗体上的接收端控件启动会话，它由控件的 LinkTopic 和 LinkItem 属性确定。
61 | LinkTimeout | 返回或设置等待 DDE 响应消息的时间
62 | LinkTopic | 返回或设置发送端应用程序和主题（使用于该应用程序中的基本数据的分组）。为了指定完整的数据链，应当与 LinkItem 属性一起使用 LinkTopic
63 | Negotiate | 设置一个值，当窗体上活动对象显示一个或多个工具栏时，决定是否显示一个可以对齐的控件。运行时无效
64 | OLEDragMode | 返回或设置是由部件还是由程序员来处理 OLE 拖放操作
65 | Picture | 返回或设置控件中要显示的图片。对于 OLE 容器控件，在设计时不可用在运行时为只读

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

（1）AutoSize 属性

AutoSize 属性用于返回或设置一个值，以决定 PictrueBox 控件是否自动改变大小以显示其全部内容。

语法：

object.AutoSize [= boolean]

图 1 所示演示的是 PictureBox 控件的 AutoSize 属性。当 AutoSize 属性设置为 True 时，PictureBox 控件的大小随图片的大小改变；当 AutoSize 属性设置为 False 时，PictureBox 控件不随图片大小改变。

图 1 AutoSize 属性演示

（2）Picture 属性

Picture 属性是 PictureBox 控件最重要的属性之一。在 PictureBox 控件中显示图片是由 Picture 属性决定的，有两种方法可以实现图片的添加。

l 在设计时加载

在“属性”窗口中找到 Picture 属性，单击其右边的按钮，打开文件对话框，选择要添加的图片。

l 在运行时加载

在运行时可以通过 LoadPicture 函数来设置 Picture 属性，也可以将其他控件的 Picture 值赋给 PictureBox 控件的 Picture 属性。

语法：

object.Picture [= picture]

object：对象表达式。

picture：字符串表达式，指定一个包含图片的文件，可以设置为 bitmap、icon、metafile、GIF、JPEG 型的图片。

利用下面的代码向 PictureBox 控件中添加图片：

Picture1.Picture = LoadPicture("D:\图片素材\明日企标.jpg ")

## 应用一：保存 Picture 控件中的图形

要保存 Picture 控件中的图形，可以使用 SavePicture 语句，其可以从对象或控件（如果有一个与其相关）的 Picture 或 Image 属性中将图形保存到文件中。语法如下：

SavePicture picture, stringexpression

参数说明：

picture：产生图形文件的 PictureBox 控件或 Image 控件。

stringexpression：要保存的图形文件名。

无论在设计时还是运行时图形从文件加载到对象的 Picture 属性，而且它是位图、图标、元文件或增强元文件，则图形将以原始文件同样的格式保存。如果它是 GIF 或 JPEG 文件，则将保存为位图文件。代码如下：

SavePicture Picture1.Image, "c:\01.bmp"

## 应用二：Picture 控件设置图形或清除图形

PictureBox 控件可以显示来自位图、图标或者元文件，以及来自增强的元文件、JPEG 或 GIF 文件的图形。下面是为 Picture 控件设置图形或清除图形的几个小技巧。

1、使用代码为控件设置图形。如果已知路径和图片名，可使用如下代码：

Picture1.Picture = LoadPicture("c:\01.bmp")

如果在应用程序目录下（非根目录），且知道图片名，可使用如下代码：

Picture1.Picture = LoadPicture(app.path & "\01.bmp")

如果在应用程序目录下（根目录），且知道图片名，可使用如下代码：

Picture1.Picture = LoadPicture(app.path & "01.bmp")

如果不知道目录和图片名，需要用户选择，则须和 CommonDialog 控件配合，代码如下：

CommonDialog1.Filter = "*.bmp|*.jpg|*.gif"

CommonDialog1.ShowOpen

Picture1.Picture = LoadPicture(CommonDialog1.FileName)

2、清除 PictureBox 控件的图形。

下面使用代码清除图片：

Picture1.Picture = LoadPicture("")

也可以手工清除，把鼠标移到 Picture 控件的 Picture 属性值输入处，按键盘上的“Del”键。

## 应用三：PictureBox 显示动态运行进度

要实现利用 PictureBox 控件显示动态运行进度，可通过利用 PictureBox 控件绘制并填充矩形来实现。随着执行进度的不断变化，绘制矩形的宽度也跟着不断的变化，这时用指定的颜色填充由 Line 函数绘制成的矩形。

最终效果如图 2 所示。

图 2 利用 PictureBox 控件实现进度条功能

程序代码如下：

★★★★★ Form1 ★★★★★★

'单击开始按钮，用 PictureBox 显示动态运行进度

Private Sub Command1_Click() '开始执行

Dim i As Integer

Dim t As Long

Dim per As String

Dim cx, cy As Single

For i = 0 To Picture1.ScaleWidth

Picture1.DrawMode = vbCopyPen

Picture1.Line (0, 0)-(Picture1.ScaleWidth, Picture1.ScaleHeight), QBColor(7), BF

per = Format(i / Picture1.ScaleWidth, "0.00%")

cx = (Picture1.ScaleWidth - Picture1.TextWidth(per)) / 2

cy = (Picture1.ScaleHeight - Picture1.TextHeight(per)) / 2

Picture1.CurrentX = cx

Picture1.CurrentY = cy

Picture1.Print per

Picture1.DrawMode = vbXorPen

Picture1.Line (0, 0)-(i, Picture1.ScaleHeight), QBColor(11), BF

For t = 0 To 5000

DoEvents

Next t

Next i

MsgBox "完成!", , "明日图书"

End Sub

Private Sub Command2_Click() '退出

End

End Sub

'窗体启动并进行初始化

Private Sub Form_Load()

Picture1.ForeColor = vbBlack

Picture1.DrawStyle = vbSolid

Picture1.FontSize = 14

End Sub

## 应用四：Picture 控件在警区分布图中的应用

Picture 控件可以显示来自位图、图标以及来自增强的元文件、JPEG 或 GIF 文件的图形。如果控件不足以显示整幅图像，则裁剪图像以适应控件的大小。

PictureBox 控件还可以作为容器，将其他控件放在它里面使用。

Picture 控件还是一个数据绑定控件，在开发程序过程中，可以通过数据绑定的方法显示数据库中的图片。另外，Picture 控件的 LoadPicture 方法也可以显示数据库中的图片。

在下面的警区分布图中，灵活运用了 Picture 控件的以上特点，实现了查看数据库中各警区分布图的功能，其中使用 Shape 控件标记各警区的位置，如图 3 所示。

图 3 Picture 控件在长春市警区分布图中的应用

设计思路如下：

使用 Picture 控件的 LoadPicture 方法浏览数据中的区域图。根据不同的区域和数据库中存储的各区域内警区的位置，动态加载并显示各警区标记。警区标记由 Shape 控件完成，动态加载警区标记主要通过 Load 方法动态加载 Shape 控件实现。其中，位置由数据库中存储的警区的位置和所在区域决定。

程序完整代码如下：

Dim Rs As New ADODB.Recordset

Dim Cn As New ADODB.Connection

Dim i As Integer

'启动窗体连接数据库并进行初始化

Private Sub Form_Load()

Cn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & App.Path & "\bjgl.mdb"

Rs.Open "select 所属区域 from 警区表 group by 所属区域", Cn, adOpenKeyset, adLockOptimistic

If Rs.RecordCount > 0 Then

Do While Rs.EOF = False

Combo2.AddItem Rs.Fields("所属区域")

Rs.MoveNext

Loop

End If

Rs.Close

i = 1

End Sub

'单击 ComboBox 控件 1 的项目并初始化

Private Sub Combo1_Click()

Rs.Open "select * from 警区表 where 名称='" + Combo1.Text + "'", Cn, adOpenKeyset, adLockOptimistic

If Rs.RecordCount > 0 Then

Text1.Text = Rs.Fields("地址")

Text2.Text = Rs.Fields("电话")

Text3.Text = Rs.Fields("位置 1") & "," & Rs.Fields("位置 2")

For i = 1 To Shape1.Count - 1

If Shape1(i).Left = Rs.Fields("位置 1") And Shape1(i).Top = Rs.Fields("位置 2") And Shape1(i).Visible = True Then

Timer1.Enabled = True

Exit For

Else

Shape1(i).BackColor = &HFF&

Timer1.Enabled = False

End If

Next i

End If

Rs.Close

End Sub

'单击 ComboBox 控件 2 的项目并初始化

Private Sub Combo2_Click()

Label4.Caption = Combo2.Text & "警务区"

Combo1.Clear

Rs.Open "select * from 警区表 where 所属区域='" + Combo2.Text + "' order by 编号", Cn, adOpenKeyset, adLockOptimistic

If Rs.RecordCount > 0 Then

Rs.MoveFirst

Do While Rs.EOF = False

Combo1.AddItem Rs.Fields("名称")

Rs.MoveNext

Loop

End If

Rs.Close

If Shape1.Count > 1 Then

For Index = 1 To Shape1.Count - 1

Shape1(Index).Visible = False

Next Index

End If

Rs.Open "select 所属区域,图,位置 1,位置 2 from 警区表 where 所属区域='" + Combo2.Text + "' group by 所属区域,图,位置 1,位置 2 ", Cn, adOpenKeyset, adLockOptimistic

If Rs.RecordCount > 0 Then

Picture1.Picture = LoadPicture(App.Path & Rs.Fields("图"))

Do While Rs.EOF = False

i = Shape1.ubound + 1

Load Shape1(i)

Shape1(i).Left = Rs.Fields("位置 1")

Shape1(i).Top = Rs.Fields("位置 2")

Shape1(i).Visible = True

Rs.MoveNext

Loop

End If

Rs.Close

End Sub

'

Private Sub Timer1_Timer()

If Shape1(i).BackColor = &HFF& Then

Shape1(i).BackColor = &HFF00&

Else

Shape1(i).BackColor = &HFF&

End If

End Sub

'单击退出按钮，退出程序

Private Sub Command1_Click()

If Shape1.Count > 1 Then

For i = 1 To Shape1.Count - 1

Shape1(i).Visible = False

Next i

End If

Unload Me

End Sub

## 应用五：利用 PictureBox 控件浏览大幅图片

一些大幅 BMP 图片在有限的区域中很难全部显示，运用水平滚动轴控件 HScrollBar 和垂直滚动轴控件 VScrollBar 并配合 PictureBox 控件就可以实现浏览大幅图片。

运行程序，首先选择要浏览的 BMP 图片所在的路径，窗体右侧的列表框中将显示此路径下的所有 BMP 文件，如图 4 所示。在图片文件列表中用鼠标双击要浏览的 BMP 文件的名称即可进入“浏览大幅 BMP 图片-浏览”窗口，在该窗口中拖动滚动条即可看到 BMP 图片的其他部分；单击“上一张”或“下一张”按钮可以浏览此路径下的其他的 BMP 图片，效果如图 5 所示。

图 4 运行结果

若文件列表中的文件很多，可在“图片检索”文本框中输入图片文件名称的关键字，系统将自动执行模糊查询，并将查询结果显示在图片文件列表中。如图 5 所示。

图 5 浏览大幅 BMP 图片

完整主要程序代码：

（1）Form1 窗体完整代码：

'启动窗体并进行初始化

Private Sub Form_Load()

Dir1.Path = App.Path

Drive1.Drive = Dir1.Path

File1.Pattern = "*.bmp" '设置文件列表框显示文件格式

End Sub

Private Sub Dir1_Change() '选择文件夹

File1.Path = Dir1.Path

If File1.ListCount > 0 Then

Label2.Caption = "共" & File1.ListCount & "个文件" '获取 bmp 图片个数

File1.Pattern = Text1.Text

Else

form2.Pview.Picture = LoadPicture("")

Label2.Caption = ""

End If

End Sub

Private Sub Drive1_Change() '选择驱动器

Dir1.Path = Drive1.Drive

End Sub

'单击图片名称，在窗体 2 中显示图片

Private Sub File1_DblClick()

Load form2

form2.Show

Form1.Enabled = False

form2.Label1.Caption = Label2.Caption & " " & "第" & File1.ListIndex + 1 & "个文件"

Dim sfilename As String

Dim l As Long

Dim dwidth As Long, dheight As Long

If File1.ListCount <= 0 Then '文件列表框如果没有图片，取消操作

Exit Sub

End If

If Right(File1.Path, 1) <> "\" Then '判断选定文件

sfilename = File1.Path & "\" & File1.FileName

Else

sfilename = File1.Path & File1.FileName

End If

form2.Pscroll.Picture = LoadPicture("")

form2.Pscroll.Picture = LoadPicture(sfilename) '导入选定图片显示

If form2.Pscroll.Width < form2.Pview.ScaleWidth Then '判断是否给图片加水平滚动条

form2.Pscroll.Left = (form2.Pview.ScaleWidth - form2.Pscroll.Width) \ 2

form2.HScpic.Visible = False

Else

form2.Pscroll.Left = 0

form2.HScpic.Visible = True

form2.HScpic.Value = 0

On Error Resume Next

form2.HScpic.Max = form2.Pscroll.Width - form2.Pview.ScaleWidth

form2.HScpic.SmallChange = form2.Pscroll.Width \ 20

form2.HScpic.LargeChange = form2.Pscroll.Width \ 10

End If

If form2.Pscroll.Height < form2.Pview.Height Then '判断是否给图片加垂直滚动条

form2.Pscroll.Top = (form2.Pview.ScaleHeight - form2.Pscroll.Height) \ 2

form2.VScpic.Visible = True

Else

form2.Pscroll.Top = 0

form2.VScpic.Visible = True

form2.VScpic.Value = 0

form2.VScpic.Max = form2.Pscroll.Height - form2.Pview.ScaleHeight

form2.VScpic.SmallChange = form2.Pscroll.Height \ 20

form2.VScpic.LargeChange = form2.Pscroll.Height \ 10

End If

End Sub

Private Sub text1_Change() '检索图片

File1.Pattern = Text1.Text

Label2.Caption = "文件数目:" & Str(File1.ListCount) & "个文件"

End Sub

'退出程序

Private Sub Command1_Click()

End

End Sub

（2）form2 窗体完整程序代码

Private Sub HScpic_Change() '托动水平滚动条

Pscroll.Left = -HScpic.Value

End Sub

Private Sub VScpic_Change() '托动垂直滚动条

Pscroll.Top = -VScpic.Value

End Sub

'查看当前路径的上一张图片

Private Sub Command1_Click()

If Form1.File1.ListIndex > 0 Then

On Error Resume Next

Form1.File1.ListIndex = Form1.File1.ListIndex - 1

Label1.Caption = Form1.Label2.Caption & " " & "第" & Form1.File1.ListIndex + 1 & "个文件"

Dim sfilename As String

Dim dwidth As Long, dheight As Long

If Right(Form1.File1.Path, 1) <> "\" Then '判断文件路径

sfilename = Form1.File1.Path & "\" & Form1.File1.FileName

Else

sfilename = Form1.File1.Path & Form1.File1.FileName

End If

Pscroll.Picture = LoadPicture("")

On Error Resume Next

Pscroll.Picture = LoadPicture(sfilename) '导入图片

If Pscroll.Width < Pview.ScaleWidth Then '设置水平滚动条

Pscroll.Left = (Pview.ScaleWidth - Pscroll.Width) \ 2

HScpic.Visible = False

Else

Pscroll.Left = 0

HScpic.Visible = True

HScpic.Value = 0

On Error Resume Next

HScpic.Max = Pscroll.Width - Pview.ScaleWidth

HScpic.SmallChange = Pscroll.Width \ 20

HScpic.LargeChange = Pscroll.Width \ 10

End If

If Pscroll.Height < Pview.Height Then '设置垂直滚动条

Pscroll.Top = (Pview.ScaleHeight - Pscroll.Height) \ 2

VScpic.Visible = True

Else

Pscroll.Top = 0

VScpic.Visible = True

VScpic.Value = 0

VScpic.Max = Pscroll.Height - Pview.ScaleHeight

VScpic.SmallChange = Pscroll.Height \ 20

VScpic.LargeChange = Pscroll.Height \ 10

End If

Else

Exit Sub

End If

End Sub

'查看当前路径的下一张图片

Private Sub Command2_Click()

If Form1.File1.ListCount > Form1.File1.ListIndex + 1 Then

On Error Resume Next

Form1.File1.ListIndex = Form1.File1.ListIndex + 1

Label1.Caption = Form1.Label2.Caption & " " & "第" & Form1.File1.ListIndex + 1 & "个文件"

Dim sfilename As String

Dim dwidth As Long, dheight As Long

If Right(Form1.File1.Path, 1) <> "\" Then '判断图片路径

sfilename = Form1.File1.Path & "\" & Form1.File1.FileName

Else

sfilename = Form1.File1.Path & Form1.File1.FileName

End If

Pscroll.Picture = LoadPicture("")

On Error Resume Next

Pscroll.Picture = LoadPicture(sfilename)

If Pscroll.Width < Pview.ScaleWidth Then '设置水平滚动条

Pscroll.Left = (Pview.ScaleWidth - Pscroll.Width) \ 2

HScpic.Visible = False

Else

Pscroll.Left = 0

HScpic.Visible = True

HScpic.Value = 0

On Error Resume Next

HScpic.Max = Pscroll.Width - Pview.ScaleWidth

HScpic.SmallChange = Pscroll.Width \ 20

HScpic.LargeChange = Pscroll.Width \ 10

End If

If Pscroll.Height < Pview.Height Then '设置垂直滚动条

Pscroll.Top = (Pview.ScaleHeight - Pscroll.Height) \ 2

VScpic.Visible = True

Else

Pscroll.Top = 0

VScpic.Visible = True

VScpic.Value = 0

VScpic.Max = Pscroll.Height - Pview.ScaleHeight

VScpic.SmallChange = Pscroll.Height \ 20

VScpic.LargeChange = Pscroll.Height \ 10

End If

Else

Exit Sub

End If

End Sub

Private Sub Command3_Click() '返回主窗体

Form1.Enabled = True

Unload Me

End Sub

'退出窗体

Private Sub Form_Unload(Cancel As Integer)

Form1.Enabled = True

End Sub

## 应用六：如何获得 PictureBox 控件中的颜色

利用 PictureBox 控件的 Point 方法，可以获得 PictureBox 中任意一点的颜色。Point 方法可以返回一个 Long 类型的值，它即为表示颜色的 RGB 值。为了这个值能够更有效的使用，可以通过下面的公式获得颜色的 R、G、B 分量：

red = rgb Mod &H100

green = (rgb \ &H100) Mod &H100

blue = (rgb \ &H10000) Mod &H100

最终效果如图 6 所示。

图 6 获得 PictureBox 控件中的颜色值

程序代码如下：

★★★★★ Form1 ★★★★★★

'获得 PictureBox 控件中的颜色

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

Dim color As Long

Dim r As String, g As String, b As String

color = Picture1.Point(X, Y)

r = CStr(color Mod &H100)

g = CStr((color \ &H100) Mod &H100)

b = CStr((color \ &H10000) Mod &H100)

Text1.Text = "R " & r & ", G " & g & ", B " & b

Shape1.BackColor = color

End Sub

## 应用七：用 PictureBox 控件实现马赛克效果

在电视中经常可以看到马赛克效果。本实例介绍如何对图片进行马赛克效果处理。单击“网格”按钮，窗体中的图片将被一些网格所分割，呈现马赛克效果，如图所示。通过 PictureBox 控件的 PaintPicture 属性来实现在窗体的 Picture 控件中显示图片马赛克的效果。

最终效果如图 7 所示。

图 7 图片马赛克效果

程序代码如下：

★★★★★ Form1 ★★★★★★

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Dim stepheight, i, j, countx, county As Long

'窗体启动加载图片并初始化

Private Sub Form_Load()

Picture1.Picture = LoadPicture(App.Path & "\QT221.jpg")

Picture2.Width = Picture1.Width

Picture2.Height = Picture1.Height

countx = Picture1.ScaleHeight / 5

county = Picture1.ScaleWidth / 5

Picture2.Top = 20

Picture2.Left = (Me.Width - Picture2.Width) / 2

End Sub

'单击网格按钮实现马赛克效果

Private Sub Command3_Click() '网格

Picture1.Visible = False

Set Picture2.Picture = Nothing

For i = 0 To county - 1 Step 4

Picture2.PaintPicture Picture1.Picture, i * 5, 0, , , i * 5, 0, 5, Picture2.Height, vbSrcCopy

DoEvents

Sleep (10)

Next i

For i = 0 To countx - 1 Step 3

Picture2.PaintPicture Picture1.Picture, 0, i * 5, , , 0, i * 5, Picture2.Width, _

5, vbSrcCopy

DoEvents

Sleep (10)

Next i

For i = 0 To county - 1 Step 2

Picture2.PaintPicture Picture1.Picture, i * 5, 0, , , i * 5, 0, 5, Picture2.Height, vbSrcCopy

DoEvents

Sleep (10)

Next i

For i = 0 To countx - 1 Step 1

Picture2.PaintPicture Picture1.Picture, 0, i * 5, , , 0, i * 5, Picture2.Width, _

5, vbSrcCopy

DoEvents

Sleep (10)

Next i

End Sub

'退出程序

Private Sub Command4_Click()

End

End Sub

## 应用八：翻转图片效果

### 实例说明

在多媒体编程中经常会用到图像的翻转，本实例实现了图像的垂直翻转和水平翻转的效果。单击“垂直翻转”按钮，窗体中的图片将进行垂直翻转；单击“水平翻转”按钮，窗体中的图片将进行水平翻转，如图 8 所示。

图 8 翻转图片效果

### 思路与技术

通过 PictureBox 控件的 PaintPicture 属性来实现在窗体的 Picture 控件中进行图片翻转的效果。

PictureBox 控件的 PaintPicture 方法用于在 PictureBox 上绘制图形文件，其语法结构如下：

object.PaintPicture picture, x1, y1, width1, height1, x2, y2, width2, height2, opcode

参数说明：

l object 可选的。一个对象表达式。

l picture 必需的。用于设置要绘制到 object 上的图形源。

l x1, y1 必需的。均为单精度值，指定在 object 上绘制 picture 的目标坐标（x 轴和 y 轴）。object 的 ScaleMode 属性决定使用的度量单位。

l width1 可选的。单精度值，指示 picture 的目标宽度。object 的 ScaleMode 属性决定使用的度量单位。如果目标宽度比源宽度（width2）大或小，将适当地拉伸或缩小 picture。如果该参数省略，则使用源宽度。

l height1 可选的。单精度值，指示 picture 的目标高度。object 的 ScaleMode 属性决定使用的度量单位。如果目标高度比源高度（height2）大或小，将适当地拉伸或缩小 picture。如果该参数省略，则使用源高度。

l x2, y2 可选的。均为单精度值，指示 picture 内剪贴区的坐标（x 轴和 y 轴）。object 的 ScaleMode 属性决定使用的度量单位。如果该参数省略，则默认为 0。

l width2 可选的。单精度值，指示 picture 内剪贴区的源宽度。object 的 ScaleMode 属性决定使用的度量单位。如果该参数省略，则使用整个源宽度。

l height2 可选的。单精度值，指示 picture 内剪贴区的源高度。object 的 ScaleMode 属性决定使用的度量单位。如果该参数省略，则使用整个源高度。

l opcode 可选的。是长型值或仅由位图使用的代码。它用来定义在将图片绘制到 object 上时对图片执行的位操作（例如 vbMergeCopy 或 vbSrcAnd 操作符）。

注意：

opcode用于将按位操作传递到位图。当传递其他图像类型时将一个值赋给该参数会造成“无效过程调用或参数”错误，这是设计的原因。要避免这个错误，对于除位图外的图像，将Opcode参数置为空。

### 开发步骤

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

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

（3）在窗体上添加一个 CommandButton 控件数组（Command1(0)～Command1(1)），设置其 Caption 属性分别为“垂直翻转”和“水平翻转”；再添加一个 CommandButton 控件，设置其 Caption 属性为“退出”。

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

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

控件名 | 属性 | 值
CommandButton | Name Caption | Command1(0) 水平翻转
CommandButton | Name Caption | Command1(1) 垂直翻转
CommandButton | Name Caption | Command2 退出
PictureBox | Name | Picture1

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

Option Explicit

Dim bHort As Boolean

Dim bVert As Boolean

'实现图片的水平和垂直翻转

Private Sub Command1_Click(Index As Integer)

Dim pic As StdPicture

Set pic = Picture1.Picture

Picture1.Cls

Select Case Index

Case 0

bHort = Not bHort

Case 1

bVert = Not bVert

End Select

If bHort And bVert Then

Picture1.PaintPicture pic, Picture1.Width, Picture1.Height, _

Picture1.Width * -1, Picture1.Height * -1

ElseIf bHort And Not bVert Then

Picture1.PaintPicture pic, Picture1.Width, 0, _

Picture1.Width * -1, Picture1.Height

ElseIf Not bHort And bVert Then

Picture1.PaintPicture pic, 0, Picture1.Height, _

Picture1.Width, Picture1.Height * -1

Else

Picture1.PaintPicture pic, 0, 0

End If

End Sub

'退出程序

Private Sub Command2_Click()

End

End Sub

'窗体启动并初始化

Private Sub Form_Load()

Me.Left = (Screen.Width - Me.Width) / 2

Me.Top = (Screen.Height - Me.Height) / 2

End Sub

## 应用九：图像的锐化处理

### 实例说明

图像的锐化在编写图像处理方面的软件中应用得非常广泛。本实例演示的是图像锐化的效果。运行程序，单击“开始锐化”按钮，系统将对原始图片进行锐化，并将锐化后的图像显示在“锐化后效果图”图片框中。效果如图 1 所示。从图中可以看出，锐化后的图像棱角非常地清晰。

图 9 图像的锐化处理

### 思路与技术

利用 PictureBox 控件的 Point 方法与 PSet 方法来实现图像锐化的效果。

PictureBox 控件的 Point 方法用于返回 PictureBox 控件上指定磅的颜色，其语法格式如下：

object.Point(x, y)

参数说明：

l object 可选的，一个对象表达式。

l (x, y) 必需的。均为单精度值，指示 Form 或 PictureBox 的 ScaleMode 属性中该点的水平（x 轴）和垂直（y 轴）坐标。使用时必须用括号将这些值括起来。

利用 PictureBox 控件的 PSet 方法可以将对象上的点设置为指定颜色，PSet 方法的语法格式如下：

object.PSet [Step] (x, y), [color]

参数说明：

l object 可选的，对象表达式。

l Step 可选的。关键字，指定相对于由 CurrentX 和 CurrentY 属性提供的当前图形位置的坐标。

l (x, y) 必需的。数据类型为 Single（单精度浮点数），表示被设置点的水平（x 轴）和垂直（y 轴）坐标。

l color 可选的。数据类型为 Long（长整型数），用于为该点指定 RGB 颜色。如果它被省略，则使用当前的 ForeColor 属性值。可以用 RGB 函数或 QBColor 函数指定颜色。

### 开发步骤

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

（2）在窗体中添加两个 Frame 控件，分别设置其 Caption 属性为“锐化前效果图”和“锐化后效果图”。

（3）分别在 Frame1 和 Frame2 控件中各添加一个 PictureBox 控件。

（4）在窗体上添加一个 CommandButton 控件，设置其 Caption 属性为“开始锐化…”。

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

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

控件名 | 属性 | 值
CommandButton | Name Caption | Command1 开始锐化…
Frame | Name Caption | Frame1 锐化前效果图
Frame | Name Caption | Frame2 锐化后效果图
PictureBox | Name | Picture1
PictureBox | Name | Picture2

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

'单击开始锐化对图片进行锐化效果处理

Private Sub Command1_Click()

Dim r2, g2, b2 As Integer: Dim r1, g1, b1 As Integer

Dim c1 As Long: Dim c2 As Long: Dim x0 As Integer: Dim y0 As Integer

Screen.MousePointer = 11

Command1.Enabled = False

For x0 = 1 To 180

For y0 = 1 To Picture2.Height - 2

c1 = Picture1.Point(x0, y0)

r1 = (c1 And &HFF)

g1 = (c1 And 62580) / 256

b1 = (c1 And &HFF0000) / 65536

'获得 Picture1 中指定点(x0,y0)的 R、G、B 分量值

c2 = Picture1.Point(x0 - 1, y0 - 1)

r2 = (c2 And &HFF)

g2 = (c2 And 62580) / 256

b2 = (c2 And &HFF0000) / 65536

'获得 Picture1 中与(x0,y0)点相邻的点的 R、G、B 分量值

r1 = r1 + (r1 - r2) \ 2

g1 = g1 + (g1 - g2) \ 2

b1 = b1 + (b1 - b2) \ 2

'计算锐化后的 R、G、B 分量值

If r1 > 255 Then r1 = 255

If r1 < 0 Then r1 = 0

If b1 > 255 Then b1 = 255

If b1 < 0 Then b1 = 0

If g1 > 255 Then g1 = 255

If g1 < 0 Then g1 = 0

Picture2.PSet (x0, y0), RGB(r1, g1, b1)

'画出锐化后的(x0,y0)

Next y0

Next x0

Screen.MousePointer = 0

Command1.Enabled = True

End Sub

'窗体启动并初始化

Private Sub Form_Load()

Picture1.Picture = LoadPicture(App.Path + "\002.jpg")

Me.Left = (Screen.Width - Me.Width) / 2

Me.Top = (Screen.Height - Me.Height) / 2

End Sub

## 应用十：将位图转换为 GIF 图标

### 实例说明

在应用位图时，将图片格式转换为 GIF 格式可以减小图片文件的大小。运行程序，首先设置图片转换前的路径及转换格式后图片所要存放的路径，窗体中则显示了要进行转换格式的图片。单击“转换”按钮即可将位图转换为 GIF 格式。效果如图 10 所示。

图 10 将位图转换为 GIF 图标

### 思路与技术

使用 PictureBox 控件的 Scale 方法定义图像显示的坐标，通过 PictureBox 控件的 PSet 方法和 Point 方法逐点获取和设置图像上的点来实现将位图转换为 GIF 图标的功能。

### 开发步骤

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

（2）在窗体上添加两个 Label 控件，设置其 Caption 属性分别为“转换前路径”和“转换后路径”。

（3）在窗体上添加两个 TextBox 控件、一个 Image 控件、两个 PictureBox 控件和一个 CommonDialog 控件，设置 CommonDialog 控件的“名称”属性为 Common1；添加 4 个 CommandButton 控件，设置其 Caption 属性分别为“转换”、“退出”和“<<”，设置其“名称”属性分别为 Cmd_OK、Cmd_Cancel、Cmd_Select1 和 Cmd_Select2。

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

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

控件名 | 属性 | 值
CommandButton | Name Caption | Cma_Cancel 转换
CommandButton | Name Caption | Cma_OK 确定
CommandButton | Name Caption | Cm_select1 <<
CommandButton | Name Caption | Cma_select2 >>
CommonDialog | Name | Common1
Image | Name | Image1
Label | Name Caption | Label2 转换前路径
Label | Name Caption | Label3 转换所路径
PictureBox | Name | Picture1
PictureBox | Name | Picture2
TextBox | Name | Text1
TextBox | Name | Text2

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

Dim res As Integer

'点击转换按钮，将位图转换为 GIF 图标

Private Sub Cmd_OK_Click()

If Text2.Text = "" Or Text3.Text = "" Then

MsgBox "请选择转换前和转换后的文件路径!!", 48, "提示信息"

Else

Me.MousePointer = 11

Cmd_OK.Enabled = False

Dim i, j, w, h, w1, h1, k As Integer

w = Picture1.Width

h = Picture1.Height

w1 = w / 15

h1 = h / 15

Picture2.Width = w

Picture2.Height = h

Picture1.Scale (0, 0)-(w1, h1)

Picture2.Scale (0, 0)-(w1, h1)

For i = 1 To w1

For j = 1 To h1

Picture2.PSet (i, j), Picture1.Point(i, j)

Next j

Next i

Picture2.Picture = Picture2.Image

SavePicture Picture2.Image, Text3.Text & "." & Mid("*.GIF", 3, 5)

MsgBox "格式转换成功完成!!", 64, "提示信息"

Cmd_OK.Enabled = True

Me.MousePointer = 0

End If

End Sub

'设置转换前路径

Private Sub Cmd_select1_Click()

On Error GoTo x

Common1.Filter = "所有文件(*.*)|*.*"

Common1.ShowOpen

Text2.Text = Common1.FileName

Image1.Picture = LoadPicture(Text2.Text)

Picture1.Picture = Image1.Picture

Exit Sub

x:

MsgBox "无效图片！", 64, "提示信息"

End Sub

'设置转换后的路径

Private Sub Cmd_select2_Click()

Common1.Filter = "所有文件(*.*)|*.*"

Common1.ShowSave

Text3.Text = Common1.FileName

End Sub

Private Sub Command1_Click()

Picture1.Picture = LoadPicture()

Picture1.Picture = Image1.Picture

End Sub