GDI+( Graphics Device Interface Plus)是 Windows操作系统用来执行绘画及其他相关图形操作的一套子系统,是由. Net Framework中的System.Drawing命名空间提供的一组通过C++类实现的应用程序编程接口,主要负责显示屏幕和打印设备输出的有关信息,它使开发人员可以利用 Windows内置的图形功能轻松地创建图形应用程序。

作为图形设备接口的GDI+使得应用开发人员在输出屏幕和打印机信息时无需考虑具体显示设备的细节,只需调用GDI+库输出的类的一些方法即可完成图形操作,真正的绘图工作由这些方法交给特定的设备驱动程序来完成,GDI+使得图形硬件和应用程序相互隔离从而使开发人员编写与设备无关的应用程序变得非常容易。本教程将以 VB.Net中的GDI+的技术来实现各种绘图功能。

GDI+绘图的流程

  1. 创建 Graphics对象;
  2. 创建画笔和画刷;
  3. 使用 Graph对象的绘图方法绘制图形输出文字等;
  4. 释放 Graphics对象和绘图对象所占用的系统资源。
    'Form1_Paint是当窗体重绘制图形时候触发,如:窗体初始化、窗体改变大小,都会触发这个paint事件来完成图形的重画工作。
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
'创建 Graphics对象
Dim g As Graphics = e.Graphics
'创建画刷
Dim b As SolidBrush = New SolidBrush(Color.Blue)
'创建字体
Dim f As Font = New Font("宋体", 15, FontStyle.Bold)
'绘制文字
g.DrawString("Hello,World!", f, b, 30, 60)
'释放 Graphics对象和绘图对象所占用的系统资源
f.Dispose()
b.Dispose()
g.Dispose()
End Sub

刨建 Graphics对象

在VB.NET中用GDI+创建绘图,必须先创建 Graphics对象。 Graphices对象表示GDI+的绘图表面,是用来绘制图形图像的容器。创建 Graphics对象后,才可以使用GDI+的画笔、

画刷等结合Color、Font等对象进行绘制线条形状、填充区域、显示文本图像等操作。

VB. NET中的窗体和所有具有Text属性的控件都可以作为绘制图形的表面。创建Graphics对象有以下3种方法。

1.使用 Create Graphics方法创建

通过使用某控件或窗体的 CreateGraphics方法来灵活获取对Graphics对象的引用,该对象表示该控件或窗体的绘图表面。这是一种常见的创建方法,其格式为

Dim 对象名 As Graphics
对象名=窗体名(或控件名).CreateGraphics
2.利用PaintEventArgs参数传递 Graphics对象

通过窗体或控件的Pait事件可以直接完成图形绘制,在编写Pant事件处理程序时,利用参数 PaintEventArgs提供的窗体图形对象。格式为

Dim 对象名 As Graphics
对象名=e.Graphics
3.从 Image对象创建

创建 Graphics对象还可以由Image对象或者lmage类派生的任何对象来创建。调用Graphics.Fromlmage,提供要从其中创建 Graphics对象的Imge变量的名称,如下面代码所示:

Dim myBitmap as New Bitmap("C:\myPic")
Dim g as Graphics =Graphics.Fromlmage( myBitmap)

创建画笔和画刷

在获得一个 Graphics对象之后,接下来就要决定在表面上如何进行绘制。可能需要以

下对象中的一个或几个画笔、画刷。在GDI+中,Pen类和Brush类分别表示画笔和画刷。

在需要绘制直线、矩形和曲线的边界时使用画笔在需要填充图形对象时使用画刷。

1.画笔Pen

在Graphics画布上处理图形的轮廓部分需要使用的工具是画笔Pen。通过使用Pen类可以设置所画线条的颜色、线宽和样式,在使用前需要引用System.Drawing.Drawing2D名称空间。创建画笔的格式为:

Dim pen As New Pen(Color.Brown, 5)
2.画刷Brush

画刷Brush主要用于封闭图形的填充.

  1. 只能用一种颜色填充区域的称为单色刷,声明单色刷的格式为:
