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. ElasticSearch之Clone index API

    使用已有的索引,复制得到一个索引. 关闭testindex_001的写入操作,命令样例如下: curl -X PUT "https://localhost:9200/testindex_00 ...

  2. Golang实现JAVA虚拟机-解析class文件

    原文链接:https://gaoyubo.cn/blogs/de1bedad.html 前言 所需前置知识为:JAVA语言.JVM知识.Go笔记 对应项目:jvmgo 一.准备环境 操作系统:Wind ...

  3. maven系列:多环境配置与应用

    目录 一.多环境配置步骤 定义多环境 使用多环境(构建过程) 二.跳过测试(了解) 应用场景 跳过测试命令 2.3 细粒度控制跳过测试 多环境配置有什么好处? maven提供配置多种环境的设定,帮助开 ...

  4. Java 在Excel中添加筛选器并执行筛选

    以下内容介绍通过Java程序在Excel添加筛选器并执行筛选.程序需要使用Excel工具类库Free Spire.XLS for Java,本文中使用的是免费版,可在官网下载jar包,解压导入jar文 ...

  5. 视频编码耗时长、编码帧发送失败…DVPP视频编码问题典型案例分析

    摘要:本期就分享几个关于DVPP视频编码问题的典型案例,并给出原因分析及解决方法 本文分享自华为云社区<DVPP媒体数据处理视频编码问题案例>,作者:昇腾CANN. DVPP(Digita ...

  6. AI开发实践丨客流分析之未佩戴口罩识别

    摘要:通过本教程,我们可以学习客流统计应用的扩展--过线客流统计+口罩佩戴识别,可用于商超.写字楼入口安检. 本文分享自华为云社区<客流分析之未佩戴口罩识别>,作者: HiLens_fei ...

  7. JVM面试必问:G1垃圾回收器

    摘要:G1垃圾回收器是一款主要面向服务端应用的垃圾收集器. 本文分享自华为云社区<JVM面试高频考点:由浅入深带你了解G1垃圾回收器!!!>,原文作者:Code皮皮虾 . G1垃圾回收器介 ...

  8. AI Studio 基本操作

    https://aistudio.baidu.com/aistudio/projectdetail/6182202 项目启停 执行和调试 添加代码或文件 运行代码 %cd /home/aistudio ...

  9. Jenkins Pipeline SSH Publisher 环境变量、参数引用 要用双引号

    Jenkins Pipeline SSH Publisher 环境变量.参数引用 要用双引号 在 Pipeline 脚本中,如果要使用变量,就必须使用 " 双引号 pipeline { ag ...

  10. Spring Boot Admin 离线实例

    一直处于离线状态 spring.boot.admin.client.instance.prefer-ip Use the ip-address rather then the hostname in ...