GDI+編程基礎

來源:互聯網
上載者:User

一、GDI
  GDI是位於應用程式與不同硬體之間的中介層,這種結構讓程式員從直接處理不同硬體的工作中解放出來,把硬體間的差異交給了GDI處理。GDI通過將應用程式與不同輸出裝置特性相隔離,使Windows應用程式能夠毫無障礙地在Windows支援的任何圖形輸出裝置上運行。例如,我們可以在不改變程式的前提下,讓能在Epson點式印表機上工作的程式也能在雷射印表機上工作。它把windows系統中的圖形輸出轉換成硬體命令然後發送給硬體裝置。GDI是以檔案的形式儲存在系統中,系統需要輸出圖形時把它載入記憶體,如果轉換成硬體命令時遇到非GDI命令,系統還可能載入硬體驅動程式,驅動程式輔助GDI把圖形命令轉換成硬體命令。

二、裝置環境
  Windows系統是用來給應用程式提供裝置獨立性的工具,它是windows系統為了處理輸出裝置而使用的一種內部資料結構,裝置環境是windos程式,驅動程式,和輸出裝置(如印表機,繪圖器)之間的紐帶,GDI是一組C++類,它在驅動程式的協助下把資料描繪在硬體上,它位於應用程式與硬體之間,把資料從一方傳到另一方。在Visual Studio .NET中Micro$oft解決了GDI中的許多問題,並讓它變得易用,GDI的.net版本叫做GDI+。

三、GDI+
  GDI+是GDI的下一個版本,它進行了很好的改進,並且易用性更好。GDI的一個好處就是你不必知道任何關於資料怎樣在裝置上渲染的細節,GDI+更好的實現了這個優點,也就是說,GDI是一個中低層API,你還可能要知道裝置,而GDI+是一個高層的API,你不必知道裝置。例如你如果要設定某個控制項的前景和背景色,只需設定BackColor和ForeColor屬性。

四、編程模式的變化
“GDI uses a stateful model, whereas GDI+ uses a stateless”——GDI是有狀態的,GDI+是無無狀態的。

1、不再使用裝置環境或控制代碼
  在使用GDI繪圖時,必須要指定一個裝置環境(DC),用來將某個視窗或裝置與裝置環境類的控制代碼指標關聯起來,所有的繪圖操作都與該控制代碼有關。而GDI+不再使用這個裝置環境或控制代碼,取而代之是使用Graphics對象。與裝置環境相類似,Graphics對象也是將螢幕的某一個視窗與之相關聯,並包含繪圖操作所需要的相關屬性。但是,只有這個Graphics對象與裝置環境控制代碼還存在著聯絡,其餘的如Pen、Brush、Image和Font等對象均不再使用裝置環境。

2、Pen、Brush,Font,Image等對象是繪圖物件獨立的
  
畫筆對象能與用於提供繪製方法的繪圖物件分開建立於維護,Graphics繪圖方法直接將Pen對象作為自己的參數,從而避免了在GDI使用SelectObject進行繁瑣的切換,類似的還有Brush、Path、Image和Font等。

3、“當前位置”
  
GDI繪圖操作(如畫線)中總存在一個被稱為"當前位置"的特殊位置。每次畫線都是以此當前位置為起始點,畫線操作結束之後,直線的結束點位置又成為了當前位置。設定當前位置的理由是為了提高畫線操作的效率,因為在一些場合下,總是一條直線連著另一條直線,首尾相接。有了當前位置的自動更新,就可避免每次畫線時都要給出兩點的座標。儘管有其必要性,但是單獨繪製一條直線的場合總是比較多的,因此GDI+取消這個"當前位置"以避免當無法確定"當前位置"時所造成的繪圖的差錯,取而代之的是直接在DrawLine中指定直線起止點的座標。
  

4、繪製和填充
  GDI總是讓形狀輪廓繪製和填充使用同一個繪圖函數,例如Rectangle。輪廓繪製需要一個畫筆,而填充一個地區需要一個畫刷。也就是說,不管我們是否需要填充所繪製的形狀,我們都需要指定一個畫刷,否則GDI採用預設的畫刷進行填充。這種方式確實給我們帶來了許多不便,現在GDI+將形狀輪廓繪製和填充操作分開而採用不同的方法,例如DrawRectangle和FillRectangle分別用來繪製和填充一個矩形。   

5、地區的操作
  GDI提供了許多地區建立函數,如:CreateRectRgn、CreateEllpticRgn、CreateRoundRectRgn、CreatePolygonRgn和CreatePolyPolygonRgn等。誠然,這些函數給我們帶來了許多方便。但在GDI+中,由於為了便於將地區引入矩陣變換操作,GDI+簡化一般地區建立的方法,而將更複雜的地區建立交由Path接管。由於Path對象是與裝置環境分離開來的,因而可以直接在Region建構函式中加以指定。

五、GDI+新特色
GDI+與GDI相比,增加了下列新的特性:

1、漸層畫刷
  以往GDI實現色彩坡形地區的方法是通過使用不同顏色的線條來填充一個裁剪地區而達到的。現在GDI+拓展了GDI功能,提供線型漸層和路徑漸層畫刷來填充一個圖形、路徑和地區,甚至也可用來繪製直線、曲線等。這裡的路徑可以視為由各種繪圖函數產生的軌跡。   

2、樣條曲線
  