Dim mybrush As New SolidBrush(Color.Brown)
  1. 用一个图片来填充图形的画刷称为纹理刷,声明纹理刷的格式为:
Dim d As New TextureBrush(New Bitmap("path"))
  1. 用线性渐变色来填充图形的画刷称为渐变刷,声明渐变刷的格式为:
Dim d As New LinearGradientBrush(New Point(10), New Point(10), Color.White, Color.Black)
  1. 用条纹模式来填充图形的画刷称为网格刷,声明网格刷的格式为:
Dim d As New HatchBrush(HatchStyle.BackwardDiagonal, Color.White,  Color.Black)

图形绘制

1. 绘制直线的格式为:g.DrawLine(pen, 10, 10, 250, 10) 或者 g.DrawLine(pen, New Point(10, 10), New Point(250, 10))

2. 绘制矩形的格式为:g.DrawRectangle(pen, 10, 10, 250, 10)

2. 绘制圆 g.DrawEllipse(pen, 10, 10, 50, 50)

3. 绘制椭圆的格式为:g.DrawEllipse(pen, New Rectangle(10, 10, 50, 10))

参数pen为画笔,参数rect为Rectangle结构,指定圆的外切矩形区域。

4. 绘制弧线的格式为:

5. 绘制扇形

6. 绘制非闭合曲线

7. 填充图形填充矩形的格式与对应绘制图形的方法相似,区别是方法名由“绘制”改为“填充”,对应参数pen换成brush。

8. Clear方法使用Clear方法可以清除整个画布并以指定的背景色填充。

使用 Graphics对象

在创建 Graphics对象、画笔或画刷之后,就可以绘制直线、边框、曲线或图像了。 Graphis类为绘制和填充图形、曲线或图像提供了相应的方法。例如, DrawEllipse使用特定的画

笔来绘制椭圆的边界,而FillEllipse将使用一种填充颜色来绘制椭圆。绘制方法使用画笔作为参数,而填充方法则使用画刷作为参数。

释放 Graphics对象

在 Graphics对象使用完毕后,必须将其释放。在VB.NET中提供了一个 Dispose方法,此方法可以用来释放Graphics对象、画笔对象等所占用的全部资源。

例如创建g为 Graphics对象,使用完后用g.Dispose()释放。

第二章 VB.NET 绘图基础的更多相关文章

  1. 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型

    第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...

  2. 进击的Python【第二章】:Python基础(二)

    Python基础(二) 本章内容 数据类型 数据运算 列表与元组的基本操作 字典的基本操作 字符编码与转码 模块初探 练习:购物车程序 一.数据类型 Python有五个标准的数据类型: Numbers ...

  3. 第二章 Matlab面向对象编程基础

    DeepLab是一款基于Matlab面向对象编程的深度学习工具箱,所以了解Matlab面向对象编程的特点是必要的.笔者在做Matlab面向对象编程的时候发现无论是互联网上还是书店里卖的各式Matlab ...

  4. 《零成本实现Web自动化测试--基于Selenium》第二章 Selenium简介和基础

    第一部分 Selenium简介 1.Selenium 组建 1.1 Selenium-IDE Selenium-IDC是开发Selenium测试案例的集成开发环境.它像FireFox插件一样的工作,支 ...

  5. 自学Java第二章——《Java的基础语法》

    2.1 标识符 简单的说,凡是程序员自己命名的部分都可以称为标识符. 即给类.变量.方法.包等命名的字符序列,称为标识符. 1.标识符的命名规则 (1)Java的标识符只能使用26个英文字母大小写,0 ...

  6. 《Entity Framework 6 Recipes》翻译系列 (4) -----第二章 实体数据建模基础之从已存在的数据库创建模型

    不知道对EF感兴趣的并不多,还是我翻译有问题(如果是,恳请你指正),通过前几篇的反馈,阅读这个系列的人不多.不要这事到最后成了吃不讨好的事就麻烦了,废话就到这里,直奔主题. 2-2 从已存在的数据库创 ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (6) -----第二章 实体数据建模基础之使用Code First建模自引用关系

    2-5 使用Code First建模自引用关系 问题 你的数据库中一张自引用的表,你想使用Code First 将其建模成一个包含自关联的实体. 解决方案 我们假设你有如图2-14所示的数据库关系图的 ...

  8. 《Entity Framework 6 Recipes》中文翻译系列 (7) -----第二章 实体数据建模基础之拆分实体到多表以及拆分表到多实体

    2-6 拆分实体到多表 问题 你有两张或是更多的表,他们共享一样的主键,你想将他们映射到一个单独的实体. 解决方案 让我们用图2-15所示的两张表来演示这种情况. 图 2-15,两张表,Prodeuc ...

  9. 《Entity Framework 6 Recipes》中文翻译系列 (8) -----第二章 实体数据建模基础之继承关系映射TPT

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 2-8 Table per Type Inheritance 建模 问题 你有这样一 ...

  10. 《Entity Framework 6 Recipes》中文翻译系列 (9) -----第二章 实体数据建模基础之继承关系映射TPH

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 2-10 Table per Hierarchy Inheritance 建模 问题 ...

