GDI+入門——帶你走進Windows圖形的世界

一、GDI+基礎

1.GDI+簡介

GDI+是微軟的新一代二維圖形系統,它完全面向對象,要在Windows窗體中顯示字體或繪製圖形必須要使用GDI+GDI+提供了多種畫筆、畫刷、圖像等圖形對象,此外還包括一些新的繪圖功能,比如漸變、除鋸齒、紋理等。

GDI+包括三部分:二維矢量圖形的繪製、圖像處理和文字顯示。GDI+使用的各種類大都包含在命名空間system::Drawing中。

2.常用的數據結構

在使用GDI+顯示文字和繪製圖形時,需要用到一些數據結構,例如SizePointRectangle等,他們在命名空間System::Drawing中定義,都屬於值類型(結構類型)。

(1)Point結構

Point結構代表Windows窗體應用程序中的一個二維表面上的位置,常用於定義窗體或控件的位置,表示一個點的座標值,有XY兩種屬性。

可利用IsEmpty屬性檢測Point結構是否爲空,爲空則返回true。可直接對Point變量進行+-==、!=運算以及Point值與Size值的加減操作。

PointF結構類似於Point結構,區別是它的座標是浮點值。PointF值可通過Point結構包含的3鍾靜態方法轉換成Point

(2)Size結構

Size結構用於定義Windows窗體應用程序中的窗口、控件和其他矩形區域的大小。具有寬度WidthHeight屬性,也可以使用IsEmpty屬性來檢測Szie是否爲空。

初始化:Size b=Size(50,100);或者通過一個Point變量初始化:Size c=Size(Point(100,20));

SzieF結構與Size結構類似

(3)Rectangle結構

保存一個矩形區域的位置和大小,包含XYWidthHeightSzie等屬性值。

初始化:指定一個PointSize值,如:Rectangle b=Rectangle(point1,size1);或者直接指定矩形位置、寬度和高度值,前兩個參數指定了矩形左上角的XY值,後兩個參數指定矩形的寬度高度

方法:

·Contains方法:確定一個矩形或一個點是否在當前矩形區域內。參數類型可以是Point結構,Rectangle結構和點座標值。

·Union方法:求兩個矩形的並集。參數是兩個矩形,返回一個包含其並集的Rectangle結構。

·Intersect方法:求兩個矩形的交集。參數爲兩個矩形,返回Rectangle結構,參數爲一個矩形時,則獲取當前矩形與參數矩形的交集。

繪製一個空間的工作區時,常常用Rectangle結構。Form類中有一個ClientRectangle屬性,用於獲取工作區的位置,Rectangle myRect=ClientRectangle;窗體的可視化區域爲工作區的大小減去狀態欄的大小。

RectangleF結構與Rectangle結構類似。

 

二、Graphics對象

1.簡介

在傳統的Windows窗口中,使用Device Context即設備上下文來進行繪圖操作,而在.NET框架的Windows窗體中使用繪圖對象進行繪圖操作。使用System::Drawing命名空間中的Graphics類封裝GDI+繪圖對象,在Windows窗體中的所有繪圖操作都必須通過這個類進行,Graphics類就相當於MFC中的CDC類。要使用Graphics進行繪圖,首先必須獲得它的對象實例或是創建一個Graphics對象。最常用的方法是可以通過窗體的Paint時間來獲取對象實例,創建對象則通過CreateGraphics方法。

2.Graphics類提供許多繪圖方法:

·Clear方法:使用一種指定顏色填充整修繪圖表面。

·DrawCloseCurve:繪製閉合曲線。

·DrawCurve:繪製曲線。

·DrawImage:繪製圖像。

3.Graphics對象創建方法:

1在窗體或控件的 Paint 事件中接收對圖形對象的引用,作爲 PaintEventArgs 的一部分。在爲控件創建繪製代碼時,通常會使用此方法來獲取對圖形對象的引用。 

2調用某控件或窗體的 CreateGraphics 方法以獲取對 Graphics 對象的引用,該對象表示該控件或窗體的繪圖圖面。如果想在已存在的窗體或控件上繪圖,請使用此方法。 

3由從 Image 繼承的任何對象創建 Graphics 對象。此方法在您需要更改已存在的圖像時十分有用。

三、顏色Color

GDI+中用值類型Color結構來表示顏色,在類和方法中要使用顏色的時候,需要Color結構的一個實例。Color結構中預定義了141中顏色,它們都使用靜態屬性來表示。

1.創建Color對象實例的方法:

·通過一個靜態屬性返回:Color newColor=Color::Red;

·使用默認的構造函數創建Color實例,但是產生的Color對象是純黑色的,並且不可修改

·調用FormArgb靜態方法,Color sky=Color::FormArgb(100,200,200,255);參數依次爲alpha成分,紅,綠,藍。alpha缺省即爲最大值,即完全不透明

·使用FormKnownColor靜態方法,參數爲KnownColor枚舉類型的值。例如:Color sky=Color::FormKnownColor(KnownColor::Blue);

·調用FormName靜態方法,參數是一個字符串,這個字符串是KnownColor枚舉值的名稱。如,Color sky=Color::FormName(Blue);

2.Color屬性

Color有4個只讀屬性,分別alpha、紅色、綠色、藍色

Windows系統使用一些系統範圍的顏色,如活動邊框的顏色和標題欄顏色等。.NET框架爲這些系統顏色提供了一個封裝類——SystemColors,各種系統顏色以靜態屬性的形式保存在這個類中,可以直接通過類名引用

 

四、字體

在窗體和控件中都包含有Font屬性,表示窗體或控件當前使用的字體,當窗體或控件創建時,會使用系統的默認字體值。

