GDI+基础

举报
jackwangcumt 发表于 2021/09/25 11:00:30 2021/09/25
【摘要】 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+绘制,请看下面的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace GDIDemo
{
 public partial class Form1 : Form
 {
     public Form1()
     {
        InitializeComponent();
     }
     private void Form1_Load(object sender, EventArgs e)
     {
         //绘图无效
         Pen drawingPen = new Pen(Color.Black, 3);
         this.CreateGraphics().DrawArc(drawingPen, 36, 19, 100, 100, 40, 180);
         drawingPen.Dispose();
     }
     protected override void OnPaint(PaintEventArgs e)
     {
         Pen drawingPen = new Pen(Color.Black, 3);
         Rectangle rec=new Rectangle(10,10,120,80);
         e.Graphics.DrawRectangle(drawingPen, rec);
         drawingPen.Dispose();
         base.OnPaint(e);
     }
     private void button1_Click(object sender, EventArgs e)
     {
         Pen drawingPen = new Pen(Color.Red, 15);
         Graphics g = this.CreateGraphics();
         Rectangle rec = new Rectangle(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 事件,原有的绘图都被重新抹掉。

6.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。