1、概述
GDI在全稱是Graphics Device Interface,即圖形裝置介面。是圖形顯示與實際物理裝置之間的橋樑。GDI介面是基於函數,雖然使程式員省力不少,但是編程方式依然顯得麻煩。例如顯示一張位元影像,我們需要進行“建立位元影像,讀取位元影像檔案資訊,啟用情境裝置,調色盤變化“等一系列操作。然而有了GDI+,繁瑣的步驟再次被簡化。顧名思義,GDI+就是GDI的增強版,它是微軟在Windows 2000以後作業系統中提供的新介面。
2、GDI+主要功能 GDI+主要提供以下三種功能: (1) 二維向量圖形:GDI+提供了儲存圖形基元自身資訊的類(或結構體)、儲存圖形基元繪製方式資訊的類以及實際進行繪製的類;
(2) 影像處理:大多數圖片都難以劃定為直線和曲線的集合,無法使用二維向量圖形方式進行處理。因此,GDI+為我們提供了Bitmap、Image等類,它們可用於顯示、操作和儲存BMP、JPG、GIF等映像格式。
(3) 文字顯示:GDI+支援使用各種字型、字型大小和樣式來顯示文本。 相比於GDI,GDI+是基於C++類的對象化的應用程式介面,因此用起來更為簡單。GDI的核心是裝置上下文,GDI函數都依賴於裝置上下文控制代碼,其編程方式是基於控制代碼的;GDI+無需時刻依賴於控制代碼或裝置上下文,使用者只需建立一個Graphics 對象,就可以用物件導向的方式調用其成員函數進行圖形操作,編程方式是基於對象的。
3、GDI繪製執行個體 GDI在使用裝置上下文繪製線條之前,必須先調用SelectObject 以使筆對象和裝置上下文關聯。其後,在裝置上下文中繪製的所有線條均使用該筆,直到選擇另一支不同的筆為止。 使用GDI畫線代碼如下
// TODO: Add your command handler code here CClientDC clientDC; //目標DC CPen pen (PS_SOLID, 1, RGB(0, 0, 255)); clientDC.SelectObject(pen.GetSafeHandle()); //開始繪製 clientDC.MoveTo(0, 0) clientDC.LineTo(rect.right, 0); clientDC.SelectObject(oldObject);
從上述代碼可以看出:在GDI編程中,幾乎所有的操作都圍繞裝置上下文dc展開。的確,這正是GDI編程的特點!裝置上下文是 Windows 使用的一種結構,所有GDI操作前都需取得特定裝置的上下文,函數中的CClientDC dc (this) 陳述式完成這一功能。 利用GDI進行圖形、影像處理的一般操作步驟為:1. 取得指定視窗的DC。2. 確定使用的座標系及映射方式。3. 進行圖形、映像或文文書處理。4. 釋放所使用的DC。但是,在GDI+中,只需將Pen對象直接作為參數傳遞給Graphics類的DrawLine等方法即可,而不必使Pen對象與 Graphics對象關聯。 4、GDI+繪製執行個體 使用GDI+畫線代碼如下
// TODO: Add your command handler code here CClientDC clientDC (this); //建立Graphics對象 Graphics graphics(clientDC); //建立pen Pen myPen; myPen.SetWidth(1); //畫X軸 myPen.SetColor(Color::Blue); graphics.DrawLine(&myPen, 0, 0, rect.right, 0);
(1)建立 Graphics 對象:Graphics 對象表示GDI+繪圖表面,是用於建立圖形映像的對象。 (2)使用 Graphics 對象繪製線條和形狀、呈現文本或顯示與操作映像。 GDI+的相對與GDI而言,新增了一系列功能:漸層的畫刷(Gradient Brushes)、基數樣條函數(Cardinal Splines)、持久的路徑對象(Persistent Path Objects)、變形和矩陣對象(Transformations &Matrix Object)、可伸縮地區(Scalable Regions)、Alpha混合(Alpha Blending)和豐富的映像格式支援等。下面,我們來逐個用實際代碼實現GDI+的新增功能。 4.1漸層的畫刷 (GDI+提供了用於填充圖形、路徑和地區的線性漸層畫刷和路徑漸層畫刷。線性漸層畫刷使用漸層顏色來填充圖形。當用路徑漸層畫刷填充圖形時,可指定從圖形的一部分移至另一部分時畫刷顏色的變化方式。例如,我們可以只指定圖形的中心顏色和邊緣顏色,當畫刷從圖形中間向外邊緣移動時,畫刷會逐漸從中心顏色變化到邊緣顏色。 )
// TODO: Add your command handler code hereCClientDC clientDC (this);CRect rect;GetClientRect(&rect);//建立Graphics對象Graphics graphics(clientDC);//建立漸層畫刷LinearGradientBrush lgb(Point(0, 0), Point(rect.right, rect.bottom), Color::Blue, Color::Green);//填充graphics.FillRectangle(&lgb, 0, 0, rect.right, rect.bottom);
4.2基數樣條函數 (基數樣條指的是一連串單獨的曲線,這些曲線串連起來形成一條較大的曲線。樣條由點(Point結構體)的數組指定,並通過該數組中的每一個點。基數樣條平滑地穿過數組中的每一個點(不出現尖角),因此比用直線串連建立的路徑精確。)
// TODO: Add your command handler code here CClientDC clientDC (this); //建立Graphics對象 Graphics graphics(clientDC); Point points[] = { Point(0, 0), Point(100, 200), Point(200, 0), Point(300, 200), Point(400, 00) }; //直接畫線 for (int i = 0; i < 4; i++) { graphics.DrawLine(&Pen(Color::Blue, 3), points[i], points[i + 1]); } //利用基數樣條畫線 graphics.DrawCurve(&Pen(Color::Red, 3), points, 5);
4.3變形和矩陣對象 (GDI+提供了Matrix對象,它是一種可以使變形(旋轉、平移、縮放等) 簡易靈活的強大工具,Matrix對象需與要被變形的對象聯合使用。對於GraphicsPath類,我們可以使用其成員函數Transform接收 Matrix參數用於變形。)
// TODO: Add your command handler code here CClientDC clientDC (this); //建立Graphics對象 Graphics graphics(clientDC); GraphicsPath path; path.AddRectangle(Rect(250, 20, 70, 70)); graphics.DrawPath(&Pen(Color::Black, 1), &path); // 在應用變形矩陣之前繪製矩形 // 路徑變形 Matrix matrix1, matrix2; matrix1.Rotate(45.0f); //旋轉順時針45度 path.Transform(&matrix1); //應用變形 graphics.DrawPath(&Pen(Color::Red, 3), &path); matrix2.Scale(1.0f, 0.5f); //轉化成為平行四邊形法則 path.Transform(&matrix2); //應用變形 graphics.DrawPath(&Pen(Color::Blue, 3), &path);
4.4豐富的映像格式支援 (GDI +提供了Image、Bitmap 和Metafile 類,方便使用者進行映像格式的載入、操作和儲存。GDI+支援的映像格式有BMP、GIF、JPEG、EXIF、PNG、TIFF、ICON、WMF、 EMF等,幾乎涵蓋了所有的常用映像格式。)
from:http://edu.292775.com/windows/201211/16377.html