字體使用Drawing::Font類封裝,通過創建這麼個類的實例可以創建新的字體。

1.Font構造函數:

·下面語句創建一個12磅的粗體隸書字體,Font^ font1=gcnew Font(隸書12FontStyle::Bold);

·下面語句使用指定的度量單位而不是磅值創建字體,Font^ font2=gcnew Font(隸書12GraphiUnit::Document);

·組合上述兩個構造函數,Font^ font3=gcnew Font(隸書12FontStyle::BoldGraphiUnit::Document);

2.GraphiUnit枚舉類型,用於指定給定數據的度量單位

·Display,將1/75英寸指定無味度量單位

·Docunment,將文檔單位指定爲度量單位

不一一列舉

3.FontStyle枚舉類型定義字體風格

·Bold,粗體

·Italic,斜體

·Regular,常規字體

·Underline,帶下劃線

 

五、畫筆

畫筆用Pen類型封裝,用於繪製圖形。可以使用這個類來創建一個指定顏色、默認寬度的畫筆對象。

1.Pen構造函數

·通過參數指定畫筆顏色,寬度爲默認1Pen^ penRed=gcnew Pen(Color::Red);

·指定畫筆顏色和寬度,Pen^ penRed=gcnew Pen(Color::Red,10);

·參數使用畫刷來指定畫筆格式,Pen^ penRed=gcnew Pen(brushRed);

·參數使用畫刷來指定畫筆模式及寬度,Pen^ penRed=gcnew Pen(brushRed,5);

2.Pen類型常用屬性

·Alignment,指定Pen對象的對齊方式;是一個PenAlignment枚舉值。

·Brush,獲取或設置用於確定此 Pen對象的屬性的 Brush對象 ;

·Color,獲取或設置畫筆顏色;

·EndCap,指定線條末端出現的形狀。這是一個LineCap枚舉值,默認爲LineCap::Flat

·LineJoin,指定此 Pen對象繪製的兩條連續直線終點之間的聯接樣式。這是一個LineJoin枚舉值。

·PenType,獲取用此 Pen對象繪製的直線的樣式,是一個 PenType枚舉值。

·StartCap,指定線條起點出現的形狀。默認爲LineCap::Flat

·Width,獲取或設置畫筆繪製的線條的寬度。

3.畫筆的使用

SystemPens類,Windows系統顏色畫筆,用於創建與用戶界面和系統顏色想匹配的筆,它的每個靜態屬性都返回一個Pen對象。下面這行語句創建一個Pen對象,將它初始化爲用戶加亮顯示文本時首選的顏色。

Pen^ highlightPen = SysternPens::HighlightText;

SystemPens類的靜態屬性

·Control,控件背景顏色;

·ActiveCaptionText,活動窗口標題欄的文本顏色;

·HighlightText,加亮顯示的文本顏色;

·WindowText,窗口的文本顏色;

·WindowFrame,窗口的圖文框顏色。

Pens類提供了很多定義顏色的畫筆對象,它們以靜態屬性的形式保存。例如要創建一個紅色畫筆,可以調用Pens ::Red屬性,例如,Pen^ penRed=Pens::Red;

 

六、畫刷

顯示文字除了指定字體外,還有指定畫刷,另外在圖形填充時也要使用畫刷,同時畫筆也可以基於畫刷來創建。Brush類是一個抽象類。不能直接用來創建畫刷實例,在System::Drawing命名空間中定義了兩個最基本的畫刷:SolidBrushTextureBrush

SolidBrush類,使用一種純色來填充區域;創建方法:SoildBrush^ skyBrush=gcnew SoildBrush(Color::Blue);只有一個Color屬性,用於獲取或設置畫刷顏色。

TextureBrush類,使用一個圖像來填充區域;方法:TextureBrush^ br=gcnew TextureBrush(C:\image1.bmp);

(1)畫刷的使用,可使用靜態屬性直接引用:Brush^ brushRed=Brush::Red;

(2)系統顏色畫刷SystemBrushes類,這些畫刷也作爲靜態屬性在SystemBrushes中保存

 

七、顯示文字

Windows窗體程序中文字的顯示通過Graphics類的DrawingString方法進行,調用這個方法需要指定顯示的字符串、字體、畫刷以及顯示的位置

代碼示例:

Image^ img=Image::FormFile(sample.jpg);

TextrueBrush^ tb=gcnew TextureBrush(img);

Graphics^ gg=e->Graphics;

gg->DrawString(VS2005,f,tb,10,80);

可以使用StringFormat對象來改變文字顯示方向,作爲一個參數放在位置參數後面

 

八、顯示文字

使用Image類封裝基本的圖像操作。Image是個抽象基類,不能直接用來創建對象實例。提供了幾個靜態方法從文件中載入圖像,如FomrFileFromStream方法,支持多種圖像文件格式(bmpjpggif)

可以在顯示圖像時進行縮放操作。比如說可以使用一個Rectangle變量指定位圖位置和大小。

Rectangle^ rec=gcnew Rectangle(10,10,100,100);

this->CreateGraphics()->DrawImage(bmp,rec);

 

九、Paint事件

所有繪圖操作都是通過響應窗體或空間的Paint事件來進行處理的。幾乎所有的窗體和控件類都包含這個事件。

Paint事件的代理類型爲PaintEventHandle,事件參數類型爲PaintEventArgs。在這個參數中包含了兩個在處理Paint事件方面十分重要的屬性:
·ClipRectangle,獲取要在其中進行會話的矩形。

·Graphics,返回一個Graphics類實例,用於輸出。

窗體和控件類提供了OnPaint虛擬方法來更方便地處理Paint事件,當觸發Paint事件時會自動調用這個方法


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章