第 11章 图形处理和多媒体编程
人民邮电出版社
21世纪高等学校计算机基础教育系列教材第 11章 图形与图像坐标系统
Visual Basic中,每个对象都一个相对其容器的坐标,也就是说,每个对象都是存在于一个容器中的,例如,
窗体的容器是整个屏幕,而窗体中的每个控件的容器就是这个窗体或者是窗体中的某个容器控件(如图形框等)。对于每一个容器来说,都需要有一个坐标系,在中学数学中讲过:
构成一个坐标系需要有以下三个要素:
坐标原点,坐标度量单位,坐标轴的长度与单位。坐标度量单位由容器的
ScaleMode属性决定,ScaleMode属性设置如表所示属性设置值单 位
0 用户定义( user)
1 Twip (缺省值)
2 Point(磅)
3 Pixel(像素点)
4 Character(字符)
5 Inch(英寸)
6 Millimeter(毫米)
7 Centimeter(厘米)
自定义坐标系统用户可以通过以下两种方法来自行定义坐标系统。其中方法一:
通过对象的 ScaleTop,ScaleLeft,ScaleHeight,ScaleWidth四个属性来改变:
( ScaleTop,ScaleLeft)的值用来设置控件对象的的左上角坐标,在默认情况下,这个属性的值均为 0,当这两个属性的值发生改变后,坐标系的 x轴和 y轴都将平移形成新的坐标系。
重定义坐标系的第二种方法:采用 Scale方法来设置坐标系。 Scale方法是建立用户坐标系的一种方便的方法。语法结构如下:
Object.Scale (x1,y1) - (x2,y2)
第 11章 图形与图像绘图属性
1,当前坐标( CurrentX,CurrentY属性)
2,线条的粗细( DrawWidth属性)
3,线条类型( DrawStyle属性)
4,填充类型( FillStyle属性)
5,使用颜色
1,使用系统中的常量来表示。
这种方法就是使用系统所提供的几种颜色常量,如 VBRed,VBGreen等,这种方法表示的颜色种类比较少,所以不能满足 Visual Basic绘图的需要。
2,使用 RGB()函数这是一种能够表示 224种颜色方法,这个函数的使用语法如下,RGB( R,G,B)
R,G,B三个参数的取值范围为 [0,255]共有 256个值。所以可以表示的颜色的种类为 256*256*256种。但是计算机能够显示的颜色的种类要受到计算机的显示适配器的限制。
3,使用 QBColor()函数这种方法也只能产生 16种颜色,就是采用 QuickBasic所提供的 16种颜色,该函数的语法如下所示,QBColor( n) n的取值范围是,[0,15]
第 11章 图形与图像图形方法
1,Line 方法
Line 方法的作用是在对象上画直线和矩形。它的语法格式如下所示:
Object.Line [Step] (x1,1) [Step] (x2,y2),[Color],[B][F]
2.Circle 方法在对象上画圆、椭圆或弧。这种方法的语法是:
Object.Circle [Step] (X,Y),Radius,[Color,Start,End,Aspect]
3.PSet 方法将对象上的点设置为指定颜色。这种方法的语法为:
Object.PSet [Step] (x,y),[Color]
4.Point 方法按照长整数,返回在 Form 或 PictureBox 上所指定磅的红 -绿 -蓝 (RGB) 颜色。不支持命名参数。其语法如下:
Object.Point(x,y)
5.PaintPicture 方法用以在 Form,PictureBox 或 Printer 上绘制图形文件
(,bmp,.wmf,.emf,.cur,.ico或,dib)的内容。不支持命名参数。其语法格式如下:
Object.PaintPicture picture,x1,y1,width1,height1,x2,y2,width2,height2,opcode
设计步骤:
1,在窗体中创建两个大小相同的图片框
( picturebox),分别命名为 picture1
和 picture2,其中 picture1
的图片 picture属性要指定,
缩小窗体的宽度,使得
picture1不可见,然后创建三个按钮,分别为
command1,command2
和 command3
用来一百叶窗的形式显示图像的方法,可以实现横向和纵向的显示。
‘横向扫描图像
Private Sub Command1_Click()
On Error Resume Next
Picture2.Cls
Dim cstep,i,cnum As Long
Picture2.Width = Picture1.Width
Picture1.Height = Picture1.Height
cstep = 20
cnum = Picture1.ScaleWidth / cstep
For i = 0 To cnum Step 2
Picture2.PaintPicture Picture1,i * cstep,0,cstep,Picture1.Height,_
i * cstep,0,cstep,Picture1.Height,VBSrcCopy
For j = 0 To 50000
Next j
Next i
For i = 1 To cnum Step 2
Picture2.PaintPicture Picture1,i * cstep,0,cstep,Picture1.Height,_
i * cstep,0,cstep,Picture1.Height,VBSrcCopy
For j = 0 To 50000
Next j
Next i
End Sub
纵向扫描图像
Private Sub Command2_Click()
On Error Resume Next
Picture2.Cls
Dim cstep,i,cnum As Long
Picture2.Width = Picture1.Width
Picture1.Height = Picture1.Height
cstep = 20
cnum = Picture1.ScaleHeight / cstep
For i = 0 To cnum Step 2
Picture2.PaintPicture Picture1,0,i * cstep,Picture1.Width,cstep,0,_
i * cstep,Picture1.Width,cstep,VBSrcCopy
For j = 0 To 50000
Next j
Next i
For i = 1 To cnum Step 2
Picture2.PaintPicture Picture1,0,i * cstep,Picture1.Width,cstep,0,_
i * cstep,Picture1.Width,cstep,VBSrcCopy
For j = 0 To 50000
Next j
Next i
End Sub
百叶窗效果显示
PictureBox和 ImageBox的使用
PictureBox控件和 ImageBox控件都适用于一个特定的功能目的,
ImageBox控件所需要的系统资源较少,但是它包含了 PictureBox的可用的属性、方法和事件的子集。也就是说 ImageBox控件比 PictureBox控件在程序运行时要显示的快一些。使用图形控件比使用图形方法而言要少许多的代码,Visual Basic提供的图片框和图像框可以显示的图形格式有以下几种:位图( *.bmp/*.dib)、图标( *.ico/*.cur)、图元文件
( *.wmf/*.emf),gif,jpeg(*.jpg)等格式的文件。也就是说,在我们所介绍的这两种控件中,我们都可以给它设置或者装入我们前面所介绍的各种格式的图形。在装入图形的时候有两种方法,第一种就是在设计时设置图片框或者图像框的 picture属性,另一种方法是在运行时动态地加载图片文件,这里要用到一个方法,LoadPicture方法,LoadPicture方法的使用语法格式为:
Image1.picture=LoadPicture(“c:\Windows\forest.bmp”)
Picure1.picture=LoadPicture(“c:\Windows\forest.bmp”)
绘制图形图形控件
1,Shape控件 2,Line控件图形控件与动画曲柄滑块机构的演示 。 利用 Timer控件来控制图形控件的转动,如图所示 。
曲柄滑块机构 用户界面的设计设计步骤如下:
(1) 建立应用程序用户界面。
(2) 设置对象属性
(3) 编写程序代码。
在通用模块中声明符号常数及窗体级变量:
Const pi = 3.14159
Dim X0 As Single,Y0 As Single,t As Integer
编写窗体的 Load事件代码:
Private Sub Form_Load()
With Shape1
.Tag =,Width / 2 ' 圆的半径
X0 =,Left +,Tag ' 圆心的 x坐标
Y0 =,Top +,Tag ' 圆心的 y坐标
End With
With Line1 ' 连杆的长
.Tag = Sqr((.X1 –,X2) ^ 2 + (.Y1 –,Y2) ^ 2)
End With
End Sub
编写 Timer1的 Timer事件代码:
Private Sub Timer1_Timer()
t = t + 1
Shape3.Left = X0 + Shape1.Tag * Sin(pi * t / 30) – 30
Shape3.Top = Y0 – Shape1.Tag * Cos(pi * t / 30) + 30
Line1.X1 = Shape3.Left + 30
Line1.Y1 = Shape3.Top + 30
Line1.X2 = Shape3.Left + Sqr(Line1.Tag ^ 2 – (Shape3.Top – Y0) ^ 2)
Line2.X1 = Line1.X1
Line2.Y1 = Line1.Y1
Shape2.Left = Line1.X2
End Sub
编写命令按钮 Command1的 Click事件代码:
Private Sub Command1_Click()
If Command1.Caption = "暂停 (&S)" Then
Command1.Caption = "继续 (&C)"
Timer1.Enabled = False
Else
Command1.Caption = "暂停 (&S)"
Timer1.Enabled = True
End If
End Sub
2,输出图形和文本利用图片框输出文本与图形,如图所示 。
利用图片框输出文本与图形设计步骤如下:
(1) 首先按照表 11-15所示的菜单项设计菜单。然后在窗体上增加一个图片框
(2) 编写程序代码 。
编写窗体的 Paint事件代码:
Private Sub Form_Paint()
Const pi = 3.14159
With Picture1
.Top = 0
.Left = 0
.Width = Me.ScaleWidth
.Height = Me.ScaleHeight
.ScaleMode = 6
oldx =,ScaleWidth / 2
oldy =,ScaleHeight / 2
.Cls
' 画坐标轴
Picture1.Line (oldx,0)–(oldx,.ScaleHeight),RGB(255,0,0)
Picture1.Line (0,oldy)–(.ScaleWidth,oldy),RGB(255,0,0)
End With
Picture1.CurrentX = oldx – 4,Picture1.CurrentY = oldy + 0.5
Picture1.Print 0
' 画 x轴的刻度
For xt = –Int(oldx) To Int(oldx) Step 0.5
If xt <> 0 Then
st = xt * 10 * pi
Picture1.CurrentX = oldx + st – 3,Picture1.CurrentY = oldy + 0.5
Picture1.Print xt & "π"
Picture1.Line (oldx + st,oldy – 1)–(oldx + st,oldy),RGB(255,0,0)
End If
Next xt
' 画 y轴的刻度
For yt = –5 To 7
If yt <> 0 Then
st = yt * 10
Picture1.CurrentX = oldx – 4,Picture1.CurrentY = oldy + st – 1
Picture1.Print yt
Picture1.Line (oldx,oldy + st)–(oldx + 1,oldy + st),RGB(255,0,0)
End If
Next yt
End Sub
编写,三角函数,子菜单的 Click事件代码:
Private Sub hs1_Click(Index As Integer)
oldx = Picture1.ScaleWidth / 2
oldy = Picture1.ScaleHeight / 2
Select Case Index
Case 0
For t = –oldx To oldx Step 0.01
xt = 10 * t
yt = 10 * Sin(t)
Picture1.PSet (xt + oldx,oldy – yt),RGB(0,127,127)
Next
Case 1
For t = –oldx To oldx
Step 0.01
xt = 10 * t
yt = 10 * Cos(t)
Picture1.PSet (xt + oldx,
oldy – yt),RGB(0,127,127)
Next
Case 2
Picture1.Cls
Form_Paint
Exit Sub
End Select
End Sub
编写,摆线,子菜单的 Click事件代码:
Private Sub m_Click(Index As Integer)
n = Index
Select Case n
Case 0
a = 12,b = 8
Case 1
a = 12,b = 4
Case 2
a = 12,b = 3
Case 3
a = 12,b = 2.4
Case 4
a = 12,b = 2
Case 5
Picture1.Cls
Form_Paint
Exit Sub
End Select
oldx = Picture1.ScaleWidth / 2
oldy = Picture1.ScaleHeight / 2
For t = 0 To 4 * 3.14159 Step 0.01
xt = (a + b) * Cos(t) – b * Cos((a + b) * t / b)
yt = (a + b) * Sin(t) – b * Sin((a + b) * t / b)
Picture1.PSet (xt + oldx,oldy – yt),vbBlue
Next t
End Sub
声音的播放播放声音的控件
Visual Basic中,要产生声音是一个很简单的事情,可以直接使用
beep语句,就能产生简单的笛笛声,这种声音随着计算机的软硬件系统的不同而不同。另一种产生声音的方法是调用 MciExecute函数来播放 wav
文件和 midi文件。
MciExecute函数是 Windows的 API函数,在使用前需要先添加一个模块对它进行声明,然后再进行调用。
声明函数的语句如下:
Declare Function mciexecute Lib "winmm" (ByVal commandstring As
String) As Long
调用函数使用下面的代码:
Private Sub Command1_Click()
Dim ms As Long
ms = mciexecute("d:\bg.mid")
End Sub
但是,这种方法用起来还是不方便,程序员可以使用一个专用的控件来播放声音。这个控件就是 Microsoft Multimedia Control 6.0
( MMcontorl),如图。
要通过该控件播放声音,必须明确该控件的以下属性:
Devicetype属性:确定要播放的声音文件的类型。
Filename 属性:指定要播放的声音文件的文件名。
Command属性:指定 MMcontrol控件要做的工作。