随机推荐

  1. ACTF flutter逆向学习

    参考了许多大佬的博客,在此特别诚挚感谢oacia大佬和其他大佬的博客和指导! 1.flutter和apk基础结构介绍 首先下载附件,是一个apk文件,用jadx打开 可以看见flutter字样,而fl ...

  2. Pikachu漏洞靶场 Burte Force(暴力破解)

    Burte Force(暴力破解) 文章目录 Burte Force(暴力破解) 概述 1.基于表单的暴力破解 2.验证码绕过(on server) 3.验证码绕过(on client) 4.toke ...

  3. Vue.js 原理分析

    本文内容提炼于<Vue.js设计与实现>,全书共 501 页,对 Vue.js 的设计原理从 0 到 1,循序渐进的讲解. 篇幅比较长,需要花些时间慢慢阅读,在合适的位置会给出在线示例以供 ...

  4. linux文件和文件夹的筛选、查找及用户和组管理命令

    1.列出当前系统上所有已经登陆的用户的用户名, 注意:同一个用户登录多次,则只显示一次即可. 查看系统用户的命令为: (1)getent passwd 查看系统上的所有用户信息 (2)w 查看登录用户 ...

  5. 第五部分_Shell脚本条件判断语法结构

    条件判断语法结构 思考:何为真(true)?何为假(false)? 1. 条件判断语法格式 格式1: test条件表达式 格式2: [ 条件表达式 ] 格式3: [[ 条件表达式 ]] (支持正则~) ...

  6. 【玩转鲲鹏DevKit系列】如何快速迁移软件包?

    本文分享自华为云社区<[玩转鲲鹏DevKit系列]如何快速迁移软件包?>,作者: 华为云社区精选 . 软件包含各种不同格式的文件,如RPM包通常包含二进制文件.SO 库文件.JAR包.配置 ...

  7. Linux设置SSH连接时间,解决断开速度快,不停输密码问题: connection reset by

    ssh 登录,没有设置ssh key 登录的情况下(临时登录),断开速度太快.如何解决? 修改:/etc/ssh/ssh_config 文件 #设置连接保持的时间ClientAliveInterval ...

  8. PPT 流星动画

    https://www.bilibili.com/video/BV1w54y1Q7cZ?p=6 星空背景绘制 绘制矩形框 背景不再被拖动 处理前先复制一份,用于后面做激光效果 星星效果 再次组合 按S ...

  9. 断点续传(上传)C#版

    断点续传(上传)Java版 1. 客户每次上传前先获取一下当前文件已经被服务器接受了多少 2. 上传时设定偏移量 服务端代码如下: /// <summary> /// 断点续传,获取已上传 ...

  10. django 生成二维码

    def generate_qrcode(request): data = 'hello' img = qrcode.make(data) buf = io.BytesIO() img.save(buf ...