6.1VB.net概述 6.2初学者工具包 6.3图形图像处理 6.4声音及视频处理
6.1VB.net概述 6.1.1 VB.net简介 Visual Basic 2005是目前Visual Basic的最新版本 提高开发人员的工作效率是这一版 Microsoft Visual Studio 发布的目标 不管用户使用何种应用程序类型或者选择何种语言,集成开发环境 (IDE)、 类库和语言套件,可使构建和部署应用程序变得尽可能地简单。 引入了新的编程体系结构和功能(如对平台的完全访问),以构建最先进的应用程序 Microsoft Visual Studio 2005 包含许多对开发环境新的增强、创新和提高,其目的在于使 Visual Basic .NET 开发人员比以往更加高效。
6.1.2 VB.net的功能特点 数据访问 使用My进行开发 Intellisense代码段 VB.net的功能特点 “数据源配置向导”简化了将应用程序连接到数据库、Web服务和用户创建的对象的数据的过程; “数据源窗口”提供了一个用于查看项目可用数据及关联数据的中心位置,并且允许用户通过将数据项从窗口拖到窗体上来创建数据绑定控件;
6.1.2 VB.net的功能特点 数据访问 使用My进行开发 Intellisense代码段 VB.net的功能特点 “TableAdapter”对象可以完成数据集的填充、查询和存储过程的执行; 使用新的本地数据功能可以在应用程序中直接包含 Microsoft Access 数据库文件和 Microsoft SQL Server Express 数据库文件。
6.1.2 VB.net的功能特点 数据访问 使用My进行开发 Intellisense代码段 VB.net的功能特点 My 的功能提供了对由.NET Framework 所提供的常用功能的访问,还提供了对与应用程序及其运行时环境关联的信息和默认对象实例的访问。
My命名空间
6.1.2 VB.net的功能特点 数据访问 使用My进行开发 Intellisense代码段 VB.net的功能特点 可以向代码添加这些可重用的例程并使用代码包含的指针编辑它们。 在“代码编辑器”中右击,然后单击“插入代码段”,可以插入代码段。也可通过键盘快捷键使用Intellisense代码段。
6.1.3 VB.net界面介绍 VB界面介绍演示 启动界面 当用户第一次打开 Visual Basic 2005 时,将会看到集成开发环境的大部分 都由“起始页”窗口填满了。 运行模式 当打开或创建一个项目时,开发环境外观将变成“设计模式”,这是 Visual Basic 的可见部分,用户可以在该处设计应用程序的外观。 设计模式 当运行或调试应用程序时,开发环境会变成“运行模式”。应用程序自身将启动,且会出现一个与调试相关的附加窗口。
6.1.4 VB.net开发应用程序的基本方法 使用Visual Basic 2005 开发应用程序的过程很简单, 在多数情况下,这一过程由下面的步骤组成: 创建一个项目 项目中包含了应用程序所需的全部文件并储存了有关应用程序的信息。有时一个应用程序可以包含多个项目,例如一个“Windows 应用程序”项目和一个或多个“类库”项目。这样的一组项目称作“解决方案”。
6.1.4 VB.net开发应用程序的基本方法 设计用户界面 用户可以通过将各种控件(如按钮和文本框)拖放到称作“窗体”的设计图面上来设计界面。然后用户可以设置属性,以便定义窗体及其控件的外观和行为。注意,对于没有用户界面的应用程序而言(如类库或控制台应用程序),则不需要这个步骤。 编写代码 接下来,用户需要编写 Visual Basic 代码,以便定义应用程序的运行方式以及它与用户进行交互的方式。Visual Basic 2005 具有 Intellisense、自动完成和代码段功能,可让代码编写工作变得更容易。
6.1.4 VB.net开发应用程序的基本方法 测试代码 用户总是想测试应用程序以确保它按其所期望的方式运行——这个过程称为“调试”。Visual Basic 2005 带有调试工具,可让用户更容易地通过交互方式查找和修复代码中的错误。 分发应用程序 一旦应用程序完成,用户就可以在计算机上安装最终的程序,或者分发该程序并与其他用户共享。Visual Basic 2005 使用了一种称为“ClickOnce 发布”的新技术,该技术可让用户通过向导很轻松地部署应用程序,并且可以自动提供已更新的应用程序版本。
6.2初学者工具包 6.2.1 初学者工具包介绍 1、初学者工具包的类型 示例应用程序 用于自定义的示例应用程序包括一个工作 Visual Studio 项目,还包括用于实现特定任务的模板代码及文档。该文档描述应用程序的功能,并对自定义应用程序提出建议。使用初学者工具包创建新项目时,将显示该文档。 学习工具 学习工具提供了完整的应用程序和分步骤学习的文档,指导用户如何从头开始重新创建应用程序。如果用户以前没有使用过 Visual Studio,则这些初学者工具包可使用户快速了解开发环境和编程语言。
2、查找初学者工具包 3、使用初学者工具包创建项目 “新建项目”对话框中提供了初学者工具包,可使用该对话框来选择随 Visual Studio 一起安装的初学者工具包,或从支持 Visual Studio Web 服务的网站上查找并下载初学者工具包。 3、使用初学者工具包创建项目 ① 选择“文件” →“新建项目”菜单命令。 ② 在“新建项目”对话框的“项目类型”窗格中,展开 Visual Basic、Visual C# 或 Visual J#,然后单击“初学者工具包”。 ③ 选择一个“初学者工具包”,输入新项目的名称,然后单击“确定”。
6.2.2 屏幕保护程序 屏幕保护程序 使用方法演示 1、使用方法 “屏幕保护程序”初学者工具包帮助用户创建了一个 Windows 屏幕保护程序, 以在计算机监视器上显示生动的 Internet RSS(Really Simple Syndication, 真正简单的聚合)feed。该RSS的内容是从微软网站上实时更新的新闻简介。 1、使用方法 屏幕保护程序 使用方法演示 快速更改源代码 通过编辑源代码来更改该程序的工作方式非常简单。下面是一个示例,该示例将用户自己的文本字符串添加到屏幕保护程序的显示内容中。 访问“选项”对话框 当从 Visual Studio 内打开可执行文件时,直接将命令行参数发送给该文件。 在选项模式中更改设置后,可通过输入 /s(而不是 /c)作为命令行参数来再 次运行该屏幕保护程序。
在计算机上安装屏幕保护程序 将该屏幕保护程序安装到计算机上,你就可以像使用其他屏幕保护程序一样,使用它了。 共享用户的屏幕保护程序 现在用户拥有了自定义版本的屏幕保护程序,便可与朋友和家人共享此程序。请注意,该屏幕保护应用程序使用 2.0 版的 .NET Framework,因此运行该程序的任何计算机都需要安装此版本的 Framework。.NET Framework 作为 Visual Studio 的一部分进行安装,但它也可以从 Microsoft .NET Framework Developer Center直接安装。
2、屏幕保护程序如何工作 屏幕保护程序项目文件 MyEvents.vb 包含用于处理命令行开关的代码。 OptionsForm.vb 包含显示设置选项的 Windows 窗体。通过此对话框,可选择屏幕保护程序运行时要使用的背景图像和 RSS 源。 ScreenSaverForm.vb 包含主屏幕保护程序 Windows 窗体。在此全屏窗体上读取并显示用户选择的背景图像和 RSS 源。 RSSFeed.vb 包含表示 RSS 2.0 源的类。 RssChannel.vb 包含表示 RSS 频道的类。所有 RSS 源中都有一个频道。它表示文章的集合。 RSSItem.vb 包含表示 RSS 项的类。RSS 频道可拥有任意数量的 RSS 项。一个 RSS 项表示一篇文章、一个博客贴子或一段新闻报道。 Item.vb 包含表示项的类,即具有标题和说明的对象。 ItemDescriptionView.vb 包含用来显示 RSS 源项的说明的代码。它以慢慢淡入淡出的效果显示项的文本。 ItemListView.vb 包含用来显示 RSS 源项的标题的代码。它跟踪当前所选文章,并可向前或向后滚动该文章。
3、相关概念 Windows 与屏幕保护程序的交互方式 ② /c —— 通知屏幕保护程序打开其“设置”对话框。 ③ /p —— 通知屏幕保护程序显示较小的预览。 此初学者工具包在 MyEvents.vb 源文件中处理这些参数。 此初学者工具包没有实现 /p 参数。
4、相关概念 使用设置和资源设计器存储选项 通过在“解决方案资源管理器”中双击“我的项目”节点,然后单击“设置”选项卡,便可看到设置设计器。使用此设计器,用户可以列出程序希望设置并能够以下面的格式从代码访问的所有设置: My.Settings.<SettingName> 类似地,资源设计器用于存储默认的背景图像和 RSS 源。 XML 和 RSS RSS 源的格式为XML,用于汇总 Web 上内容。站点经常使用它们来发布自己 的当前新闻文章或博客贴子的列表。 RSS 源具有包含一个 <channel> 节点的 <rss> 节点。<channel> 节点有一个 或多个 <item> 节点,每个 item 节点表示源中的一篇文章或一个博客贴子。 它还包含一个 <title> 元素,该元素含有频道的标题。每个 <item> 都可包含标题、链接和说明。
RSS示例文件 <rss version="2.0"> <channel> <title>我的 RSS 源</title> <description>一些文章。</description> <link>http://msdn.microsoft.com/</link> <item> <title>文章 1</title> <description>文章摘要。</description> <link>http://msdn.microsoft.com/netframework</link> </item> <title>文章 2</title> <description>一些其他文章摘要。</description> <link>http://msdn.microsoft.com/vbasic/</link> </channel> </rss>
6.3图形图像处理 计算机屏幕由数千个微小的点组成,这些点称为“像素”,程序通过定义每个像素的颜色来控制屏幕显示的内容。 将窗体看成一块可以在上面绘制(或绘画)的画布,“坐标”系统决定了每个像素的位置,其中“X 轴坐标”度量从左到右的尺寸,“Y 轴坐标”度量从上到下的尺寸。 坐标从窗体的左上角开始计算,因此,如果要绘制一个距离左边 10 个像素且距离顶部 10 个像素的单点,则应将 X 轴和 Y 轴坐标表示为 10, 10。 像素也可用来表示图形的宽度和高度。若要定义一个长和宽均为 100 个像素的正方形,并且此正方形的左上角离左边和顶部的距离均为 10 个像素,则应将坐标表示为 10, 10, 100, 100。 这种在屏幕上进行绘制的操作称为“绘画”。窗体和控件都有一个 Paint 事件,每当需要重新绘制窗体和控件(例如首次显示窗体或窗体由另一个窗口覆盖)时就会发生该事件。用户所编写的用于显示图形的任何代码通常都包含在 Paint 事件处理程序中。
6.3.1 VB的图形控件 二维矢量图形 图像 版式 .NET框架中的GDI+技术用于输出文本和图形 GDI+的分类 用于绘制线条、多边形、椭圆和弧,还可对这些图形进行颜色填充 支持渐变画刷、复杂的基数样条曲线和贝塞尔曲线、缩放区域、永久路径等众多复杂的功能。 大多数处理二维矢量图形的对象属于System.Drawing和System.Drawing.Drawing2D命名空间。
6.3.1 VB的图形控件 二维矢量图形 图像 版式 GDI+的分类 位图是由表示屏幕上各个点的颜色的数值构成的数组。 GDI+ 提供了用于显示、操作和保存位图的Bitmap类 处理图像的对象属于System.Drawing.Imaging命名空间
6.3.1 VB的图形控件 二维矢量图形 图像 版式 GDI+的分类 此子集中的对象用于以各种格式、颜色和样式显示文本 处理版式的对象属于System.Drawing命名空间
6.3.2 二维矢量图形 1、Graphics对象 为了简便,以下所有示例代码均假设已在代码模块开始处加入了下列语句: Imports System.Drawing Imports System.Drawing.Drawing2D Imports System.Drawing.Imaging Imports System.Drawing.Text 1、Graphics对象 在绘图面上绘制图形基元必须首先获取一个Graphics对象的引用,此引用代表在其上绘制线条和其他形状的画布 要获取Graphics对象必须使用以下两种方法之一:从某一事件的参数中获取或使用窗体和控件对象的CreateGraphics方法获取。 使用窗体或控件的CreateGraphics方法获取一个有效的Graphics对象的方法与前一个方法最主要的区别就是必须在退出过程之前释放Graphics对象,否则相应的Windows资源(即设备上下文)只有在下一次垃圾回收时才能被释放。
以下示例用第一种方法在窗体的Paint事件中绘制了一个 与窗体同样大小的椭圆: 示例一 以下示例用第一种方法在窗体的Paint事件中绘制了一个 与窗体同样大小的椭圆: Private Sub Form1_Paint(ByVal sender As Object, _ ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint '获取对应于窗体表面的Graphics对象 Dim gr As Graphics = e.Graphics '将背景置为天蓝色 gr.Clear(Color.Azure) '绘制一个与窗体同样大小的红色椭圆 gr.DrawEllipse(Pens.Red, 0, 0, Me.ClientSize.Width, Me.ClientSize.Height) End Sub
以下示例绘制了一个与窗体同样大小的椭圆,当窗体大小改变时,椭圆将被自动重新绘制: 示例二 以下示例绘制了一个与窗体同样大小的椭圆,当窗体大小改变时,椭圆将被自动重新绘制: Private Sub Form1_Resize(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Resize '获取对应于窗体表面的Graphics对象 Dim gr As Graphics = Me.CreateGraphics '将背景置为天蓝色 gr.Clear(Color.Azure) '绘制一个与窗体同样大小的红色椭圆 gr.DrawEllipse(Pens.Red, 0, 0, Me.ClientSize.Width, Me.ClientSize.Height) '释放Graphics对象 gr.Dispose() End Sub
2、线条、矩形、多边形、椭圆和弧 Graphics对象公开了一些方法可用于绘制线条、矩形和椭圆等图形基元。 每种方法均被重载,因而有多种语法形式。但作为规则,传递给这些方法 的第一个参数应是一个Pen对象,其余参数则应是一组坐标或一个外接矩形。 Private Sub Form1_Paint(ByVal sender As Object, _ ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint '创建一个Graphics对象 Dim gr As Graphics = Me.CreateGraphics '绘制一条从点(100,)到点(500,300)的红色直线 gr.DrawLine(Pens.Red, 100, 30, 500, 300) '绘制一个左上角坐标为(130,50),边长为300个像素的白色正方形 gr.DrawRectangle(Pens.White, New Rectangle(130, 50, 300, 300)) '绘制一个圆心为(350,250),半径为的绿色圆 Dim r As Integer = 200 gr.DrawEllipse(Pens.Green, 350 - r, 250 - r, r * 2, r * 2) '释放Graphics对象 gr.Dispose() End Sub
Private Sub Form1_Paint(ByVal sender As Object, _ 示例一 使用DrawArc方法绘制椭圆的弧 Private Sub Form1_Paint(ByVal sender As Object, _ ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint '创建一个Graphics对象 Dim gr As Graphics = Me.CreateGraphics '绘制圆心为(200,150),半径为的1/4圆 Dim r2 As Integer = 100 gr.DrawArc(Pens.Blue, 200 - r2, 150 - r2, r2 * 2, r2 * 2, 0, 90) gr.Dispose() End Sub 使用DrawArc方法绘制椭圆的弧类似于绘制椭圆本身,但是需提供两个额外的参数: 起始角和仰角,均以度为单位。起始角从X轴顺时针计算;仰角也是顺时针计算。 运行结果:
示例二 DrawLines方法就可绘制一组相连的直线; DrawLines方法接收一个Point或PointF对象数组; PonitF对象是用单精度数表示两个坐标。 '绘制3条直线 Dim points() As Point = {New Point(10, 10), _ New Point(100, 80), New Point(200, 20), New Point(300, 100)} gr.DrawLines(Pens.Black, points)
使用DrawRectangles方法可快速绘制多个矩形: 示例三 DrawPolygon方法用于绘制多边形 '绘制一个菱形 '注意:Point对象数组是临时建立的 gr.DrawPolygon(Pens.Red, New Point() {New Point(200, 50), _ New Point(300, 100), New Point(200, 150), New Point(100, 100)}) 使用DrawRectangles方法可快速绘制多个矩形: '绘制个矩形 Dim rects() As Rectangle = {New Rectangle(50, 30, 200, 100), _ New Rectangle(70, 40, 220, 110), New Rectangle(90, 50, 240, 120)} gr.DrawRectangles(Pens.Green, rects)
3、基数样条和贝塞尔样条 GDI+支持两种不能用圆或椭圆的弧表示的复杂曲线:基数样条和贝塞尔样条。 基数样条特点 基数样条是通过将具有弹性的物质(薄铁条或薄木条)穿过X-Y平面上的一组给定固定点形成的曲线。 除非使用的物质异常柔软(如绳或橡胶),该物质绘出的路径将是一条曲线,并且在连接点上不会有任何尖角。 使用的物质的弹性(也称张力)不同,同一组给定点可以产生不同的曲线。 默认的张力为0.5。 可使用DrawClosedCurve方法绘制闭合基数样条,此方法接收一个Point对象数组。
以下代码段绘制了5个基数样条,张力从0(这对应于无穷弹性的物质,将绘出直线)到2: 基数样条示例 以下代码段绘制了5个基数样条,张力从0(这对应于无穷弹性的物质,将绘出直线)到2: Dim points() As Point = {New Point(100, 100), New Point(200, 200), _ New Point(250, 30), New Point(350, 100)} Dim tension As Single For tension = 0 To 2 Step 0.5 gr.DrawCurve(Pens.Blue, points, tension) Next 运行结果:
贝塞尔样条是由4个点指定的曲线:起始点、结束点和两个控制点。 贝塞尔样条特点 贝塞尔样条是由4个点指定的曲线:起始点、结束点和两个控制点。 曲线不经过控制点,但是它们在起始点和结束点处会影响曲线的方向。 贝塞尔样条示例一 使用DrawBezier方法可以绘制贝塞尔样条,此方法接收4个Point对象(按以下顺序):起始点、第一个控制点、第二个控制点和结束点。 gr.DrawBezier(Pens.Black, New Point(10, 30), New Point(100, 20), _ New Point(140, 190), New Point(200, 200)) 运行结果:
使用DrawBeziers方法可绘制多个相连的贝塞尔曲线 贝塞尔样条示例二 使用DrawBeziers方法可绘制多个相连的贝塞尔曲线 Public Sub DrawBeziersPoint(ByVal e As PaintEventArgs) ' Create pen. Dim blackPen As New Pen(Color.Black, 3) ' Create points for curve. Dim start As New Point(100, 100) Dim control1 As New Point(200, 10) Dim control2 As New Point(350, 50) Dim end1 As New Point(500, 100) Dim control3 As New Point(600, 150) Dim control4 As New Point(650, 250) Dim end2 As New Point(500, 300) Dim bezierPoints As Point() = {start, control1, control2, _ end1, control3, control4, end2} ' Draw arc to screen. e.Graphics.DrawBeziers(blackPen, bezierPoints) End Sub 运行结果:
4、Pen对象 使用Pens或SystemPens类中没有的颜色,定义大于一个像素的宽度,定义虚线或要更好地控制直线或曲线的外观时,需使用自定义的Pen对象。 预定义Pen对象与自定义Pen对象的关键区别在于,必须通过调用其Dispose方法来销毁后者。 Pen对象示例一 '用自定义颜色的画笔绘制内部的矩形 Dim p1 As New Pen(Color.FromArgb(128, 0, 60)) gr.DrawRectangle(p1, 50, 50, 100, 50) '用宽度为个像素的蓝色画笔绘制外部的矩形 Dim p2 As New Pen(Color.Blue, 4) gr.DrawRectangle(p2, 10, 10, 200, 100) '销毁Pen对象 p1.Dispose() p2.Dispose()
Dim p As New Pen(Color.Yellow, 12) 运行结果: Dim p As New Pen(Color.Yellow, 12) Dim rect As New Rectangle(20, 20, 100, 100) '绘制第一个正方形,对齐方式为center(默认值) gr.DrawRectangle(p, rect) '同时绘制出参考线 gr.DrawRectangle(Pens.Black, rect) '将绘制位置移到右边 rect.Offset(150, 0) '将对齐方式设置为inset,绘制出第二个正方形和相应的参考线 p.Alignment = Drawing2D.PenAlignment.Inset '销毁自定义Pen对象 p.Dispose() 在使用宽度大于1个像素的Pen对象时,必须说明其对齐方式。 对齐方式会影响绘制直线的起始点和结束点。 可使用DashStyle枚举属性来绘制预定义样式的虚线 StartCap属性和EndCap属性可带枚举值,用于改变线条两端的形状从而能方便地创建出箭头标记或其他常用形状
Pen对象其他示例 Dim p1 As New Pen(Color.Black, 3) 运行结果: p1.DashStyle = Drawing2D.DashStyle.Dash gr.DrawLine(p1, 10, 210, 200, 210) p1.DashStyle = Drawing2D.DashStyle.DashDot gr.DrawLine(p1, 10, 230, 200, 230) p1.DashStyle = Drawing2D.DashStyle.DashDotDot gr.DrawLine(p1, 10, 250, 200, 250) p1.DashStyle = Drawing2D.DashStyle.Dot gr.DrawLine(p1, 10, 270, 200, 270) '创建自定义虚线样式 Dim sngArray() As Single = {4, 4, 8, 12, 4} p1.DashPattern = sngArray gr.DrawLine(p1, 10, 290, 200, 290) '用非默认线帽绘制线条 Dim p2 As New Pen(Color.Black, 8) p2.StartCap = Drawing.Drawing2D.LineCap.DiamondAnchor p2.EndCap = Drawing2D.LineCap.ArrowAnchor gr.DrawLine(p2, 280, 230, 500, 230) p2.StartCap = Drawing2D.LineCap.RoundAnchor p2.EndCap = Drawing2D.LineCap.Round gr.DrawLine(p2, 280, 270, 500, 270) '销毁自定义Pen对象 p1.Dispose() p2.Dispose() 运行结果: Pen对象其他示例
5、填充形状 Graphics对象提供了8种方法来创建填充几何形状: FillRectangle、FillRectangles、FillEllipse、FillPolygon、FillPie、FillClosedCurve、FillPath和FillRegion。 它们接收的第一个参数都是一个Brush对象,此对象决定形状将如何被填充 填充形状示例一 '绘制一个绿色矩形 gr.FillRectangle(Brushes.Green, New Rectangle(20, 10, 200, 100)) '绘制一个蓝色椭圆 gr.FillEllipse(Brushes.Blue, 20, 150, 200, 100) '绘制一个红色饼图(椭圆的一部分) gr.FillPie(Brushes.Red, 320, 150, 200, 100, -45, 90) '将椭圆的剩余部分用粉红色填充 gr.FillPie(Brushes.Pink, 320, 150, 200, 100, 45, 270) '注意不必外置系统画刷
使用FillPolygon方法可以填充不规则多边形。 填充形状示例二 使用FillPolygon方法可以填充不规则多边形。 Dim points() As Point = {New Point(200, 100), New Point(300, 300), _ New Point(50, 170), New Point(350, 170), New Point(100, 300)} gr.FillPolygon(Brushes.Gray, points, FillMode.Alternate) Dim points2() As Point = {New Point(600, 100), New Point(700, 300), _ New Point(450, 170), New Point(750, 170), New Point(500, 300)} gr.FillPolygon(Brushes.Green, points2, FillMode.Winding) 使用FillPolygon方法可以填充不规则多边形,此方法带一个Point对象数组,每个Point对象定义多边形的一个顶点。 可以使用FillClosedCurve方法填充不规则曲线,此方法带一个Point对象数组,一个张力值和一个可选的填充模式参数。FillPath方法用来填充复杂路径,FillRegion方法则用于填充Region对象。 运行结果:
6、Brush对象 自定义画刷与系统预定义画刷的最显著区别在于:对自定义画刷而言,在将其设置为Nothing或离开其范围之前必须将其销毁。 最简单的自定义画刷类型是SolidBrush对象,此对象的构造函数接收一个颜色参数: '创建自定义颜色的SolidBrush对象,并用它来填充矩形 Dim br As New SolidBrush(Color.FromArgb(128, 30, 100)) gr.FillRectangle(br, New Rectangle(10, 10, 200, 100)) '销毁画刷 br.Dispose()
使用HatchBrush类(属于System.Drawing.Drawing2D命名空间)可以方便地创建双色画刷,此画刷有56种预定义图案。 Dim br1 As New HatchBrush(HatchStyle.BackwardDiagonal, _ Color.White, Color.Blue) gr.FillRectangle(br1, New Rectangle(10, 10, 200, 100)) br1.Dispose() 阴影画刷56种预定义图案中的6种 运行结果:
通过LinearGradientBrush类创建线性渐变画刷的最简单方式是将其大小 (通过Rectangle对象)、两种颜色和渐变方向传递给画刷的构造函数。 Dim br As New LinearGradientBrush(New Rectangle(0, 0, 200, 100), _ Color.Blue, Color.Black, LinearGradientMode.ForwardDiagonal) gr.FillRectangle(br, 0, 0, 200, 100) gr.FillRectangle(br, 220, 0, 200, 100) br.Dispose() 在此画刷的构造函数中可指定4个渐变方向:horizontal(从左到右渐变)、vertical(从上到下渐变)、forwarddiagonal(从左上到右下渐变)和backward(从右上到左下渐变)。 如果要绘制的形状比画刷矩形要大,画刷将会平铺以覆盖形状。如果形状的大小不是画刷矩形大小的整数倍,则形状左上角的颜色与画刷的起始色会不同,如上图右侧的矩形。 运行结果:
Brush对象示例四 TextureBrush(纹理画刷)类,其构造函数接收一个Image对象和一个可选参数,此可选参数用于指定当要绘制的形状比图像大时图像应如何平铺。 运行结果: '示例中使用了图片框中一幅位图 Dim br1 As New TextureBrush(picturebox1.image) gr.FillRectangle(br1, New Rectangle(20, 20, 250, 150)) br1.Dispose() Dim br2 As New TextureBrush(PictureBox1.Image, WrapMode.TileFlipY) gr.FillRectangle(br2, New Rectangle(300, 20, 250, 150)) br2.Dispose() Dim br3 As New TextureBrush(PictureBox1.Image, WrapMode.TileFlipX) gr.FillRectangle(br3, New Rectangle(20, 220, 250, 150)) br3.Dispose() Dim br4 As New TextureBrush(PictureBox1.Image, WrapMode.TileFlipXY) gr.FillRectangle(br4, New Rectangle(300, 220, 250, 150)) br4.Dispose() 默认情况下,图像直接平铺,但也可如以下代码一样,水平反转、垂直反转或同时反转图像后再平铺
PathGradientBrush类,通过渐变填充GraphicsPath对象的内部。 '定义一个椭圆路径 Dim pa As New GraphicsPath pa.AddEllipse(10, 10, 200, 100) '定义用来渐变填充路径的PathGradientBrush对象 Dim br As New PathGradientBrush(pa) br.CenterColor = Color.Yellow '定义只有一个元素的颜色数组 Dim colors() As Color = {Color.Blue} br.SurroundColors = colors '填充路径 gr.FillPath(br, pa) '销毁Brush和Path对象 br.Dispose() pa.Dispose() 与其他矩形画刷不同,此画刷会自动平铺以覆盖任何大小和种类的形状表面,它不会超过定义它的路径对象的边界。 提供一个GraphicsPath对象、中心点的颜色和路径边界的颜色即能以最简便的方式定义一个PathGradientBrush对象: 运行结果:
Brush对象示例六 Dim pa2 As New GraphicsPath '定义一个正方形路径 Dim points() As Point = {New Point(300, 10), New Point(500, 10), _ New Point(500, 210), New Point(300, 210)} pa2.AddLines(points) pa2.CloseFigure() '创建与路径对应的画刷 Dim br2 As New PathGradientBrush(pa2) '定义中心点的颜色和位置 br2.CenterColor = Color.Yellow br2.CenterPoint = New PointF(450, 60) '定义一个颜色数组,数组中每种颜色对应路径的一个定点 Dim colors2() As Color = {Color.Blue, Color.Green, Color.Red, Color.Black} br2.SurroundColors = colors2 '绘制路径 gr.FillPath(br2, pa2) '释放Brush和Path对象 br2.Dispose() pa2.Dispose() 运行结果: 通过指定路径边界的多个颜色值能创建更多的路径渐变画刷。
处理图像的最重要的两个对象是Image类和Bitmap类 6.3.3 图像处理 处理图像的最重要的两个对象是Image类和Bitmap类 Image类 Bitmap类 提供将图像存入磁盘和从磁盘加载图像的方法 此类派生于Image类,通过它访问图像中的每个像素和图像的其他属性 1、加载和保存图像 Image类和Bitmap类的LoadFromFile、LoadFromStream方法可从文件或打开的Stream对象(不必是文件流)中加载图像。 以下代码段首先使用OpenFileDialog控件让用户输入图像文件名,然后使用DrawImage方法在与graphics对象相关的绘图面上显示出图像: GDI+可加载以下各式的文件:BMP、GIF、JPEG、EXIF、PNG和TIFF。
将图像载入Bitmap对象的更简单的方法是利用其构造函数: 加载图像示例 With OpenFileDialog1 .Filter = "Image files|*;*.jpg;*.gif;*.png;*.tif" If .ShowDialog = Windows.Forms.DialogResult.OK Then '将文件装入Bitmap对象 Dim bmp As Bitmap = Bitmap.FromFile(.FileName) '创建Graphics对象,在其上绘制图像 Dim gr As Graphics = Me.CreateGraphics gr.DrawImage(bmp, 0, 0) '释放Bitmap和Graphics对象 bmp.Dispose() gr.Dispose() End If End With 将图像载入Bitmap对象的更简单的方法是利用其构造函数: '(此语句可代替以上代码中的FromFile调用,但是图像文件需要放在bin\Debug目录中) Dim bmp As New Bitmap(.FileName)
可用Save方法保存Image或Bitmap对象中的图像,此方法带两个参数:文件名和目标文件的格式。 保存图像示例 可用Save方法保存Image或Bitmap对象中的图像,此方法带两个参数:文件名和目标文件的格式。 '以下代码假定已有一个存储了图像的名为bmp的Bitmap类型变量 With SaveFileDialog1 .Title = "Select target image and format" .Filter = "Bitmap|*.bmp|GIF|*.gif|TIFF|*.tif" .OverwritePrompt = True If .ShowDialog = Windows.Forms.DialogResult.OK Then Select Case System.IO.Path.GetExtension(.FileName).ToUpper Case ".BMP" bmp.Save(.FileName, ImageFormat.Bmp) Case ".GIF" bmp.Save(.FileName, ImageFormat.Gif) Case ".TIF" bmp.Save(.FileName, ImageFormat.Tiff) Case Else MessageBox.Show("Unrecognized extension", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End Select End If End With
2、显示图像 用DrawImage方法可在Graphics对象上显示图像 显示图像示例一 此方法在它最简单的语法形式中,带两个参数:要显示的图像文件名和目标区域的左上角坐标: '在坐标(100,200)处显示图像 gr.DrawImage(bmp, 20, 10) 运行结果:
DrawImage方法支持30种重载形式,其中一种可指定只绘制图像中的一个矩形区域: 显示图像示例二 DrawImage方法支持30种重载形式,其中一种可指定只绘制图像中的一个矩形区域: '仅绘制图像左半部分到点(20,60) gr.DrawImage(bmp, 20, 20, _ New RectangleF(0, 0, bmp.Width / 2, bmp.Height), GraphicsUnit.Pixel) 运行结果:
另一种重载形式将整个图像复制到指定的目标矩形中。通过改变目标矩形的大小,就可以在复制过程中缩放或还原图像: 显示图像示例三 另一种重载形式将整个图像复制到指定的目标矩形中。通过改变目标矩形的大小,就可以在复制过程中缩放或还原图像: '创建一个是原图像3倍宽,2倍高的目标矩形 Dim rect As New RectangleF(20, 110, bmp.Width * 3, bmp.Height * 2) '绘制放大后的位图 gr.DrawImage(bmp, rect) 运行结果:
也可同时指定目标矩形和源矩形来实现两种效果: 显示图像示例四 也可同时指定目标矩形和源矩形来实现两种效果: Dim destrect As New RectangleF(20, 180, bmp.Width * 1.5, bmp.Height) '创建对应于图像左上角的矩形 Dim sourceRect As New RectangleF(0, 0, bmp.Width / 2, bmp.Height / 2) '在目标矩形中绘制位图的一部分 gr.DrawImage(bmp, destrect, sourceRect, GraphicsUnit.Pixel) 运行结果:
3、翻转、旋转和扭曲图像 DrawImage方法可接收有3个Point元素的数组作为参数; 这些点在目标Graphics对象上定义了一个平行四边形作为绘制图像目标区域。 更确切的说,这3个点定义了目标图像左上角、右上角和左下角在目标面上的位置。 要获得预期的效果,对点的指定需要一定的考虑。例如,要获得旋转效果就必须进行必要的三角计算。 以下程序实现了将图像沿一个或两个轴翻转
Sub DrawFlipImage(ByVal gr As Graphics, ByVal bmp As Bitmap, _ ByVal x As Single, ByVal y As Single, _ ByVal flipX As Boolean, ByVal flipY As Boolean) '以平行四边形的顶点值为初始值,此时假定不仅进行任何翻转 Dim x0 As Single = x Dim y0 As Single = y Dim x1 As Single = x + bmp.Width Dim y1 As Single = y Dim x2 As Single = x Dim y2 As Single = y + bmp.Height '进行水平翻转 If flipX Then x0 = x + bmp.Width x1 = x x2 = x0 End If '进行垂直翻转 If flipY Then y0 = y + bmp.Height y1 = y0 y2 = y '创建Ponits数组 Dim points() As Point = _ {New Point(x0, y0), New Point(x1, y1), New Point(x2, y2)} '绘制翻转后的图像 gr.DrawImage(bmp, points) End Sub
3、翻转、旋转和扭曲图像 DrawImage方法可接收有3个Point元素的数组作为参数; 这些点在目标Graphics对象上定义了一个平行四边形作为绘制图像目标区域。 更确切的说,这3个点定义了目标图像左上角、右上角和左下角在目标面上的位置。 要获得预期的效果,对点的指定需要一定的考虑。例如,要获得旋转效果就必须进行必要的三角计算。 以下程序实现了将图像沿一个或两个轴翻转 以下程序实现了将图像旋转制定的角度(以度为单位)
Sub DrawRotateImage(ByVal gr As Graphics, ByVal bmp As Bitmap, _ ByVal x As Single, ByVal y As Single, ByVal angle As Single) '将弧度转化为度 angle = angle / (180 / Math.PI) '确定(x1,y1)和(x2,y2)的位置 Dim x1 As Single = x + bmp.Width * Math.Cos(angle) Dim y1 As Single = y + bmp.Width * Math.Sin(angle) Dim x2 As Single = x - bmp.Height * Math.Sin(angle) Dim y2 As Single = y + bmp.Height * Math.Cos(angle) '创建Point组数 Dim points() As Point = _ {New Point(x, y), New Point(x1, y1), New Point(x2, y2)} '绘制翻转后的图像 gr.DrawImage(bmp, points) End Sub
3、翻转、旋转和扭曲图像 DrawImage方法可接收有3个Point元素的数组作为参数; 这些点在目标Graphics对象上定义了一个平行四边形作为绘制图像目标区域。 更确切的说,这3个点定义了目标图像左上角、右上角和左下角在目标面上的位置。 要获得预期的效果,对点的指定需要一定的考虑。例如,要获得旋转效果就必须进行必要的三角计算。 以下程序实现了将图像沿一个或两个轴翻转 以下程序实现了将图像旋转制定的角度(以度为单位) 以下程序实现了将图像沿一个或两个轴扭曲指定的度数。
Sub DrawSkewImage(ByVal gr As Graphics, ByVal bmp As Bitmap, _ ByVal x As Single, ByVal y As Single, _ ByVal dx As Single, ByVal dy As Single) '确定(x1,y1)和(x2,y2)的位置 Dim x1 As Single = x + bmp.Width Dim y1 As Single = y + dy Dim x2 As Single = x + dx Dim y2 As Single = y + bmp.Height '创建Point数组 Dim points() As Point = _ {New Point(x, y), New Point(x1, y1), New Point(x2, y2)} '绘制扭曲后的图像 gr.DrawImage(bmp, points) End Sub
通过以上3个例程对图像进行翻转、旋转或扭曲十分容易。 DrawFlipImage(gr, bmp, 20, 20, False, False) DrawFlipImage(gr, bmp, 400, 20, True, False) DrawFlipImage(gr, bmp, 20, 60, False, True) DrawFlipImage(gr, bmp, 400, 60, True, True) DrawRotateImage(gr, bmp, 30, 120, 45) DrawRotateImage(gr, bmp, 300, 120, 90) DrawRotateImage(gr, bmp, 550, 120, 135) DrawSkewImage(gr, bmp, 50, 300, -50, 0) DrawSkewImage(gr, bmp, 220, 300, 0, 50) DrawSkewImage(gr, bmp, 400, 300, -50, 50) 运行结果:
4、透明和半透明位图 GDI+提供了3种方式来创建透明或半透明位图 可以将位图中的一种颜色透明化; 可以为整个位图设置一个透明度(与通过Opacity属性设置窗体的透明度很相似) 为位图中的每个像素设置不同的透明度。 只需调用MakeTransparent方法,此方法接收透明色作为参数: Dim bmp As New Bitmap("logo.bmp") bmp.MakeTransparent(Color.FromArgb(140, 195, 247)) gr.DrawImage(bmp, 20, 20) 运行结果:
4、透明和半透明位图 GDI+提供了3种方式来创建透明或半透明位图 可以将位图中的一种颜色透明化; 可以为整个位图设置一个透明度(与通过Opacity属性设置窗体的透明度很相似) 为位图中的每个像素设置不同的透明度。 要创建所有像素都有固定透明度的位图,应向DrawImage方法传递一个适当的 ImageAttributes对象。 但在操作前,必须使用SetColorMatrix方法将一个5×5像素的颜色矩阵赋给ImageAttributes对象。 完成赋值操作的代码较长,因为颜色矩阵实际上是一个Single二维数组。 以下示例代码绘制出一幅透明度为0.8的图像 。
Dim bmp As New Bitmap("logo.bmp") '定义位图中所有像素的透明度 Dim transparency As Single = 0.8 '创建一个*5矩阵,(,)处数值为透明度 Dim values()() As Single = {New Single() {1, 0, 0, 0, 0}, _ New Single() {0, 1, 0, 0, 0}, _ New Single() {0, 0, 1, 0, 0}, _ New Single() {0, 0, 0, transparency, 0}, _ New Single() {0, 0, 0, 0, 1}} '用以上矩阵初始化一个新的ColorMatrix对象 Dim colmatrix As New Imaging.ColorMatrix(values) '创建ImageAttributes对象,将颜色矩阵赋给它 Dim imageattr As New ImageAttributes imageattr.SetColorMatrix(colmatrix, ColorMatrixFlag.Default, _ ColorAdjustType.Bitmap) '使用指定的ImageAttributes对象绘制位图 gr.DrawImage(bmp, New Rectangle(200, 20, bmp.Width, bmp.Height), _ 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, imageattr) 运行结果:
4、透明和半透明位图 GDI+提供了3种方式来创建透明或半透明位图 可以将位图中的一种颜色透明化; 可以为整个位图设置一个透明度(与通过Opacity属性设置窗体的透明度很相似) 为位图中的每个像素设置不同的透明度。 最后一种创建半透明位图的方法是3种方法中最灵活的,因为用户可以控制图像中 每个像素的Alpha部分(即透明度)。 GetPixel方法可访问图像中每个像素的颜色,SetPixel方法可修改像素的颜色(可能是像素的Alpha混合部分)。 可以看出,这种方法是3种方法中最慢的方法,但另一方面,这一方法能产生极佳的效果。
Dim bmp As New Bitmap("logo.bmp") Dim x, y As Single '此循环访问位图中的所有像素 For x = 0 To bmp.Width - 1 For y = 0 To bmp.Height - 1 '获取当前颜色 Dim oldcolor = bmp.GetPixel(x, y) '设置从(图像左边界)到(图像右边界)的透明度值 Dim newcolor As Color = Color.FromArgb(x / bmp.Width * 256, oldcolor) bmp.SetPixel(x, y, newcolor) Next gr.DrawImage(bmp, 400, 20) 运行结果:
6.3.4 版式 .NET框架的版式部分用于以不同字体或样式来输出文本 GDI+仅支持TrueType和OpenType字体,这些字体可被连续缩放、旋转和共享,可不受任何限制地用于屏幕显示和打印输出。 版式示例一 '通过指定字体系列和以点为单位的字体大小来创建字体 Dim font1 As New Font("Arial", 12) '通过指定字体系列、字体大小和样式来创建字体 Dim font2 As New Font("Arial", 14, FontStyle.Bold) '通过指定字体系列、字体大小和两个样式组合来创建字体 Dim font3 As New Font("Arial", 16, FontStyle.Italic Or FontStyle.Underline) '通过指定字体系列和以毫米为单位的字体大小来创建字体 Dim font4 As New Font("Arial", 10, FontStyle.Regular, GraphicsUnit.Millimeter) '先创建一个字体系列,然后创建该族的一种字体 Dim fontFam As New FontFamily("Courier New") Dim font5 As New Font(fontFam, 18, FontStyle.Italic)
传递给Font构造函数的字体大小参数是度量大小,而不是以像素为单位的大小,当前页面变形不会影响字的大小(但是,全局变形会影响到文本大小)。 版式示例二 传递给Font构造函数的字体大小参数是度量大小,而不是以像素为单位的大小,当前页面变形不会影响字的大小(但是,全局变形会影响到文本大小)。 如下所示,可向构造函数传递额外的参数来指定一个具体的GraphicsUnit: Dim font1 As New Font("Arial", 12, GraphicsUnit.Pixel) Dim font2 As New Font("Arial", 14, FontStyle.Bold, GraphicsUnit.Pixel) 不能将GraphicsUnit.Display用于指定字体大小。 使用Graphics对象的DrawString方法可绘制文本。 此方法的最简洁的形式带有如下参数:要绘制的字符串、一个Font对象、一个Brush对象和绘制字符串的位置:
版式示例二(续) 运行结果: '...(接以上代码)... Dim gr As Graphics = Me.CreateGraphics gr.DrawString("Arial 12 Regular", font1, Brushes.Black, 20, 20) gr.DrawString("Arial 14 Bold", font2, Brushes.Black, 20, 60) gr.DrawString("Arial 16 Italic & Underline", font3, Brushes.Black, 20, 100) gr.DrawString("Arial 10 millimeters", font4, Brushes.Black, 20, 140) '注意:目标点可以是一个PonitF对象 gr.DrawString("Courier 18 Italic", font5, Brushes.Black, New PointF(20, 200)) '不再使用Font对象时,要将其销毁 font1.Dispose() font2.Dispose() font3.Dispose() font4.Dispose() font5.Dispose()
若要以更小的行间距显示字符串,可使用Font对象的GetHeight方法,此方法返回指定Graphics对象上的字体的高度。 版式示例三 若要以更小的行间距显示字符串,可使用Font对象的GetHeight方法,此方法返回指定Graphics对象上的字体的高度。 下面的代码以更小的行间距显示了上面代码中的字符串: '以更小的行间距重新绘制相同的字符串 Dim y As Integer = 20 gr.DrawString("Arial 12 Regular", font1, Brushes.Black, 20, y) y += font1.GetHeight(gr) gr.DrawString("Arial 14 Bold", font2, Brushes.Black, 20, y) y += font2.GetHeight(gr) gr.DrawString("Ariagrl 16 Italic & Underline", font3, Brushes.Black, 20, y) y += font3.GetHeight(gr) gr.DrawString("Arial 10 millimeters", font4, Brushes.Black, 20, y) y += font4.GetHeight(gr) gr.DrawString("Courier 18 Italic", font5, Brushes.Black, New PointF(20, y))
由于绘制文本时使用了Brush(不是Pen)对象,因此和以下代码一样,可使用纹理、阴影或渐变画刷来产生更炫目的效果。 版式示例四 由于绘制文本时使用了Brush(不是Pen)对象,因此和以下代码一样,可使用纹理、阴影或渐变画刷来产生更炫目的效果。 '创建一个Texturebrush对象 Dim btm As New Bitmap("Sunset.jpg") Dim br As New TextureBrush(btm) '创建一个大字体 Dim fnt As New Font("Arial", 30, FontStyle.Bold, GraphicsUnit.Millimeter) '以Texture方式绘制字符串 gr.DrawString("Textured", fnt, br, 20, 20) gr.DrawString("Text", fnt, br, 20, 200) 运行结果:
6.4.1 Windows Media Player控件介绍 6.4声音及视频处理 6.4.1 Windows Media Player控件介绍 Windows Media Player 9 Series ActiveX 控件是一个标准的 ActiveX 控件,提供了大量的功能 数字媒体文件和流媒体的高级播放功能。 使用播放列表的功能。 播放 DVD 和 CD 的功能。 访问 Windows Media Player 中的 Media Library(媒体库)。 处理元数据的功能。 支持字幕。 支持多种语言的音频。 控制网络连通性和访问相关统计信息的功能。 有两种方法可用于创建使用 Windows Media Player ActiveX 控件的应用程序。 在 Web 应用程序中使用该控件 在基于 Windows 的应用程序中使用它
最终用户可在任何安装了 Windows Media Player 的使用 Windows操作系统的计算机上运行该应用程序。 在 Web 应用程序中使用该控件 应在页面的超文本标记语言 (HTML) 中包含一个 OBJECT 元素。 并在 OBJECT 元素中包含嵌套的 PARAM 元素,以指定 Windows Media Player ActiveX 控件是否可见、包含哪些操作按钮以及该控件的其他属性。 通过包含多个 OBJECT 元素,可在一个 Web 页面中包含多个控件。 要完全控制嵌入的 Player,可以在页面的 HTML 中编写脚本代码。 在基于 Windows 的应用程序中使用它 可以包含一个对服务于该控件的动态链接库 (DLL) 的引用。 如何设置控件属性取决于所用的编程环境。 例如,在 Visual Basic 中,使用自定义 Properties(属性)对话框在设计时设置属性。 也可以通过编写代码设置或读取属性以及在运行时调用方法。 最终用户可在任何安装了 Windows Media Player 的使用 Windows操作系统的计算机上运行该应用程序。
6.4.2 播放声音和视频文件 下面介绍一个基于 Windows 窗体,并嵌入 Windows Media Player ActiveX控件的基本应用程序。 该应用程序具有如下特点: 创建 Windows Media Player ActiveX 控件的一个实例。 利用 Windows Media Player 主互操作程序集提供组件对象模型 (COM) 互操作性。 允许用户打开并播放 Windows Media 文件,尤其是文件扩展名为 .wma 或 .wmv 的文件。 创建供用户播放、暂停和停止数字媒体内容的传输控制按钮。 显示当前数字媒体文件的标题。 演示如何使用 Player 对象模型,包括使用属性、方法和事件的示例。 播放声音和视频演示
6.4.3 播放动画文件 此示例使用 Timer 对象控制动画的变化,并使用 RadioButton 控件选择动画对象。显示了三种动画样式: 帧动画: 眨动的眼睛是以一系列静态图像(帧)实现的。 计时器每跳动一次,就显示下一帧。 飞行对象: 弹球的大小和速度与工作区有关。此动画是通过对窗体的 Graphics 对象进行绘制实现的。 文本动画: 文本是使用 LinearGradientBrush 对象绘制的。在计时器每次跳动时,通过更改 LinearGradientBrush 的参数创建不同的画笔。参数移动渐变填充起点和终点。 播放动画演示