對於曲線而言,最具實際意義的莫過於樣條曲線。樣條曲線是在生產實踐的基礎上產生和發展起來的。模線間的設計人員在繪製模線時,先按給定的資料將型值點準確地"點"到圖板上。然後,採用一種稱為"樣條"的工具(一根富有彈性的有機玻璃條或木條),用壓鐵強迫它通過這些型值點,再適當調整這些壓鐵,讓樣條的形態發生變化,直至取得合適的形狀,才沿著樣條畫出所需的曲線。如果我們把樣條看成彈性細梁,那麼壓鐵就可看成作用在這樑上的某些點上的集中力。GDI+的Graphics:: DrawCurve函數中就有一個這樣的參數用來調整集中力的大小。除了樣條曲線外,GDI+還支援原來GDI中的Bezier曲線。

3、獨立的路徑對象
  在GDI中,路徑是隸屬於一個裝置環境(上下文),也就是說一旦裝置環境指標超過它的有效期間,路徑也會被刪除。而GDI+是使用Graphics對象來進行繪圖操作,並將路徑操作從Graphics對象分離出來,提供一個GraphicsPath類供使用者使用。這就是說,我們不必擔心路徑對象會受到Graphics對象操作的影響,從而可以使用同一個路徑對象進行多次的路徑繪製操作。

4、矩陣和矩陣變換
  在圖形處理過程中常需要對其幾何資訊進行變換以便產生複雜的新圖形,矩陣是這種圖形幾何變換最常用的方法。為了滿足人們對圖形變換的需求,GDI+提供了功能強大的Matrix類來實現矩陣的旋轉、錯切、平移、比例等變換操作,並且GDI+還支援Graphics圖形和地區(Region)的矩陣變換。

5、Alpha通道合成運算
  在影像處理中,Alpha用來衡量一個像素或映像的透明度。在非壓縮的32位RGB映像中,每個像素是由四個部分組成:一個Alpha通道和三個顏色分量(R、G和B)。當Alpha值為0時,該像素是完全透明的,而當Alpha值為255時,則該像素是完全不透明。   
  Alpha混色是將源像素和背景像素的顏色進行混合,最終顯示的顏色取決於其RGB顏色分量和Alpha值。它們之間的關係可用下列公式來表示
  顯示顏色 = 源像素顏色 X alpha / 255 + 背景顏色 X (255 - alpha) / 255
GDI+的Color類定義了ARGB顏色資料類型,從而可以通過調整Alpha值來改變線條、映像等與背景色混合後的實際效果。

6、多圖片格式的支援
  GDI+提供了對各種圖片的開啟,儲存功能。通過GDI+,我們能夠直接將一幅BMP檔案儲存體成JPG或其它格式的圖片檔案。
  除了上述新特性外,GDI+還將支援重新著色、色彩修正、消除走樣、中繼資料以及Graphics容器等特性。

六、VC.net中使用GDI+的方法  
在Visual C++.NET使用GDI+一般遵循下列步驟:   

(1)、在應用程式中添加GDI+的包含檔案gdiplus.h以及附加的類庫gdiplus.lib。通常gdiplus.h包含檔案添加在應用程式的stdafx.h檔案中,而gdiplus.lib可用兩種進行添加:第一種是直接在stdafx.h檔案中添加下列語句:

#pragma comment( lib, "gdiplus.lib" ) 

  另一種方法是:選擇"項目->屬性"功能表命令,在彈出的對話方塊中選中左側的"連結器->輸入"選項,在右側的"附加依賴項"框中鍵入gdiplus.lib,

(2)、在應用程式項目的應用類中,添加一個成員變數,如下列代碼:

ULONG_PTR m_gdiplusToken;

其中,ULONG_PTR是一個DWORD資料類型,該成員變數用來儲存GDI+被初始化後在應用程式中的GDI+標識,以便能在應用程式退出後,引用該標識來調用Gdiplus:: GdiplusShutdown來關閉GDI+。

(3)、在應用類中添加ExitInstance的重載,並添加下列代碼用來關閉GDI+:

int CGDIPlusApp::ExitInstance()
{
 Gdiplus::GdiplusShutdown(m_gdiplusToken);
 return CWinApp::ExitInstance();
}

(4)、在應用類的InitInstance函數中添加GDI+的初始化代碼:

BOOL CGDIPlusApp::InitInstance()
{
 CWinApp::InitInstance();
 Gdiplus::GdiplusStartupInput gdiplusStartupInput;
 Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
 ...
}

(5)、在需要繪圖的視窗或視圖類中添加GDI+的繪製代碼:

void CGDIPlusView::onDraw(CDC *pDC){Graphics graphics( pDC->m_hDC );GraphicsPath path; // 構造一個路徑path.AddEllipse(50, 50, 200, 100);// 使用路徑構造一個畫刷PathGradientBrush pthGrBrush(&path);// 將路徑中心顏色設為藍色pthGrBrush.SetCenterColor(Color(255, 0, 0, 255));// 設定路徑周圍的顏色為藍芭,但alpha值為0Color colors[] = {Color(0, 0, 0, 255)};INT count = 1;pthGrBrush.SetSurroundColors(colors, &count);graphics.FillRectangle(&pthGrBrush, 50, 50, 200, 100);LinearGradientBrush linGrBrush(Point(300, 50),Point(500, 150),Color(255, 255, 0, 0), // 紅色Color(255, 0, 0, 255)); // 藍色graphics.FillRectangle(&linGrBrush, 300, 50, 200, 100);}

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.