天天看點

GDI+基礎

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+可以讓我們渲染出光滑的反鋸齒的文本,同時可以設定其大小、字型、顔色和方向等。

GDI+基礎
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();
     }
  } 
}      

運作結果如下圖所示:

GDI+基礎

值得注意的是,在窗體 Load 事件中,進行的繪制并未反映到 UI 上,因為事件執行順序為先 Load再 OnPaint,雖然 Load裡面的代碼正常的執行,但是也會被 OnPaint重新“抹 掉”。我們利用 GDI+進行繪圖時,先要擷取 Graphics 對象,一般可以在 OnPaint 事件中通過 e.Graphics 進行擷取,在 OnPaint 事件我們不需要手動釋放資源,.NET 會自動幫我們處理。但是如果是用 Control.CreateGraphics()方法來建立的 Graphics 對象,那麼必須要手動進行資源釋放,究其原因是因為 Graphics 對象采用的非托管的系統資源。我們單擊 button1 按鈕,會在界面上繪制第二個方塊,但是這種在 Click 事件中繪圖的方法和在 OnPaint 事件中繪圖的方法有着較大的差別,當你将窗體最小化或者隐藏(最大化或者窗體大小調整不影響)再最大化或者顯示時,第二個方塊就自動消失。對于這種很是奇怪的現象,對于剛接觸 GDI+的人來說,确實有點摸不着頭腦,究其原因是當最小化或者隐藏窗體時,作業系統将窗體進行了重繪,也就是再次調用了 Paint 事件,原有的繪圖都被重新抹掉。

GDI+基礎

繼續閱讀