一、GDI+基礎
1.GDI+簡介
GDI+是微軟的新一代二維圖形系統,它完全面向對象,要在Windows窗體中顯示字體或繪製圖形必須要使用GDI+。GDI+提供了多種畫筆、畫刷、圖像等圖形對象,此外還包括一些新的繪圖功能,比如漸變、除鋸齒、紋理等。
GDI+包括三部分:二維矢量圖形的繪製、圖像處理和文字顯示。GDI+使用的各種類大都包含在命名空間system::Drawing中。
2.常用的數據結構
在使用GDI+顯示文字和繪製圖形時,需要用到一些數據結構,例如Size、Point、Rectangle等,他們在命名空間System::Drawing中定義,都屬於值類型(結構類型)。
(1)Point結構
Point結構代表Windows窗體應用程序中的一個二維表面上的位置,常用於定義窗體或控件的位置,表示一個點的座標值,有X和Y兩種屬性。
可利用IsEmpty屬性檢測Point結構是否爲空,爲空則返回true。可直接對Point變量進行+、-、==、!=運算以及Point值與Size值的加減操作。
PointF結構類似於Point結構,區別是它的座標是浮點值。PointF值可通過Point結構包含的3鍾靜態方法轉換成Point值
(2)Size結構
Size結構用於定義Windows窗體應用程序中的窗口、控件和其他矩形區域的大小。具有寬度Width和Height屬性,也可以使用IsEmpty屬性來檢測Szie是否爲空。
初始化:Size b=Size(50,100);或者通過一個Point變量初始化:Size c=Size(Point(100,20));
SzieF結構與Size結構類似
(3)Rectangle結構
保存一個矩形區域的位置和大小,包含X、Y、Width、Height、Szie等屬性值。
初始化:指定一個Point和Size值,如: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(“隸書”,12,FontStyle::Bold);
·下面語句使用指定的度量單位而不是磅值創建字體,Font^ font2=gcnew Font(“隸書”,12,GraphiUnit::Document);
·組合上述兩個構造函數,Font^ font3=gcnew Font(“隸書”,12,FontStyle::Bold,GraphiUnit::Document);
2.GraphiUnit枚舉類型,用於指定給定數據的度量單位
·Display,將1/75英寸指定無味度量單位
·Docunment,將文檔單位指定爲度量單位
不一一列舉
3.FontStyle枚舉類型定義字體風格
·Bold,粗體
·Italic,斜體
·Regular,常規字體
·Underline,帶下劃線
五、畫筆
畫筆用Pen類型封裝,用於繪製圖形。可以使用這個類來創建一個指定顏色、默認寬度的畫筆對象。
1.Pen構造函數
·通過參數指定畫筆顏色,寬度爲默認1,Pen^ 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命名空間中定義了兩個最基本的畫刷:SolidBrush和TextureBrush。
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是個抽象基類,不能直接用來創建對象實例。提供了幾個靜態方法從文件中載入圖像,如FomrFile和FromStream方法,支持多種圖像文件格式(bmp、jpg、gif等)。
可以在顯示圖像時進行縮放操作。比如說可以使用一個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事件時會自動調用這個方法