C#圖形編程GDI+基礎(chǔ)介紹
編寫圖形程序時需要使用GDI(Graphics Device Interface,圖形設(shè)備接口),從程序設(shè)計的角度看,GDI包括兩部分:一部分是GDI對象,另一部分是GDI函數(shù)。GDI對象定義了GDI函數(shù)使用的工具和環(huán)境變量,而GDI函數(shù)使用GDI對象繪制各種圖形,在C#中,進行圖形程序編寫時用到的是GDI+(Graphice Device Interface Plus圖形設(shè)備接口)版本,GDI+是GDI的進一步擴展,它使我們編程更加方便。
GDI+概述
GDI+是微軟在Windows 2000以后操作系統(tǒng)中提供的新的圖形設(shè)備接口,其通過一套部署為托管代碼的類來展現(xiàn),這套類被稱為GDI+的“托管類接口”,GDI+主要提供了以下三類服務:
(1)二維矢量圖形:GDI+提供了存儲圖形基元自身信息的類(或結(jié)構(gòu)體)、存儲圖形基元繪制方式信息的類以及實際進行繪制的類。
(2)圖像處理:大多數(shù)圖片都難以劃定為直線和曲線的集合,無法使用二維矢量圖形方式進行處理。因此,GDI+為我們提供了Bitmap、Image等類,它們可用于顯示、操作和保存BMP、JPG、GIF等圖像格式。
(3)文字顯示:GDI+支持使用各種字體、字號和樣式來顯示文本。
我們要進行圖形編程,就必須先講解Graphics類,同時我們還必須掌握Pen、Brush和Rectangle這幾種類。GDI+比GDI優(yōu)越主要表現(xiàn)在兩個方面:第(一)GDI+通過提供新功能(例如:漸變畫筆和alpha混合)擴展了GDI的功能;第(二)修訂了編程模型,使圖形編程更加簡易靈活。
Graphics類
Graphics類封裝一個GDI+繪圖圖面,提供將對象繪制到顯示設(shè)備的方法,Graphics與特定的設(shè)備上下文關(guān)聯(lián)。畫圖方法都被包括在Graphics類中,在畫任何對象(例如:Circle,Rectangle)時,我們首先要創(chuàng)建一個Graphics類實例,這個實例相當于建立了一塊畫布,有了畫布才可以用各種畫圖方法進行繪圖。
繪圖程序的設(shè)計過程一般分為兩個步驟:
- (一)創(chuàng)建Graphics對象;
- (二)使用Graphics對象的方法繪圖、顯示文本或處理圖像。
通常我們使用下述三種方法來創(chuàng)建一個Graphics對象。
方法一、利用控件或窗體的Paint事件中的PainEventArgs在窗體或控件的Paint事件中接收對圖形對象的引用,作為PaintEventArgs (PaintEventArgs指定繪制控件所用的Graphics)的一部分,在為控件創(chuàng)建繪制代碼時,通常會使用此方法來獲取對圖形對象的引用。
例如:
//窗體的Paint事件的響應方法 private?void?form1_Paint(object?sender,?PaintEventArgs?e)? {? ????Graphics?g?=?e.Graphics;? }?
也可以直接重載控件或窗體的OnPaint方法,具體代碼如下所示:
protected?override?void?OnPaint(PaintEventArgs?e)?? {? ????Graphics?g?=?e.Graphics;? }
Paint事件在重繪控件時發(fā)生。
方法二、調(diào)用某控件或窗體的CreateGraphics方法
調(diào)用某控件或窗體的CreateGraphics方法以獲取對Graphics對象的引用,該對象表示該控件或窗體的繪圖圖面。如果想在已存在的窗體或控件上繪圖,通常會使用此方法。
例如:
Graphics?g?=?this.CreateGraphics();?
方法三、調(diào)用Graphics類的FromImage靜態(tài)方法
由從Image繼承的任何對象創(chuàng)建Graphics對象。在需要更改已存在的圖像時,通常會使用此方法。
例如:
//名為“g1.jpg”的圖片位于當前路徑下 Image?img?=?Image.FromFile("g1.jpg");//建立Image對象 Graphics?g?=?Graphics.FromImage(img);//創(chuàng)建Graphics對象
1.Graphics類的方法成員
有了一個Graphics的對象引用后,就可以利用該對象的成員進行各種各樣圖形的繪制,表1列出了Graphics類的常用方法成員。
名稱 | 說明 |
DrawArc | 畫弧。 |
DrawBezier | 畫立體的貝爾塞曲線。 |
DrawBeziers | 畫連續(xù)立體的貝爾塞曲線。 |
DrawClosedCurve | 畫閉合曲線。 |
DrawCurve | 畫曲線。 |
DrawEllipse | 畫橢圓。 |
DrawImage | 畫圖像。 |
DrawLine | 畫線。 |
DrawPath | 通過路徑畫線和曲線。 |
DrawPie | 畫餅形。 |
DrawPolygon | 畫多邊形。 |
DrawRectangle | 畫矩形。 |
DrawString | 繪制文字。 |
FillEllipse | 填充橢圓。 |
FillPath | 填充路徑。 |
FillPie | 填充餅圖。 |
FillPolygon | 填充多邊形。 |
FillRectangle | 填充矩形。 |
FillRectangles | 填充矩形組。 |
FillRegion | 填充區(qū)域。 |
在.NET中,GDI+的所有繪圖功能都包括在System、System.Drawing、System.Drawing.Imaging、System.Drawing.Darwing2D和System.Drawing.Text等命名空間中,因此在開始用GDI+類之前,需要先引用相應的命名空間。
2.引用命名空間
在C#應用程序中使用using命令已用給定的命名空間或類,下面是一個C#應用程序引用命名空間的例子:
using?System;? using?System.Collections.Generic;? using?System.Data;? using?System.ComponentModel;? using?System.Drawing;? using?System.Drawing.Drawing2D;? using?System.Drawing.Imaging;
常用畫圖對象
在創(chuàng)建了Graphics對象后,就可以用它開始繪圖了,可以畫線、填充圖形、顯示
文本等等,其中主要用到的對象還有: Color:用來用patterns、colors或者bitmaps進行填充。
Pen:用來畫線和多邊形,包括矩形、圓和餅形。
Font:用來給文字設(shè)置字體格式。
Brush:用來描述顏色。
Rectangle:矩形結(jié)構(gòu)通常用來在窗體上畫矩形。
Point:描述一對有序的x,y兩個坐標值。
1.Pen類
Pen用來繪制指定寬度和樣式的直線。使用DashStyle屬性繪制幾種虛線,可以使用各種填充樣式(包括純色和紋理)來填充Pen繪制的直線,填充模式取決于畫筆或用作填充對象的紋理。
使用畫筆時,需要先實例化一個畫筆對象,主要有以下幾種方法。
用指定的顏色實例化一只畫筆的方法如下:
public?Pen(Color);
用指定的畫刷實例化一只畫筆的方法如下:
public?Pen(Brush);
用指定的畫刷和寬度實例化一只畫筆的方法如下:
public?Pen(Brush,?float);?
用指定的顏色和寬度實例化一只畫筆的方法如下:
public?Pen(Color,?float);?
實例化畫筆的語句格式如下:
Pen?pn=new?Pen(Color.Blue);
或者
Pen?pn=new?Pen(Color.Blue,100);
Pen常用的屬性有以下幾個,如下表所示:
名稱 | 說明 |
Alignment | 獲得或者設(shè)置畫筆的對齊方式。 |
Brush | 獲得或者設(shè)置畫筆的屬性。 |
Color | 獲得或者設(shè)置畫筆的顏色。 |
Width | 獲得或者設(shè)置畫筆的寬度。 |
2.Color類
在自然界中,顏色大都由透明度(A)和三基色(R,G,B)所組成。在GDI+中,通過Color結(jié)構(gòu)封裝對顏色的定義,Color結(jié)構(gòu)中,除了提供(A,R,G,B)以外,還提供許多系統(tǒng)定義的顏色,如Pink(粉顏色),另外,還提供許多靜態(tài)成員,用于對顏色進行操作。Color結(jié)構(gòu)的基本屬性如下表所示:
名稱 | 說明 |
A | 獲取此Color結(jié)構(gòu)的alpha分量值,取值(0~255)。 |
R | 獲取此Color結(jié)構(gòu)的紅色分量值,取值(0~255)。 |
G | 獲取此Color結(jié)構(gòu)的綠色分量值,取值(0~255)。 |
B | 獲取此Color結(jié)構(gòu)的藍色分量值,取值(0~255)。 |
Name | 獲取此Color結(jié)構(gòu)的名稱,這將返回用戶定義的顏色的名稱或已知顏色的名稱(如果該顏色是從某個名稱創(chuàng)建的),對于自定義的顏色,將返回RGB值。 |
Color類的基本(靜態(tài))方法如下表所示:
名稱 | 說明 |
FromArgb | 從四個8位ARGB分量(alpha、紅色、綠色和藍色)值創(chuàng)建Color對象。 |
FromKnowColor | 從指定的預定義顏色創(chuàng)建一個Color對象。 |
FromName | 從預定義顏色的指定名稱創(chuàng)建一個Color對象。 |
Color類的對象可以通過已有顏色構(gòu)造,也可以通過RGB建立,例如:
Color?clr1?=?Color.FromArgb(122,25,255); Color?clr2?=?Color.FromKnowColor(KnowColor.Brown);//KnownColor為枚舉類型 Color?clr3?=?Color.FromName("SlateBlue");
在圖像處理中一般需要獲取或設(shè)置像素的顏色值,獲取一幅圖像的某個像素顏色值的具體步驟如下:
(1)定義Bitmap
Bitmap?myBitmap?=?new?Bitmap("c:\\MyImages\\TestImage.bmp");
(2)定義一個顏色變量把在指定位置所取得的像素值存入顏色變量中
Color?c?=?new?Color(); c?=?myBitmap.GetPixel(10,10);//獲取此Bitmap中指定像素的顏色。
(3)將顏色值分解出單色分量值
int?r,g,b;? r=?c.R;? g=c.G;? b=c.B;
3.Font類
Font類定義特定文本格式,包括字體、字號和字形屬性。Font類的常用構(gòu)造函數(shù)是public Font(string字體名,float字號,F(xiàn)ontStyle字形),其中字號和字體為可選項和public Font(string字體名,float 字號),其中“字體名”為Font的FontFamily的字符串表示形式。下面是定義一個Font對象的例子代碼:
FontFamily?fontFamily?=?new?FontFamily("Arial");? Font?font?=?new?Font(fontFamily,16,FontStyle.Regular,GraphicsUnit.Pixel);
字體常用屬性如下表所示:
名稱 | 說明 |
Bold | 是否為粗體。 |
FontFamily | 字體成員。 |
Height | 字體高。 |
Italic | 是否為斜體。 |
Name | 字體名稱。 |
Size | 字體尺寸。 |
SizeInPoints | 獲取此Font對象的字號,以磅為單位。 |
Strikeout | 是否有刪除線。 |
Style | 字體類型。 |
Underline | 是否有下劃線。 |
Unit | 字體尺寸單位。 |
4.Brush類
Brush類是一個抽象的基類,因此它不能被實例化,我們總是用它的派生類進行實例化一個畫刷對象,當我們對圖形內(nèi)部進行填充操作時就會用到畫刷。
5.Rectangle類
存儲一組整數(shù),共四個,表示一個矩形的位置和大小。矩形結(jié)構(gòu)通常用來在窗體上畫矩形,除了利用它的構(gòu)造函數(shù)構(gòu)造矩形對象外,還可以使用Rectangle結(jié)構(gòu)的屬性成員,其屬性成員如下表所示:
名稱 | 說明 |
Bottom | 底端坐標 |
Height | 矩形高 |
IsEmpty | 測試矩形寬和高是否為0 |
Left | 矩形左邊坐標 |
Location | 矩形的位置 |
Right | 矩形右邊坐標 |
Size | 矩形尺寸 |
Top | 矩形頂端坐標 |
Width | 矩形寬 |
X | 矩形左上角頂點X坐標 |
Y | 矩形左上角頂點Y坐標 |
Retangle結(jié)構(gòu)的構(gòu)造函數(shù)有以下兩個:
1、用指定的位置和大小初始化Rectangle類的新實例。
public?Retangle(Point,Size);//Size結(jié)構(gòu)存儲一個有序整數(shù)對,通常為矩形的寬度和高度。
2、使用矩形4個點的坐標初始化Rectangle類的新實例。
public?Rectangle(int,int,int,int);
6.Point類
用指定坐標初始化Point類的新實例。這個結(jié)構(gòu)很像C++中的Point結(jié)構(gòu),它描述了一對有序的x,y兩個坐標值,其構(gòu)造函數(shù)為:public Point(int x,int y);其中x為該點的水平位置;y為該點的水垂直位置。
下面是構(gòu)造Point對象的例子代碼:
Point?pt1=new?Point(30,30);? Point?pt2=new?Point(110,100);
到此這篇關(guān)于C#圖形編程GDI+的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Unity?UGUI的MaskableGraphic可遮罩圖形組件介紹使用
這篇文章主要為大家介紹了Unity?UGUI的MaskableGraphic可遮罩圖形組件介紹使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07winform攔截關(guān)閉按鈕觸發(fā)的事件示例
這篇文章主要介紹了c# winform攔截關(guān)閉按鈕觸發(fā)的事件示例,大家參考使用吧2014-01-01