@H_
502_0@单元七 图形图像处理
@H_
502_0@[学习目标] 熟悉VB.NET绘制图形的有关概念、常用的类、对象、
属性和
方法等基础知识,熟悉开发绘制图形、浏览图形、图形动画程序的流程、
方法、和技巧。
@H_
502_0@7.1 图形的绘制
@H_
502_0@[案例7-1] 仿Windows画图程序
@H_
502_0@本案例模仿Windows画图程序,有
菜单栏和工具栏。单击工具栏上的相应按钮选择要画的图形;在画笔颜色处单击色块调出调色板,选择颜色;单击画笔宽度中需要的线条决定所画边框的粗细。将鼠标移到绘图区相应的位置按住左键拖到适当位置放开即绘出了相应图形。此案例的运行界面如图7-1所示。
@H_
502_0@[技能目标]
@H_
502_0@1.熟悉Point/Pointf、Size/Sizef、Rectangle/Rectanglef对象。
@H_
502_0@2.熟悉颜色、画笔、画刷的使用
方法。
@H_
502_0@3.熟悉Graphics的各种绘绘制图形的
方法。
@H_
502_0@4.掌握图形的平移变换、旋转变换和比例变换的
方法。
@H_
502_0@图7-1 仿Windows画图程序主界面
@H_
502_0@[操作要点与步骤]
@H_
502_0@1.建立一个新的Windows应用程序,命名为vbnet7-1。
@H_
502_0@2.在窗体上
添加如下控件:一个Mainmenu控件设计
菜单,一个ToolBar控件设计绘图工具栏,一个Picture
Box作为本程序画板,用二个Lable控件让
用户选择颜色和选择画笔宽标志,5个button控件让用选择画笔宽度,一个ColorDialog 控件做调色板,一个ImageList控件,一个OpenFileDialog控件,一个StatusBar作为状态信息栏。调整窗体上各控件的大小及位置。
@H_
502_0@3. 设置各控件的相关
属性,
属性值设置如表7-1
@H_
502_0@表7-1 画图程序各控件
属性设置
@H_
502_0@控件类别 控件命名
属性名
属性值
@H_
502_0@Form Form1 Text Vbnet7-1
@H_
502_0@Icon Mydraw.ico
@H_
502_0@Menu MainMenu1
@H_
502_0@Mainmenu Mainmenu1
@H_
502_0@mFile text
文件(&F)
@H_
502_0@mNew text 新建(&N)
@H_
502_0@mExit text
退出(&X)
@H_
502_0@MenuItem1 text 编辑(&E)
@H_
502_0@MenuItem3 text 复制(&C)
@H_
502_0@MenuItem4 text 剪切(&V)
@H_
502_0@MenuItem5 text 粘贴(&P)
@H_
502_0@ToolBar ToolBar1 ImageList ImageList1
@H_
502_0@ShowTip Ture
@H_
502_0@ImageList ImageList1 TransparentColor TransParent
@H_
502_0@OpenFileDialog OpenFileDiagle1 Filter 图标
文件|*.ico
@H_
502_0@ColorDialog ColorDialog1 Color Black
@H_
502_0@lbcolor Lbcolor1 BackColor Blue
@H_
502_0@StatusBar StatusBar1 ShowPannels Ture
@H_
502_0@StatusBarPanel1 text 制作人:
@H_
502_0@BorderStyle Raised
@H_
502_0@AutoSize Contents
@H_
502_0@StatusBarPanel2 text Wendy
@H_
502_0@BorderStyle Raised
@H_
502_0@AutoSize None
@H_
502_0@StatusBarPanel3 text 版本:
@H_
502_0@BorderStyle Raised
@H_
502_0@AutoSize Contents
@H_
502_0@StatusBarPanel4 text Ver1.0
@H_
502_0@BorderStyle Raised
@H_
502_0@AutoSize None
@H_
502_0@Picture
Box Picture
Box1 BackColor White
@H_
502_0@Button Butpen1 Backcolor Black
@H_
502_0@Butpen2 Backcolor Black
@H_
502_0@Butpen3 Backcolor Black
@H_
502_0@Butpen4 Backcolor Black
@H_
502_0@Butpen5 Backcolor Black
@H_
502_0@label Label1 text 画笔颜色
@H_
502_0@Label2 text 画笔宽度
@H_
502_0@为ImageList1控件
添加图标。
@H_
502_0@单击ImageList1的Images
属性右侧的"…"按钮,弹出如图7-2所示"Image集合编辑器"对话框,在窗口中单击"
添加"按钮为ImageList1
添加图标。
@H_
502_0@没有设置
属性的控件及所有
属性均为默认值,以后的案例中
属性说明与此相同。
@H_
502_0@4.为工具栏ToolBar控件
添加按钮。
@H_
502_0@单击ToolBar1控件的Buttons
属性右侧的"…"按钮,弹出"ToolBarButton集合编辑器",在窗口中单击"
添加"按钮为ToolBarButton1
添加按钮,按钮命名如图7-3所示。
@H_
502_0@除了TPenil1按钮的Pushed
属性为Ture外,其余按钮的Pushed
属性均为False,即程序刚运行时,只有"铅笔工具"的按钮处于按下状态,默认
用户选择的是"铅笔工具"。
@H_
502_0@5.以上步骤完成的界面设计及控件
属性设置,可进行
代码编写了。
@H_
502_0@(1)在Form1类里定义
全局变量和mSelect枚举。
@H_
502_0@Dim g As Graphics '定义Graphics对象
@H_
502_0@Dim pstart As Point,pend As Point '定义画图的起始点,终点
@H_
502_0@Dim mChoice As Integer '选择图形枚举
@H_
502_0@Dim mWidth As Integer '画笔宽度
@H_
502_0@Dim mIcon As Icon '
用户选择图标
@H_
502_0@Enum mSelect '选择图形类别枚举
@H_
502_0@Pencil '铅笔
@H_
502_0@Line '直线
@H_
502_0@Rec '矩形
@H_
502_0@FillRec '填充矩形
@H_
502_0@StyleRec '风格矩形
@H_
502_0@Ellipse '椭圆
@H_
502_0@FillEllipse '填充椭圆
@H_
502_0@StyleEllipse '风格椭圆
@H_
502_0@Icon '图标
@H_
502_0@Eraser '橡皮
@H_
502_0@End Enum
@H_
502_0@(2) Form1的Load事件中初始化
全局变量和Graphics对象。
@H_
502_0@Private Sub Form1_Load(ByVal sender As Object,ByVal e As System.EventArgs) Handles MyBase.Load
@H_
502_0@g = Picture
Box1.CreateGraphics
@H_
502_0@mChoice = mSelect.Pencil '默认选择为铅笔工具
@H_
502_0@mWidth = 2 '初始化画笔宽度
@H_
502_0@End Sub
@H_
502_0@(3) 定义转换坐标起点和终点的过程Convert_Point()。转换坐标起始点和终点,确保起始点始终在终点的左上方。
代码如下:
@H_
502_0@Private Sub Convert_Point()
@H_
502_0@Dim ptemp As Point '用于交换的临时点
@H_
502_0@If pstart.X < pend.X Then
@H_
502_0@If pstart.Y > pend.Y Then
@H_
502_0@ptemp.Y = pstart.Y
@H_
502_0@pstart.Y = pend.Y
@H_
502_0@pend.Y = ptemp.Y
@H_
502_0@End If
@H_
502_0@End If
@H_
502_0@If pstart.X > pend.X Then
@H_
502_0@If pstart.Y < pend.Y Then
@H_
502_0@ptemp.X = pstart.X
@H_
502_0@pstart.X = pend.X
@H_
502_0@pend.X = ptemp.X
@H_
502_0@End If
@H_
502_0@If pstart.Y > pend.Y Then
@H_
502_0@ptemp = pstart
@H_
502_0@pstart = pend
@H_
502_0@pend = ptemp
@H_
502_0@End If
@H_
502_0@End If
@H_
502_0@End Sub
@H_
502_0@(4) 双击ToolBar1控件,编写ToolBar1的 ButtonClick事件
代码:
@H_
502_0@'工具栏按钮单击事件
@H_
502_0@Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object,ByVal e As_
@H_
502_0@System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick
@H_
502_0@Dim i As Integer
@H_
502_0@For i = 0 To ToolBar1.Buttons.Count - 1
@H_
502_0@'使每个按钮都处于未按下状态
@H_
502_0@ToolBar1.Buttons.Item(i).Pushed = False
@H_
502_0@Next
@H_
502_0@'记录选择的图形
@H_
502_0@mChoice = ToolBar1.Buttons.IndexOf(e.Button)
@H_
502_0@e.Button.Pushed = True '
用户单击的按钮处于按下状态
@H_
502_0@If mChoice = mSelect.Icon Then
@H_
502_0@'如果选择的是画图标,则打开OpenFileDialog选取图标
@H_
502_0@If OpenFileDialog1.ShowDialog = DialogResult.OK Then
@H_
502_0@mIcon = New Icon(OpenFileDialog1.FileName)
@H_
502_0@End If
@H_
502_0@End If
@H_
502_0@End Sub
@H_
502_0@(5) 双击lbcolor控件,进入lbcolor的Click事件,选择画笔颜色。
代码如下:
@H_
502_0@Private Sub lbcolor_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)_
@H_
502_0@Handles lbcolor.Click
@H_
502_0@'打开调色板,并把
用户选择的颜色赋给lbcolor的背景色
@H_
502_0@If ColorDialog1.ShowDialog = DialogResult.OK Then
@H_
502_0@lbcolor.BackColor = ColorDialog1.Color
@H_
502_0@End If
@H_
502_0@End Sub
@H_
502_0@(6) 编写选择画笔宽度的共享事件过程btnpen_Click()
代码。
@H_
502_0@Private Sub btnpen_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _
@H_
502_0@Handles btnpen1.Click,btnpen2.Click,btnpen3.Click,btnpen4.Click,btnpen5.Click
@H_
502_0@'把所有按钮的背景色都设为Black
@H_
502_0@btnpen1.BackColor = Color.Black
@H_
502_0@btnpen2.BackColor = Color.Black
@H_
502_0@btnpen3.BackColor = Color.Black
@H_
502_0@btnpen4.BackColor = Color.Black
@H_
502_0@btnpen5.BackColor = Color.Black
@H_
502_0@'
用户选中的按钮背景色为Blue
@H_
502_0@CType(sender,Button).BackColor = Color.Blue
@H_
502_0@'把画笔宽度设为
用户选择按钮的Tag值
@H_
502_0@mWidth = CType(sender,Button).Tag
@H_
502_0@End Sub
@H_
502_0@(7) 为 Pictrue
Box1的MouseDown(鼠标按下)事件编写
代码。
@H_
502_0@在Form1的
代码窗口中,在左侧的对象下拉列表框中选择Picture
Box1,然后在右侧的事件下拉列表框中选择MouseUP,此时
代码编辑器中已经
自动生成了Picture
Box1_MouseUp的事件码,并把鼠标定位于事件过程内部的第一行,在该过程中编写如下
代码。
@H_
502_0@'画板鼠标按下事件
@H_
502_0@Private Sub Picture
Box1_MouseDown(ByVal sender As Object,ByVal e As_ System.Windows.Forms.MouseEventArgs) Handles Picture
Box1.MouseDown
@H_
502_0@If e.Button = MouseButtons.Left Then
@H_
502_0@'如果
用户按下的是鼠标左键,则将当前点坐标赋给起始点
@H_
502_0@pstart.X = e.X
@H_
502_0@pstart.Y = e.Y
@H_
502_0@End If
@H_
502_0@End Sub
@H_
502_0@(8)为 Pictrue
Box1的MouseUp(鼠标释放)事件编写
代码。
@H_
502_0@'画板上
用户按下鼠标后又释放的事件
@H_
502_0@Private Sub Picture
Box1_MouseUp(ByVal sender As Object,ByVal e As_
@H_
502_0@System.Windows.Forms.MouseEventArgs) Handles Picture
Box1.MouseUp
@H_
502_0@If e.Button = MouseButtons.Left Then
@H_
502_0@'如果
用户按下的是鼠标左键,记录终点坐标
@H_
502_0@pend.X = e.X
@H_
502_0@pend.Y = e.Y
@H_
502_0@'根据保存的mChoice绘制图形
@H_
502_0@Select Case mChoice
@H_
502_0@Case mSelect.Line '
用户在工具栏中选择的是铅笔
@H_
502_0@Dim pen1 As New Pen(lbcolor.BackColor,mWidth)
@H_
502_0@g.DrawLine(pen1,pstart,pend) '根据起点和终点绘制直线
@H_
502_0@Case mSelect.Rec '
用户在工具栏中选择的是空心矩形
@H_
502_0@Convert_Point() '转换矩形的起点为其左上点
@H_
502_0@Dim pen1 As New Pen(lbcolor.BackColor,mWidth)
@H_
502_0@g.DrawRectangle(pen1,pstart.X,pstart.Y,_
@H_
502_0@pend.X - pstart.X,pend.Y - pstart.Y) '根据起点和终点绘制空心矩形
@H_
502_0@Case mSelect.FillRec '
用户在工具栏中选择的是填充矩形
@H_
502_0@Convert_Point() '转换矩形的起点为其左上点
@H_
502_0@Dim rec As New Rectangle(pstart.X,pend.Y - pstart.Y) '根据起点和终点定义矩形
@H_
502_0@Dim sbr As New SolidBrush(lbcolor.BackColor) '定义画刷颜色为
用户选择的颜色
@H_
502_0@g.FillRectangle(sbr,rec) '绘制填充矩形
@H_
502_0@Case mSelect.StyleRec '
用户在工具栏中选择的是风格矩形
@H_
502_0@Convert_Point() '转换矩形的起点为其左上点
@H_
502_0@Dim rec As New Rectangle(pstart.X,pend.Y - pstart.Y) '根据起点和终点定义矩形
@H_
502_0@' 定义画刷风格为Cross型,前景色为白色,背景色为
用户选择
@H_
502_0@Dim hbr As New HatchBrush(HatchStyle.Cross,Color.White,lbcolor.BackColor)_
@H_
502_0@g.FillRectangle(hbr,rec) '用画刷填充矩形
@H_
502_0@Case mSelect.Ellipse '
用户在工具栏中选择的是空心椭圆
@H_
502_0@Convert_Point() '转换椭圆外接矩形的起点为其左上点
@H_
502_0@Dim pen1 As New Pen(lbcolor.BackColor,mWidth)
@H_
502_0@g.DrawEllipse(pen1,pend.Y - pstart.Y) '根据椭圆外接矩形的起点和终点绘制椭圆
@H_
502_0@Case mSelect.FillEllipse '
用户在工具栏中选择的是填充椭圆
@H_
502_0@Convert_Point() '转换椭圆外接矩形的起点为其左上点
@H_
502_0@Dim rec As New Rectangle(pstart.X,pend.Y - pstart.Y) '定义椭圆的外接矩形
@H_
502_0@Dim sbr As New SolidBrush(lbcolor.BackColor) '定义画刷颜色为
用户选择的颜色
@H_
502_0@g.FillEllipse(sbr,rec) '用画刷填充矩形
@H_
502_0@Case mSelect.StyleEllipse '
用户在工具栏中选择的是风格椭圆
@H_
502_0@Convert_Point() '转换椭圆外接矩形的起点为其左上点
@H_
502_0@Dim rec As New Rectangle(pstart.X,pend.Y - pstart.Y) '定义椭圆的外接矩形
@H_
502_0@' 定义画刷风格为Cross型,前景色为白色,背景色为
用户选择
@H_
502_0@Dim hbr As New HatchBrush(HatchStyle.Cross,lbcolor.BackColor)_
@H_
502_0@g.FillEllipse(hbr,rec) '用画刷填充矩形
@H_
502_0@End Select
@H_
502_0@End If
@H_
502_0@End Sub
@H_
502_0@(9) 为 Pictrue
Box1的MouseMove(鼠标移动)事件编写
代码。
@H_
502_0@'画板鼠标移动事件
@H_
502_0@Private Sub Picture
Box1_MouseMove(ByVal sender As Object,ByVal e As_
@H_
502_0@System.Windows.Forms.MouseEventArgs) Handles Picture
Box1.MouseMove
@H_
502_0@If e.Button = MouseButtons.Left Then
@H_
502_0@'如果
用户按下的是鼠标左键,根据保存的mChoice绘制图形
@H_
502_0@Select Case mChoice
@H_
502_0@Case mSelect.Pencil '
用户在工具栏中选择的是铅笔
@H_
502_0@Dim pen1 As New Pen(lbcolor.BackColor,mWidth)
@H_
502_0@pend.X = e.X
@H_
502_0@pend.Y = e.Y
@H_
502_0@g.DrawLine(pen1,pend)
@H_
502_0@pstart = pend '将已经绘制的终点作为下一次的绘制的起点
@H_
502_0@Case mSelect.Eraser '
用户在工具栏中选择的是橡皮
@H_
502_0@Dim pen1 As New Pen(Color.White,mWidth) '定义白色画笔作为擦除
效果
@H_
502_0@pend.X = e.X
@H_
502_0@pend.Y = e.Y
@H_
502_0@g.DrawLine(pen1,pend) '将已经绘制的终点作为下一次的绘制的起点
@H_
502_0@pstart = pend '将已经绘制的终点作为下一次的绘制的起点
@H_
502_0@End Select
@H_
502_0@End If
@H_
502_0@End Sub
@H_
502_0@(10) 为 Pictrue
Box1的Mouse的Click(鼠标单击)事件编写
代码。
@H_
502_0@Private Sub Picture
Box1_Click(ByVal sender As Object,ByVal e As System.EventArgs) Handles _
@H_
502_0@Picture
Box1.Click
@H_
502_0@If mChoice = mSelect.Icon Then
@H_
502_0@'画图标
@H_
502_0@g.DrawIcon(mIcon,pstart.Y)
@H_
502_0@End If
@H_
502_0@End Sub
@H_
502_0@(11) 为mNew"新建"
菜单的Click事件编写
代码。
@H_
502_0@'"新建"
菜单项单击事件
@H_
502_0@Private Sub mNew_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles _
@H_
502_0@mNew.Click
@H_
502_0@Picture
Box1.Refresh() '刷新Picture
Box1
@H_
502_0@End Sub
@H_
502_0@(12) 为mExit"
退出"
菜单的Click事件编写
代码。
@H_
502_0@'"
退出"
菜单项单击事件
@H_
502_0@Private Sub mExit_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles _
@H_
502_0@mExit.Click
@H_
502_0@Application.Exit() '
退出程序
@H_
502_0@End Sub
@H_
502_0@至此,基本
代码编写完成,按F5或工具栏上的运行按钮,即可运行程序,
用户可以画图了。
@H_
502_0@[相关知识]
@H_
502_0@图形程序设计需用到相关基础
支持类与结构,如位置、大小,常用点(Point)、矩形(Rectangle)、大小(Size)等Structure(结构)来表示范围。
@H_
502_0@1. Point/Pointf结构
@H_
502_0@Point/Pointf结构主要用于设置控件在窗体中所在位置的坐标点,即表示一个二维(X,Y)坐标。二者差别在于:Point使用整数坐标,而Pointf使用单精度浮点数据类型坐标。
@H_
502_0@(1)声明
方法
@H_
502_0@Point结构声明
方法如下:
@H_
502_0@Dim p As New Point(整数X,整数Y)
@H_
502_0@例:Dim p As New Point(10,20) '定义了一个X坐标是10,Y坐标是20的点
@H_
502_0@Pointf结构声明与Point相似,即直接指定坐标点X、Y的单精度浮点数值,
方法如下:
@H_
502_0@Dim p As New Pointf(单精度浮点X,单精度浮点Y)
@H_
502_0@(2)Point结构其他
属性、
方法与
功能
@H_
502_0@①Offset
方法
@H_
502_0@
功能:设置坐标点位移。例如:
@H_
502_0@Dim p As New Point(10,20) '定义一个坐标为(10,20)的点
@H_
502_0@p.offset(20,30) '将p点平移到坐标点(30,50)处
@H_
502_0@②Equals
方法
@H_
502_0@
功能:表示如果两个点的坐标相同,则返回True,否则返回False。
@H_
502_0@③IsEmpty
属性
@H_
502_0@
功能:如果某点的X坐标和Y坐标都是为0,则返回True,否则返回False。
@H_
502_0@例:
@H_
502_0@Dim x As Boolean '定义一个逻辑变量x
@H_
502_0@Dim pAs New Point(0,0) '定义一个坐标点为(0,0)的点
@H_
502_0@x = p.IsEmpty()
@H_
502_0@2. Size/Sizef结构
@H_
502_0@Size/Sizef是GDI+绘图中常用到的结构,用Width(宽度)和Height(高度)两个
属性来表示其大小。
@H_
502_0@声明
方法:Dim s As New Size(Width,Height)
@H_
502_0@3. Rectangle/Rectanglef结构
@H_
502_0@Rectangle/RectangleF结构用来定义一个矩形区域,二者区别在于Rectangle结构的坐标是整型,RectangleF结构的坐标是浮点型。
@H_
502_0@(1)声明
方法:
@H_
502_0@Dim r As New Rectangle(X,Y,Width,Height)
@H_
502_0@例如:创建一个左上角X坐标是20,Y坐标是30,宽度是10,高度是15的矩形
代码如下:
@H_
502_0@Dim rec As New Rectangle(20,30,10,15)
@H_
502_0@(2)Rectangle结构主要
属性/
方法和
功能见表7-2
@H_
502_0@表7-2 Rectangle
属性/
方法与
功能表
@H_
502_0@
属性/
方法 功能
@H_
502_0@Top
属性 矩形最上边缘的Y坐标
@H_
502_0@Bottom
属性 矩形最下边缘的Y坐标
@H_
502_0@Left属 矩形最左边缘的X坐标
@H_
502_0@Right
属性 矩形最右边缘的X坐
@H_
502_0@Location
属性 矩形左上角坐标
@H_
502_0@Size
属性 矩形大小
@H_
502_0@IsEmpty属 若矩形Width、Height、X、Y
属性值均为0,则此
属性返回值为True,否则为False
@H_
502_0@Equals方 若两个矩形大小和位置相同,则返回值为True,否则为False
@H_
502_0@InterSectWidth
方法 如果一个矩形与另一个矩形相交,则返回True,否则为False
@H_
502_0@与VB6.0一样,在VB.NET中也是以所在控件容器的最左最上一点作为坐标系统原点。
@H_
502_0@1. 颜色
@H_
502_0@颜色是绘图
功能中非常重要的一部分,在VB.NET中颜色用Color结构和Color列举来表示。Color结构中颜色由4个整数值Red、Green、Blue和Alpha表示。其中Red、Green、Blue可简写成R、G、B,表示颜色的红、绿、蓝三原色;Alpha表示不透明度。
@H_
502_0@(1)使用FromArgb
方法设置颜色
@H_
502_0@语法格式:Color.FromArgb([A,]R,G,B)
@H_
502_0@
功能:由透明度、红、绿、蓝来调配颜色。
@H_
502_0@说明:
@H_
502_0@A透明参数:其值为0至255,数值越小越透明。0表示全透明,255表示完全不透明。A可缺省,其默认值为255。R、G、B为颜色参数不可缺省。(R,G,B)合成原理如图7-3如示:
@H_
502_0@例:
@H_
502_0@(255,0,0)为红色
@H_
502_0@(0,255,0)为绿色
@H_
502_0@(0,0,255)为蓝色
@H_
502_0@(255,0,255)为紫色
@H_
502_0@(2)
获取Color结构的各颜色分量值
@H_
502_0@VB.NET中可
获取对象Color的四个自变量的值,其语法如下:
@H_
502_0@R=对象.Color.R
@H_
502_0@G=对象.Color.G
@H_
502_0@B=对象.Color.B
@H_
502_0@例:取出Picture
Box1控件背景的R自变量值。
@H_
502_0@R=Picture
Box1.BackColor.R
@H_
502_0@(3)用Color列举设置颜色
@H_
502_0@使用Color列举可直接指定系统定的颜色,这些被定义的颜色均用英文命名,有140多个,常用的有Red、Green、Blue、Yellow、Brown、White、Gold、Tomato、Pink、SkyBlue、Orange等列举
名称。使用语法如下:
@H_
502_0@Color.颜色列举
名称
@H_
502_0@例:将Button1控件背景设成粉蓝色。
@H_
502_0@Button1.BackColor=Color.Blue
@H_
502_0@Color列举颜色不必背记,在编辑程序
代码时,只要输入"Color.",系统会
自动列出这些英文
名称,程序员选择其中之一即可。
@H_
502_0@2. 画笔
@H_
502_0@画笔(Pen)可在Graphics画布对象上绘制图形,只要指定画笔对象的颜色与粗细,配合相应的绘图
方法,就可绘制图形形状、线条和轮廓。画笔类中封装了线条宽度、线条样式和颜色等。
@H_
502_0@(1)Pen类的主要
属性
@H_
502_0@Alignment
属性:
获取或设置画笔绘制对象的对齐方式。
@H_
502_0@Color
属性:
获取或设置画笔的颜色。
@H_
502_0@DashStyle
属性: 线条所使用的破折号样式。
@H_
502_0@PenType
属性: 线条使用的画笔类型。
@H_
502_0@Width
属性:
获取或设置画笔的宽度。
@H_
502_0@(2)声明画笔对象
@H_
502_0@声明画笔对象有两种方式,语法如下:
@H_
502_0@Dim 画笔对象 As New Pen(颜色 [,粗细])
@H_
502_0@或
@H_
502_0@Dim 画笔对象 As Pen
@H_
502_0@画笔对象=As New Pen(颜色 [,粗细])
@H_
502_0@例:Dim mpen As New Pen(Color.Red) '创建颜色为红色的画笔
@H_
502_0@当缺省画笔粗细自变量时,系统默认为1 Pixel(象素)。
@H_
502_0@(3)重新设置画笔对象颜色与粗细。
@H_
502_0@语法如下:
@H_
502_0@画笔对象.Color=颜色
@H_
502_0@画笔对象.Width=粗细
@H_
502_0@3.画刷
@H_
502_0@画笔对象描给图形的边框和轮廓,若要填充图形的内部则必须使用画刷(Brush)对象。使用画刷对象时,也要配合FillRectangle、FillPolygon、FillEllipse、FillPie等绘图
方法。
@H_
502_0@GDI+提供了几种不同形式的画刷,如SolidBrush、TextureBrush、HatchBrush等。这些画刷都是从System.Drawing.Brush基类中派生的。
@H_
502_0@(1)SolidBrush画刷
@H_
502_0@这种画刷指定了填充区域的颜色,是最简单的一种,其创建
方法如下:
@H_
502_0@Dim br As SolidBrush = New SolidBrush(Color.Yellow) '定义黄色填充
@H_
502_0@(2)TextureBrush画刷
@H_
502_0@这种画刷定义了用图形填充图像内部区域的刷子,它可以用Image
属性或其构造
函数来定义画刷填充的图像。创建
方法如下:
@H_
502_0@Dim bm As New Bitmap("star.ico") '指定填充的位图
@H_
502_0@Dim brush As New TextureBrush(bm)
@H_
502_0@(3)HatchBrush画刷
@H_
502_0@这是一种复杂的画刷,它通过绘制一种样式来填充区域,创建
方法如下:
@H_
502_0@Dim brush As New HatchBrush(HatchStype.Cross,Color.Black)
@H_
502_0@其中第一个参数是画刷的填充样式,第二个参数定义了填充的前景色,第三个参数定义了填充的背景色。
@H_
502_0@使用HatchBrush对象前,需要先导入System.Drawing.Drawing2D命名空间,即在
代码开头
加上语名:Import System.Drawing.Drawing2D。
@H_
502_0@1.Graphics类
@H_
502_0@通常绘图时,画布是必须的。在VB.NET中进行计算机绘图时同样需要类似的画布,然后再使用画笔或画刷配合相应的绘图
方法做画。Graphics类可用来建立一个画布对象,还可清理和释放画布对象。
@H_
502_0@(1)声明和建立画布对象
@H_
502_0@语法:
@H_
502_0@Dim画布对象 As Graphics
@H_
502_0@画布对象=对象.CreateGraphics()
@H_
502_0@
功能:在指定的控件或对象中建立一个可以用绘图对象绘图的画布对象。
@H_
502_0@例:
@H_
502_0@在窗体内建立一个名叫g的画布对象
@H_
502_0@Dim g As Graphics
@H_
502_0@g=Form1.CreateGraphics()
@H_
502_0@如果画布对象放置在当前窗体上,则当前窗体名可省略。即使用g= CreateGraphics()
@H_
502_0@(2)清理画布对象
@H_
502_0@若需将画布对象的
内容清理,只要设置画布对象的底色即可,可使用下面的语法:
@H_
502_0@画布对象.Clear(颜色)
@H_
502_0@说明:
@H_
502_0@颜色可以使用Color对象类或Color列举。
@H_
502_0@例:将画布对象清理为粉色
@H_
502_0@g.Clear(Color.Pink)
@H_
502_0@若将画布清理为原控件的底色,可用"对象.Refresh()"语句。
@H_
502_0@例:清理目前在窗体上所绘制图形
@H_
502_0@Refresh()
@H_
502_0@清理目前在
图片控件Picture
Box1上所绘制图形
@H_
502_0@picture
Box1.Refresh()
@H_
502_0@(3)释放画布对象
@H_
502_0@可以用Graphics类的的Dispose
函数释放用CreateGraphics()创建的Graphics对象的资源。在
调用Dispose
函数后,画布对象将从内存中
删除,不能再被使用。
@H_
502_0@语法:
@H_
502_0@画布对象.Dispose()
@H_
502_0@例:
删除画布对象g
@H_
502_0@g.Dispose()
@H_
502_0@2.Graphics的常用绘图
方法
@H_
502_0@在VB.NET中,Graphics类提供了很多绘图
方法,具体介绍如下。
@H_
502_0@以下举例均在已定义画布对象g的情况下。
@H_
502_0@(1)画线(DrawLine)
方法
@H_
502_0@语法:
@H_
502_0@DrawLine(画笔,起点Point,终点Point)
@H_
502_0@或
@H_
502_0@DrawLine(画笔,起点X坐标,起点Y坐标,终点X坐标,终点Y坐标)
@H_
502_0@例:绘制一条起点坐标为(0,0),终点坐标为(150,150)的直线
代码如下:
@H_
502_0@Dim pt1 As Point(0,0)
@H_
502_0@Dim pt2 As Point(150,150)
@H_
502_0@g.DrawLine(pen1,pt1,pt2) '或 g.DrawLine(pen1,150,150)
@H_
502_0@(2)DrawRectangle
方法
@H_
502_0@语法:DrawRectangle(画笔,Rectangle对象)
@H_
502_0@例:画一个左上角坐标为(10,10),宽度为100,高度为200的矩形
代码如下:
@H_
502_0@Dim pen1 As New Pen(Color.Red)
@H_
502_0@Dim s As New Size(100,200)
@H_
502_0@Dim pt As New Point(10,10)
@H_
502_0@Dim rec As New rectangle(pt,s)
@H_
502_0@g.DrawRectangle(pen1,rec)
@H_
502_0@(3)DrawEllipse
方法
@H_
502_0@语法:
@H_
502_0@DrawEllipse(画笔,椭圆的外接矩形)
@H_
502_0@或
@H_
502_0@DrawEllipse(画笔,椭圆的外接矩形左上角X坐标,Y坐标,外接矩形宽度,高度)
@H_
502_0@
功能:
@H_
502_0@绘制空心椭圆/圆。
@H_
502_0@绘制椭圆时各参数如图7-4所示。
@H_
502_0@例:绘制外接矩形左上角坐标是(10,10),椭圆宽度为200,高度为300的椭圆。
@H_
502_0@Dim s As New Size(200,300)
@H_
502_0@Dim pt As New Point(10,10)
@H_
502_0@Dim rec Aa New Rectangle(pt,s)
@H_
502_0@g.DrawEllipse(pen1,rec)
@H_
502_0@下面是上例的等效
代码:
@H_
502_0@Dim x,y,width,height as Integer
@H_
502_0@X=10
@H_
502_0@Y=10
@H_
502_0@Width=200
@H_
502_0@Height=300
@H_
502_0@g.DrawEllipse(pen1,x,height)
@H_
502_0@Graphics类中没有专门用来绘制圆的
函数,可以用DrawEllipse来实现,若外接矩形是正方形,则绘制的是圆。
@H_
502_0@(4)其它几种常用
方法及语法与
功能如表7- 所示。
@H_
502_0@表7- 3常用
方法及
功能
@H_
502_0@
方法名 语法
功能说明
@H_
502_0@DrawArc DrawArc(画笔,椭圆外接矩形,开始角度,扫过的角度) 绘制椭圆/圆的一段弧。例:在画布对象g上用画笔p绘制一个弧形,角度由2700到900。g.DrawArc(p,50,60,100,70,270,90)
@H_
502_0@DrawPie DrawPie(画笔,椭圆外接矩形,开始角度,扫过角度) 绘制空心的扇形图。例:在画布g上用画笔p绘制一个扇形,角度由2700画到1800。Dim rec As Rectangle(50,70)g.DrawPie(p,rec,-90)
@H_
502_0@DrawPolygon DrawPolygon(画笔,Point数组) 绘制一个Point数组中的点构成的多边形。
@H_
502_0@DrawClosedCurve DrawClosedCurve(画笔,Point数组) 绘制Point数组中的点构成的封闭曲线。
@H_
502_0@DrawIcon DrawIcon(画笔,绘制点X坐标,绘制点Y坐标)或DrawIcon(画笔,绘制图标的范围矩形) 在指定的坐标中绘图标。
@H_
502_0@(5)DrawString
方法
@H_
502_0@语法:
@H_
502_0@DrawString(文本,字体,画刷,X坐标,Y坐标)
@H_
502_0@
功能:绘制字符串文本。
@H_
502_0@例:
@H_
502_0@Dim brush As New SolidBrush(Color.Black) '定义画刷
@H_
502_0@Dim font1 As New Font('Arial Black',36) '定义字体
@H_
502_0@g.DrawString("Welcome to VB.NET!",font1,brush,100)
@H_
502_0@(6)填充
方法
@H_
502_0@画刷配合填充
方法可以填满图形内部颜色,Graphics类的填充
方法有FillRectangle、FillEllipse、FillPolygon、FillClosedCurve、FillPie等。它们与Draw开头的
方法一一对应,输入参数也与相应的Draw
方法一致,其语法定义如下:
@H_
502_0@FillRectangle(画刷,矩形) '填充矩形
@H_
502_0@FillEllipse(画刷,椭圆的外接矩形) '填充椭圆
@H_
502_0@FillPolygon(画刷,坐标点数组) '填充多边形
@H_
502_0@FillClosedCurve(画刷,坐标点数组) '填充封闭曲线
@H_
502_0@FillPie(画刷,椭圆外接矩形,开始角度,扫过角度) '填充扇形
@H_
502_0@例:以下是一个填充实例。
@H_
502_0@Dim brush As New SolidBrush(Color.Black)
@H_
502_0@Dim rec As New Rectangle(10,80)
@H_
502_0@g.FillRectangle(brush,rec) '填充矩形
@H_
502_0@Dim pt(5) As Point
@H_
502_0@pt(1)=New Point(50,100)
@H_
502_0@pt(2)=New Point(100.200)
@H_
502_0@pt(3)=New Point(10,400)
@H_
502_0@pt(4)=New Point(50,200)
@H_
502_0@pt(5)=New Point(50,100)
@H_
502_0@g.FillPolygon(brush,pt) '填充多边形
@H_
502_0@Dim stattAngle As Single=0.0F
@H_
502_0@Dim sweepAngle As Single=135.0F
@H_
502_0@Dim reca As New Rectangle(200,100)
@H_
502_0@g.FillPie(brush,rec1,startAngle,sweepAngle) '填充扇形
@H_
502_0@3.坐标变换
@H_
502_0@坐标变换是GDI+提供的一项重要
功能。在画布上绘制图形之前,若做画布平移、缩放、旋转变换,则之后在画布上所绘制的图形均随画布而变换,可以获得很生动的
效果。如画布旋转450后,在画布上的正方形在屏幕上呈现的是菱形。
@H_
502_0@(1)平移(TranslateTransform
方法)
@H_
502_0@语法:
@H_
502_0@TranslateTransform(X轴方向偏移量,Y轴方向偏移量)
@H_
502_0@
功能:
@H_
502_0@用指定的X轴方向和Y轴方向的偏移量进行偏移。若x,y为正值,则画布向右和向下平移;若x,y为负值,则画布向左和向上移动。
@H_
502_0@例:将原来的图形按X轴向右平移100像素,按Y轴向下平移150像素。
@H_
502_0@g.TranslateTransform(100,150)
@H_
502_0@(2)旋转(RotateTransform
方法)
@H_
502_0@语法:
@H_
502_0@RotateTransform(旋转角度)
@H_
502_0@
功能:
@H_
502_0@旋转变换是指相对坐标原点旋转指定的角度,旋转方向以顺时针为正。
@H_
502_0@例:使以后绘制的图形,皆旋转150。
@H_
502_0@g.RotateTransform(15)
@H_
502_0@(3)比例(ScaleTransform)
@H_
502_0@语法:
@H_
502_0@ScaleTransform(X轴比例,Y轴比例)
@H_
502_0@
功能:比例变换是指用指定的X轴和Y轴的比例对图形进行变换,即设置画布的缩放比例。
@H_
502_0@例:使以后绘的图形,皆会宽度放大3倍,高度缩小一半。
@H_
502_0@g.ScaleTransform(3,0.5)
@H_
502_0@4.绘制图形的一般步骤
@H_
502_0@在创建一个Graphics对象后,就可以用Graphics类的
方法在窗体上绘制基本图形了。通常,在VB.NET中绘制图形
包括以下几点:
@H_
502_0@(1)使用颜色
@H_
502_0@颜色是绘图必要的因素,因此绘图前需要先定义颜色,颜色可以使用Color结构中
自定义的颜色,也可以通过FromArgb()
方法来创建RGB颜色。
@H_
502_0@(2)使用画笔
@H_
502_0@根据需要可对画笔的
属性进行设置,例如Pen的Color
属性,可以设置画笔的颜色,DashStyle
属性可设置Pen的线条样式。
@H_
502_0@(3)使用画刷
@H_
502_0@创建画刷有多种方式,可以创建SolidBrush、HatchBrush、TextureBrush等,前面已详细说明了。
@H_
502_0@(4)使用Graphics类提供的
函数给图
@H_
502_0@Graphics类提供的绘图
方法包括以下几大类:线条、矩形、多边形、圆、椭圆、圆弧、贝济埃曲线、字符串、图标、图像。
@H_
502_0@(5)释放资源
@H_
502_0@释放程序中创建的Graphics、Pen、Brush等资源,应尽快释放,
调用该对象的Dispose()
方法即可。如果不
调用Dispose
方法,则系统
自动回收这些资源,但释放资源的时间会滞后。
@H_
502_0@[知识扩展]
@H_
502_0@1. VB.NET的
自定义数据类型--结构
@H_
502_0@(1)结构的定义
@H_
502_0@在VB.NET中,
用户可
自定义数据类型(User-Defined Tyepes,UDT),定义时使用关键字Structure,其语法如下:
@H_
502_0@Structure 结构名
@H_
502_0@Public| Dim| Private 类型成员
@H_
502_0@End Structure
@H_
502_0@在Structure内部声明类成员,可使用Public、Dim、Private。Structure内部的Dim和Public同义,都可以通过变量访问其成员数据。
@H_
502_0@例如:前面介绍的point结构定义。
@H_
502_0@Public Structure Point
@H_
502_0@Public x As Integer '
获取或设置此 Point 的 x 坐标
@H_
502_0@Public y As Integer '
获取或设置此 Point 的 y 坐标
@H_
502_0@Public ReadOnly Property IsEmpty As Boolean '
获取一个值,该值指示此 Point 是否为空
@H_
502_0@……
@H_
502_0@End Structure
@H_
502_0@(2)结构与类的比较
@H_
502_0@Visual Basic .NET 统一了结构和类的语法,它们都
支持大多数的相同
功能,但结构和类之间也有重要的区别。
@H_
502_0@①结构和类的主要相同之处
@H_
502_0@l 两者都属于"容器"类型,表示它们可以包含其他类型作为成员。 两者都具有成员,成员可以
包括构造
函数、
方法、
属性、字段、常数、枚举、事件和事件处理程序。 都可实现接口。
@H_
502_0@l 都有共享的构造
函数,有或没有参数。 两者都可以公开默认
属性,只要该
属性至少带有一个参数,都可以声明和引发事件,而且两者都可以声明委托。
@H_
502_0@②结构与类的主要不同之处
@H_
502_0@l 结构是值类型,而类是引用类型。结构是不可继承的;而类可以继承。
@H_
502_0@l 所有的结构成员都默认为 Public;类变量和常量默认为 Private,而其他的类成员默认为 Public。类成员的这一行为提供与 Visual Basic 6.0 默认值系统的兼容。
@H_
502_0@l 结构变量声明不能指定初始值、New 关键字或数组初始大小,类变量声明可以。
@H_
502_0@l 结构从不终止,所以公共语言运行库 (CLR) 从不在任何结构上
调用 Finalize
方法,类可由
垃圾回收器终止,当检测到没有剩下的活动引用时,
垃圾回收器将在类上
调用 Finalize。
@H_
502_0@l 结构不需要构造
函数;而类需要。 结构仅当没有参数时可以有非共享的构造
函数;类无论有没有参数都可以。
@H_
502_0@每一个结构都有不带参数的隐式公共构造
函数。此构造
函数将结构的所有数据成员初始化为默认值。不能重定义此行为。
@H_
502_0@2.GDI+(Graphic Device Interface)简介
@H_
502_0@VB.NET具有相当强大的图形图像
功能,在对原有GDI技术进行改进后,形成了现在集成在VB.NET中的GDI+技术。Windows窗体可看作是一块画板,画笔、画刷等是绘画的工具,
用户只有通过GDI+这个接口才可使用这些工具。
@H_
502_0@GDI+是图形设备接口,它负责在屏幕和打印机上
显示信息,程序员可利用它来编写与设备无关的应用程序。GDI+是GDI的后续版本,它使程序开发人员不必考虑不同显卡之间的区别,可直接调Windows API
函数绘制图形。
@H_
502_0@Windows API是Windows操作系统的应用程序接口,它提供了能操作Windows操作系统的底层
函数,存放在系统的3个dll(动态
链接库)
文件中。其中GDI32.dll存放图形
函数,Kernel.dll存放较底层的操作系统
函数,User32.dll提供窗口管理
函数。
@H_
502_0@GDI+由.NET类库中System.Drawing命名空间下的很多类组成,这些类
包括在窗体上绘图的必需
功能,可以在屏幕上完成对文本和位图的绘制,也可以控制字体、颜色、线条粗细、阴影、方向等因素,并把这些操作发送到
显示卡上,确保在
显示器上正确
输出。
@H_
502_0@GDI+对GDI进行了重新封装,使之成为更直观的面向对象模型,此外GDI+比GDI提供了一些新的
功能,在
性能方面也作了改进,使之简单易用。
@H_
502_0@GDI+技术把打印机与屏幕看作是同样的
输出设备,当要进行打印时,只需
通知系统此时的
输出设备是打印机,再
调用与屏幕绘图时相同的
函数即可。GDI+提供的主要命名空间如下:
@H_
502_0@System.Draw.Desing命名空间:
包括一些预定义的对话框、
属性框等界面对象。
@H_
502_0@System.Draw.Drawing2D命名空间: 提供高级的二维和矢量图形
功能。
@H_
502_0@System.Draw.Image命名空间: 提供图像处理的各种类。
@H_
502_0@System.Draw.Printing命名空间: 将图像
输出到打印机或打印预览时使用的类。
@H_
502_0@System.Draw.Text命名空间:该命名空间中的类允许
用户创建和使用多种字体。
@H_
502_0@7.2 图形的浏览
@H_
502_0@VB.NET不仅具有强大的图形绘制
功能,而且还可以多种方式浏览图形,有很强的图像处理能力。
@H_
502_0@【案例7-2】 仿图形浏览器
@H_
502_0@此图像浏览器在案例6-1的基础上制作。其运行界面如图7-4所示。在左边的树型目录结构中选择
文件夹;在右边的上方
显示所选
文件夹中的图像
文件;双击某图像
文件,则在右下方的
显示该
文件。
@H_
502_0@图7-5 图像浏览主界面
@H_
502_0@[技能目标]
@H_
502_0@1. 熟悉图形浏览器开发过程。
@H_
502_0@2. 进一步掌握控件Picture
Box、TreeView、ListView控件的应用。
@H_
502_0@[操作要点与步骤]
@H_
502_0@1.建立一个新的Windows应用程序,命名为vbnet7-2。
@H_
502_0@2. 在窗体中
添加控件:一个TreeView控件
显示计算机系统的树型目录结构,一个ListView 控件
显示所选择
文件夹中
文件,一个Picture
Box控件
显示所选图像
文件文件,,一个StatusBar 控件用于显
文件所在路径及有关信息。调整各控件大小及位置。
@H_
502_0@此案例可在案例6-1的基础上直接
修改得到,即将其中的RichText
Box控件改换成Picture
Box控件。
@H_
502_0@3.设置各控件的相关
属性置,如表7-4 所示。
@H_
502_0@表7-4 控件
属性设置
@H_
502_0@控件类别 控件名
属性名
属性值
@H_
502_0@Form Form1 Text Vbnet7-2
@H_
502_0@Picture
Box Picture
Box1 SizeMode StretchImage
@H_
502_0@StatusBar StatusBar1 text StatusBar1
@H_
502_0@Filepath text
文件名及路径:
@H_
502_0@AutoSize contents
@H_
502_0@BorderStyle Raised
@H_
502_0@Filenam text
@H_
502_0@AutoSize Spring
@H_
502_0@BorderStyle Sunken
@H_
502_0@其他控件的
属性见案例6-1
属性设置。
@H_
502_0@4. 至此,各控件
属性设置完毕,可进行
代码编写了。
@H_
502_0@在此仅给出ListView1 控件的DoubleClick事件
代码,其他
代码与案例6-1中相同。
@H_
502_0@Private Sub ListView1_DoubleClick(ByVal sender As Object,ByVal e As System.EventArgs) Handles ListView1.DoubleClick
@H_
502_0@Dim strFilePath As String '
文件路径
@H_
502_0@Dim Mystream As StreamReader ' 定义读流对象
@H_
502_0@Dim strItemName As String ' 激活的
文件名
@H_
502_0@Dim intLength,i As Integer
@H_
502_0@Dim strXName As String '
文件扩展名
@H_
502_0@strItemName = ListView1.SelectedItems(0).Text
@H_
502_0@strCurrentfile = strItemName
@H_
502_0@intLength = strItemName.Length
@H_
502_0@strFilePath = strCurrentPath + "/" + strItemName ' 取得当前物理路径
@H_
502_0@' 下面的循环是判断
文件类型
@H_
502_0@For i = intLength - 1 To 0 Step -1
@H_
502_0@If strItemName.Chars(i) = "." Then Exit For
@H_
502_0@Next
@H_
502_0@strXName = strItemName.Substring(i)
@H_
502_0@If strXName = ".jpg" Or strXName = ".JPG" Or strXName = ".bmp" Or _
@H_
502_0@strXName = ".BMP" Then
@H_
502_0@' 如果是jpg或bmp
文件,则将此图形
文件显示在Picture
Box控件中
@H_
502_0@Picture
Box1.Image = Image.FromFile(strFilePath)
@H_
502_0@'在状态栏中
显示此
图片文件的路径及
文件名
@H_
502_0@Filenam.Text = strFilePath + strItemName.ToString()
@H_
502_0@End If
@H_
502_0@End Sub
@H_
502_0@
代码编写完毕,按F5或工具栏上的运行按扭可调试运行程序。
@H_
502_0@[相关知识]
@H_
502_0@Picture
Box控件主要用于加载
图片,所
支持的图形
文件格式有位图(.bmp)、GIF格式(
包括GIF动画及背景透空的静态图)、JPEG图形
文件、矢量图形格式
文件(.wmf)、或图标格式(.ico)的图形。Picture
Box控件中
显示的
图片可以设计阶段加载,或在程序执行时再加载。其常用
属性说明如表7-5。
@H_
502_0@设置
图片源需要使用
Image类的FromFile
方法,也可利用
属性窗口直接设置
图片源
文件。如果想要执行
图片的另存为操作,可以使用
Image类的Save
方法并指定存储路径、
名称以及格式。
@H_
502_0@Picture
Box可以配合Dock或Anchor
属性使用,如将Dock
属性设置为"Fill",Picture
Box就会填充整个窗体,也会
自动随着窗体的变化而改变大小。
@H_
502_0@表7-5 Picture
Box常用
属性
@H_
502_0@
属性 说明
@H_
502_0@BackGroundImage 设置Picture
Box的背景
图片
@H_
502_0@Image 设置Picture
Box 所要
显示的
图片
@H_
502_0@SizeMode 设置Picture
Box与
图片的尺寸关系,有Normal( 原图
显示)、StretchImage(
自动缩放
图片)、AutoSize(
自动缩放Picture
Box)、CenterImage(
图片居中)4个选项
@H_
502_0@【案例7-3】图形变换
显示
@H_
502_0@此案例在原图形区
显示未经变换的图形,单击界面中的倾斜、翻转和镜像按钮,在变换后图形区
显示相应变换后的图形。单击"
退出"按钮结束程序运行。运行界面如图7-6所示。
@H_
502_0@[技能目标]
@H_
502_0@1. 理解图形变换的概念。
@H_
502_0@2. 掌握图形变换程序设计的思路和技巧。
@H_
502_0@[操作要点与步骤]
@H_
502_0@1.建立一个新的Windows应用程序,命名为vbnet7-3。
@H_
502_0@(a) 翻转
效果图
@H_
502_0@(b)镜像
效果图
@H_
502_0@图7-6 图像变换
效果图
@H_
502_0@2.在窗体中
添加控件:2个Label控件用于
显示两个图形区,2个Panel控件用于
显示原图和变换后图形,3个Button命令按钮控件用于控
@H_
502_0@制图形变换方式和结束程序运行。调整各控件位置及大小。
@H_
502_0@3. 设置各控件
属性,如表7-6所示。
@H_
502_0@表7-6 控件
属性表
@H_
502_0@控件类型 控件名
属性名
属性值
@H_
502_0@Form Form1 text Vbnet7-3
@H_
502_0@Label Label1 text 原图形
@H_
502_0@Label2 text 变换后图形
@H_
502_0@Panel Panel1 Location 29,48
@H_
502_0@BorderStyle Fixed3D
@H_
502_0@Panel2 Location 298,48
@H_
502_0@BorderStyle Fixed3D
@H_
502_0@Button Button2 Text 翻转
@H_
502_0@Button3 Text 镜像
@H_
502_0@Button4 Text
退出
@H_
502_0@4.编写
代码。首先在Form1类中定义变量,如下所示。
@H_
502_0@Dim pic1,pic2 As Bitmap
@H_
502_0@Dim flag As Integer = 0 '用于标志选择哪种图形变换
@H_
502_0@(1)为Form1的Load事件编写
代码,如下所示。
@H_
502_0@Private Sub Form1_Load(ByVal sender As Object,ByVal e As System.EventArgs) Handles MyBase.Load
@H_
502_0@Panel1.Height = Panel1.Width
@H_
502_0@Panel2.Width = Panel1.Width
@H_
502_0@Panel2.Height = Panel2.Width
@H_
502_0@Dim pic As Image = Image.FromFile("strawberry.jpg")
@H_
502_0@pic1 = New Bitmap(pic,Panel1.Width,Panel1.Height)
@H_
502_0@pic2 = New Bitmap(pic1)
@H_
502_0@End Sub
@H_
502_0@将图形
文件放置在bin
文件夹内,直接指定图形
文件即可,当然也可放置在其他
文件夹中,但必须指明
文件夹。
@H_
502_0@(2)为Panel1的Paint事件编写
代码,如下所示。
@H_
502_0@Private Sub Panel1_Paint1(ByVal sender As Object,ByVal e As_
@H_
502_0@System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
@H_
502_0@Dim g As Graphics = e.Graphics
@H_
502_0@g.DrawImage(pic1,0)
@H_
502_0@End Sub
@H_
502_0@(3)为Panel2 的Paint事件编写
代码,如下所示。
@H_
502_0@Private Sub Panel2_Paint(ByVal sender As Object,ByVal e As System.Windows.Forms.PaintEventArgs)_
@H_
502_0@Handles Panel2.Paint
@H_
502_0@Dim g As Graphics = e.Graphics
@H_
502_0@Dim x As Integer = Panel2.Width
@H_
502_0@Dim col As Color = New Color
@H_
502_0@Select Case flag
@H_
502_0@Case 1
@H_
502_0@Dim pic3 As Bitmap
@H_
502_0@pic3 = New Bitmap(x,x)
@H_
502_0@Dim i,j As Integer
@H_
502_0@For i = 0 To x - 1
@H_
502_0@For j = 0 To x - 1
@H_
502_0@col = pic2.GetPixel(i,j)
@H_
502_0@pic3.SetPixel(i,x - 1 - j,col)
@H_
502_0@Next
@H_
502_0@Next
@H_
502_0@g.DrawImage(pic3,0)
@H_
502_0@pic2 = New Bitmap(pic3)
@H_
502_0@Case 2
@H_
502_0@Dim pic4 As Bitmap
@H_
502_0@pic4 = New Bitmap(x,j)
@H_
502_0@pic4.SetPixel(x - i - 1,j,col)
@H_
502_0@Next
@H_
502_0@Next
@H_
502_0@g.DrawImage(pic4,0)
@H_
502_0@pic2 = New Bitmap(pic4)
@H_
502_0@End Select
@H_
502_0@flag = 0
@H_
502_0@End Sub
@H_
502_0@(4)为Button2的click事件编写
代码,如下所示。
@H_
502_0@Private Sub Button2_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)_
@H_
502_0@Handles Button2.Click
@H_
502_0@flag = 1
@H_
502_0@Panel2.Invalidate()
@H_
502_0@End Sub
@H_
502_0@(5)为Button3的click事件编写
代码,如下所示。
@H_
502_0@Private Sub Button3_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)_
@H_
502_0@Handles Button3.Click
@H_
502_0@flag = 2
@H_
502_0@Panel2.Invalidate()
@H_
502_0@End Sub
@H_
502_0@11. 为Button4的click事件编写
代码,如下所示。
@H_
502_0@Private Sub Button4_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)_
@H_
502_0@Handles Button4.Click
@H_
502_0@End
@H_
502_0@End Sub
@H_
502_0@至此编写完成,按F5或工具栏上的 运行按钮可运行程序。
@H_
502_0@[相关知识]
@H_
502_0@1. Bitmap
@H_
502_0@Bitmap类封装 GDI+ 位图,此位图由图形图像及其
属性的像素数据组成。Bitmap 对象是用于处理由像素数据定义的图像的对象。
@H_
502_0@
方法GetPixl:
获取此 Bitmap 中指定像素的颜色。
@H_
502_0@
方法SetPixel:设置 Bitmap 对象中指定像素的颜色。
@H_
502_0@2. Panel控件
@H_
502_0@Panel 是一个包含其他控件的控件(也称面板)。可以使用 Panel 来来对窗体界面上的控件进行适当的逻辑分组。例如一组单选钮组成的性别组和一组复选框组成的爱好组就可以用两个Panel来区分。与其他容器控件(如 Group
Box 控件)一样,如果 Panel 控件的 Enabled
属性设置为 false,则也会禁用包含在 Panel 中的控件。
@H_
502_0@默认情况下,Panel 控件在
显示时没有任何边框。可以用 BorderStyle
属性提供标准或三维的边框,将窗面板区与窗体上的其他区域区分开。因为 Panel 控件派生于 ScrollableControl 类,所以可以用 AutoScroll
属性来启用 Panel 控件中的滚动条。当 AutoScroll
属性设置为 true 时,使用所提供的滚动条可以滚动
显示 Panel 中(但不在其可视区域内)的所有控件。
@H_
502_0@Invalidate
方法: 使控件的特定区域无效并向控件发送绘制消息。
@H_
502_0@Point To Screen
方法:将指定工作区点的位置计算成屏幕坐标。
@H_
502_0@Panel 控件类似于 Group
Box 控件;但只有 Panel 控件可以有滚动条,而且只有 Group
Box 控件
显示标题。
@H_
502_0@7.3 动画制作
@H_
502_0@应用基本的绘图命令和适当的绘图模式,可以制作各种动画
效果。另外,利用时间变化更换不同的图像图序或移动图形位置也可以产生动画
效果。
@H_
502_0@【案例7-4】小向导
@H_
502_0@这个案例使用Graphics对象的FillPie命令绘制出缺口大小不同的扇形图,再利用时间事件来控制扇形图位置的变化,产生类似小向导动画的视觉
效果。运行界面如图7-7所示。
@H_
502_0@(a)
@H_
502_0@(b)
@H_
502_0@图7-7 小向导运行界面
@H_
502_0@[技能目标]
@H_
502_0@1. 理解简单动画开发过程。
@H_
502_0@2. 熟悉利用时间变化和绘图命令设计动画程序的技巧。
@H_
502_0@[操作要点与步骤]
@H_
502_0@1.建立一个新的Windows应用程序,命名为vbnet7-4。
@H_
502_0@2.在窗体中
添加控件:
添加一个Label
标签控件,用于
显示小向导的
标题;
添加一个Timer时间控件,用于控制扇形图形位置的变化速度;
添加一个Button命令按钮,用于停止程序的运行。调整窗体及控件的大小与位置。
@H_
502_0@3.设置控件
属性,其值如表7-7所示。
@H_
502_0@表7-7 控件
属性设置
@H_
502_0@控件类型 控件
名称 属性名称 属性值
@H_
502_0@Form Form1 text Vbnet7-4
@H_
502_0@label Label1 text 小向导(动画演示)
@H_
502_0@Timer Timer1 Enabled True
@H_
502_0@Interval 150
@H_
502_0@Button Button1 text 停止演示
@H_
502_0@Timer1的Enabled
属性值为True,表示启用Elapsed事件;Interval
属性值为150,单位是毫秒,表示Elapsed事件的频率,值越小,变化得越快,反之越慢。
@H_
502_0@4.编写
代码。
@H_
502_0@(1)首先在Form1类中定义变量,
代码如下。
@H_
502_0@Dim sw,status As Integer
@H_
502_0@Dim x,r As Integer
@H_
502_0@Dim rx,ry,rsw As Integer
@H_
502_0@Dim ra(2) As Integer
@H_
502_0@Dim rb(2) As Integer
@H_
502_0@Dim g2 As Graphics
@H_
502_0@(2)为Form1的Load事件编写
代码,设置初始值,
代码如下所示。
@H_
502_0@Private Sub Form1_Load(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MyBase.Load
@H_
502_0@g2 = Me.CreateGraphics
@H_
502_0@x = 300 :y = 65 :r = 50
@H_
502_0@ra(0) = 135 '第一个图的起始角度
@H_
502_0@rb(0) = -270 '第一个图的结束角度
@H_
502_0@ra(1) = 170 '第二个图的起始角度
@H_
502_0@rb(1) = -340 '第二个图的结束角度
@H_
502_0@sw = 0
@H_
502_0@status = 0
@H_
502_0@Timer1.Enabled = True
@H_
502_0@End Sub
@H_
502_0@(3)为Timer控件的Tick事件编写
代码,在不同的时间间隔里于不会位置绘制不同缺口的扇形,并且一直从右往左循环运动直到停止运行。
代码如下所示。
@H_
502_0@Private Sub Timer1_Tick(ByVal sender As Object,ByVal e As System.EventArgs) Handles Timer1.Tick
@H_
502_0@g2.Clear(Color.White)
@H_
502_0@g2.FillPie(Brushes.Blue,r,ra(sw),rb(sw))
@H_
502_0@rx = x : ry = y : rsw = sw
@H_
502_0@sw = 1 - sw
@H_
502_0@x = x - 10 '变化坐标位置
@H_
502_0@If x < 10 Then x = 300
@H_
502_0@End Sub
@H_
502_0@(4)为Button1控件编写
代码,当单击此按钮时结束程序运行。
代码如下。
@H_
502_0@Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)_
@H_
502_0@Handles Button1.Click
@H_
502_0@End
@H_
502_0@End Sub
@H_
502_0@End Class
@H_
502_0@至此,程序编写完成,按F5或工具栏中的运行按钮即可执行程序。
@H_
502_0@[相关知识]
@H_
502_0@VB.NET不仅有强大的绘制图形
功能,能够利用Graphics类基本绘图命令制作出丰富多彩的静态的图形,而且能让静止的图形随着时间变化发生位置与形状的改变,产生形象生动的动画
效果。
@H_
502_0@动画制作中,时间变化是由Timer控件来实现的,其中Interval
属性值的大小与动画运行的速度相关,间隔越小,速度越快。
@H_
502_0@【案例7-5】 移动动画
@H_
502_0@移动动画是简单的动画技巧,利用Graphics对象的DrawImage
方法可以
显示图像
文件,配合Timer时间的变化,就可以改变图像坐标,以产生移动动画
效果。
@H_
502_0@[案例说明]
@H_
502_0@本案例使用图像
文件的运动产生动画
效果。程序运行时,花的图案作为背景,小鸟图案从右到左移动,反复运动,直至停止。运行界面如图7-8所示。
@H_
502_0@(a)
@H_
502_0@(b)图7-8 移动动画运行界面
@H_
502_0@[技能目标]
@H_
502_0@1. 熟悉简单动画开发过程。
@H_
502_0@2. 熟悉利用图形
文件设计动画程序的技巧。
@H_
502_0@[操作要点与步骤]
@H_
502_0@1.建立一个新的Windows应用程序,命名为vbnet7-5。
@H_
502_0@2.在窗体中
添加控件:
添加一个Label控件用于
显示"移动动画"
标题;
添加一个 Picture
Box 控件用于
显示图形
文件;
添加一个Iimer时间控件用于设置动画频率。调整窗体及各控件的大小及位置。
@H_
502_0@3.设置控件
属性,
属性值如表7-8所示。
@H_
502_0@表7-8
属性设置
@H_
502_0@控件类型 控件名
属性名
属性值
@H_
502_0@Form Form1 Text Vbnet7-5
@H_
502_0@Label Label1 Text 移动动画
@H_
502_0@Picture
Box Picture
Box1 Location 48,52
@H_
502_0@Size 300,135
@H_
502_0@Locked True
@H_
502_0@BorderStyle Fixed3A
@H_
502_0@SizeMode StretchImage
@H_
502_0@Timer Timer1 Enabled True
@H_
502_0@Interval 200
@H_
502_0@4. 编写
代码。
@H_
502_0@(1)首先在Form1类中定义如下变量并赋初始值。
@H_
502_0@Dim px,py As Integer
@H_
502_0@Dim g2 As Graphics
@H_
502_0@Dim image1 As New Bitmap("flowers.gif")
@H_
502_0@Dim image2 As New Bitmap("bird.gif")
@H_
502_0@(2)为Form1的Load事件编写
代码。
@H_
502_0@Private Sub Form1_Load(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MyBase.Load
@H_
502_0@g2 = Picture
Box1.CreateGraphics
@H_
502_0@px = 300
@H_
502_0@py = 40
@H_
502_0@End Sub
@H_
502_0@(3)为Timer1控件的Tick事件编写
代码。
@H_
502_0@Private Sub Timer1_Tick(ByVal sender As Object,ByVal e As System.EventArgs) Handles Timer1.Tick
@H_
502_0@g2.DrawImage(image1,0)
@H_
502_0@px= 10
@H_
502_0@g2.DrawImage(image2,New Point(px,py))
@H_
502_0@If px < 5 Then px = 300
@H_
502_0@End Sub
@H_
502_0@至此
代码编写完成,按F5 或工具栏上的运行按钮运行程序。
@H_
502_0@[相关知识]
@H_
502_0@VB.NET中可使用Graphics类的DrawImage
方法显示图形
文件,在不同时间间隔里于不同的位置
显示同一图形
文件会产生视觉上的动画
效果。DrawImage
方法可指定目的绘图区,也可指定源
图片的
显示范围,具备
自动缩放
功能,会
自动将
图片放大或缩小以填满指定的整个区域,主要有以下几种使用方式。
@H_
502_0@DrawImage(Image对象,x,y)
@H_
502_0@DrawImage(Image对象,Point结构)
@H_
502_0@DrawImage(Image对象,目的Rectangle结构)
@H_
502_0@DrawImage(Image对象,x,y,源Rectangle结构,图形单位)
@H_
502_0@DrawImage(Image对象,目的Rectangle结构,源Rectangle结构,图形单位)
@H_
502_0@练习园地
@H_
502_0@一、基础题
@H_
502_0@1.简述GDI+的
内容及其包含的命名空间。
@H_
502_0@2.如何理解GDI+的"与设备无关性"?
@H_
502_0@3.用Graphics类绘图一般有哪些步骤?
@H_
502_0@4.用Graphics 类能绘制哪些基本图形?
@H_
502_0@5.在GDI+中如何实现坐标变换?
@H_
502_0@二、实战题
@H_
502_0@1.用Graphics类提供的
方法在窗体上绘制所有的基本图形。
@H_
502_0@2.完成本章所有案例的制作与调试。
@H_
502_0@3.编程完成图7-9中调色盘界面,其
功能是:调整左边的四个滑块值,则右边
显示相应颜色及ARGB值。
@H_
502_0@图7-9
@H_
502_0@4.以Timer控件配合Picture
Box控件设计一个可以定时切换不同图形的动画
效果。
@H_
502_0@5.使用Timer对象,设计一个窗体中有不断移动的球(或其他图形),可以单击按钮让图形加速及减速移动。
@H_
502_0@三、挑战题
@H_
502_0@1、利用画布的各种变换设置,完成图7-10所示界面的程序设计。
@H_
502_0@(a)缩放界面
@H_
502_0@(b)平移界面
@H_
502_0@(c)旋转界面
@H_
502_0@图7-10