GDI+基础

简介: GDI+的核心是 Graphics 对象,Graphics 类定义了绘制和填充图形对象的方法和属性。Graphics 类的属性(字段)很多,具体可参见 MSDN。Graphics 类的方法分为三类:绘制、填充及其他。

   GDI 是 Graphics Device Interface 的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有 Windows 程序的图形输出。在 Windows 操作系统下,绝大多数具备图形界面的应用程序都离不开 GDI,我们利用GDI 所提供的众多函数就可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。

   GDI+对 GDI 进行了性能优化,并添加了许多新的功能。GDI+使得应用程序开发人员在输出屏幕和打印机信息的时候无需考虑具体显示设备的细节,GDI+使得图形硬件和应用程序相互隔离,从而使开发人员编写设备无关的应用程序变得非常容易。GDI+的核心是 Graphics 对象,Graphics 类定义了绘制和填充图形对象的方法和属性。Graphics 类的属性(字段)很多,具体可参见 MSDN。Graphics 类的方法分为三类:绘制、填充及其他。

1 GDI+用途


一般来说,GDI+在以下场景中具有广泛的应用:

  • 2D 向量图:利用 GDI+,我们可以绘制直线、曲线、矩形和椭圆等形状,并且可以绘制路径,并填充区域。
  • 图片:GDI+可以将位图图片渲染到界面上,同时支持对位图进行各类操作(例如缩放、旋转等)。
  • 字体排印:GDI+可以让我们渲染出光滑的反锯齿的文本,同时可以设置其大小、字体、颜色和方向等。

1.png 2 GDI+绘制


既然 GDI+在界面绘制上占有重要的地位,那么问题来了,如何才能调用 GDI+绘制对象呢?常用的方式为重载控件的 OnPaint 事件,然后在事件内进行 GDI+绘制,请看下面的代码:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
namespaceGDIDemo{
publicpartialclassForm1 : Form {
publicForm1()
     {
InitializeComponent();
     }
privatevoidForm1_Load(objectsender, EventArgse)
     {
//绘图无效PendrawingPen=newPen(Color.Black, 3);
this.CreateGraphics().DrawArc(drawingPen, 36, 19, 100, 100, 40, 180);
drawingPen.Dispose();
     }
protectedoverridevoidOnPaint(PaintEventArgse)
     {
PendrawingPen=newPen(Color.Black, 3);
Rectanglerec=newRectangle(10,10,120,80);
e.Graphics.DrawRectangle(drawingPen, rec);
drawingPen.Dispose();
base.OnPaint(e);
     }
privatevoidbutton1_Click(objectsender, EventArgse)
     {
PendrawingPen=newPen(Color.Red, 15);
Graphicsg=this.CreateGraphics();
Rectanglerec=newRectangle(60, 60, 120, 80);
g.DrawRectangle(drawingPen, rec);
//释放非托管的资源drawingPen.Dispose();
g.Dispose();
     }
  } 
}

运行结果如下图所示:

2.png

值得注意的是,在窗体 Load 事件中,进行的绘制并未反映到 UI 上,因为事件执行顺序为先 Load再 OnPaint,虽然 Load里面的代码正常的执行,但是也会被 OnPaint重新“抹 掉”。我们利用 GDI+进行绘图时,先要获取 Graphics 对象,一般可以在 OnPaint 事件中通过 e.Graphics 进行获取,在 OnPaint 事件我们不需要手动释放资源,.NET 会自动帮我们处理。但是如果是用 Control.CreateGraphics()方法来创建的 Graphics 对象,那么必须要手动进行资源释放,究其原因是因为 Graphics 对象采用的非托管的系统资源。我们单击 button1 按钮,会在界面上绘制第二个方块,但是这种在 Click 事件中绘图的方法和在 OnPaint 事件中绘图的方法有着较大的区别,当你将窗体最小化或者隐藏(最大化或者窗体大小调整不影响)再最大化或者显示时,第二个方块就自动消失。对于这种很是奇怪的现象,对于刚接触 GDI+的人来说,确实有点摸不着头脑,究其原因是当最小化或者隐藏窗体时,操作系统将窗体进行了重绘,也就是再次调用了 Paint 事件,原有的绘图都被重新抹掉。

3.png

相关文章
|
程序员 数据安全/隐私保护 C++
【qt】动态属性
【qt】动态属性
179 1
|
存储 自然语言处理 搜索推荐
什么是向量数据库?
什么是向量数据库?
1793 0
|
11月前
|
存储 弹性计算 缓存
阿里云服务器通用型g8i实例性能与使用场景介绍及最新收费标准参考
阿里云ECS通用型g8i服务器采用阿里云全新CIPU架构,可提供稳定的算力输出、更强劲的I/O引擎以及芯片级的安全加固。ECS通用型g8i实例支持开启或关闭超线程配置,单台g8i实例最高支持100万IOPS。阿里云ECS通用型g8i实例CPU采用Intel®Xeon®Emerald Rapids或者Intel®Xeon®Sapphire Rapids,主频不低于2.7 GHz,全核睿频3.2GHz。本文为大家介绍通用型g8i实例性能与使用场景介绍及最新收费标准,以供参考。
|
12月前
|
存储 JavaScript 关系型数据库
鸿蒙开发:实现全局异常捕获和异常查看
如何灵活的拿到错误信息后,执行我们想要的逻辑,也是自研的一个诉求,比如全局监听到异常后,重启应用,或者上传到自己的服务器,或者可以在应用内查看等等,实现一个全局异常捕获,确实有很多的有用之处。
201 3
鸿蒙开发:实现全局异常捕获和异常查看
|
12月前
|
人工智能 运维 关系型数据库
携手UALink,阿里云磐久AI Infra 2.0服务器亮相2024 OCP全球峰会
阿里云服务器研发受邀和UALink联盟一起,在OCP全球峰会上重点阐述AI服务器Scale UP互连技术领域发展趋势
|
SQL 数据库
数据审计 -本福德定律 Benford‘s law (sample database classicmodels _No.6)
数据审计 -本福德定律 Benford‘s law (sample database classicmodels _No.6)
258 1
|
机器学习/深度学习 人工智能 算法
【数据挖掘】2022年2023届秋招奇虎360机器学习算法工程师 笔试题
本文提供了奇虎360公司2022年秋招机器学习算法工程师岗位的笔试题内容,包括选择题和编程题,涉及概率统计、数据结构、机器学习、计算机组成原理等多个领域。
226 5
|
Linux
7.1.9 【Linux】XFS 文件系统简介
7.1.9 【Linux】XFS 文件系统简介
398 0
|
小程序 Java 数据库
基于SpringBoot学生信息管理系统设计和实现(源码+LW+调试文档+讲解等)
基于SpringBoot学生信息管理系统设计和实现(源码+LW+调试文档+讲解等)
|
机器学习/深度学习 监控 算法
【机器学习】提供学习率的直观解释
【5月更文挑战第18天】【机器学习】提供学习率的直观解释