金 濤
[摘要]GDI是Windows圖形圖像編程的主要API接口,但是其功能貧乏,使用復雜性給程序員帶來很多的不便。GDI+的出現使這一現象大為改觀,它是微軟的.Net Framework的一個重要組成部分,大大增強Windows的圖形圖像開發接口,同時它也改變了傳統的GDI編程模式,使開發工作大幅度簡化。首先從理論角度介紹GDI+的種種優越特性,再從代碼開發的角度說明如何來使用GDI+。
[關鍵詞]GDI+ PNG 圖形圖像
中圖分類號:TP3文獻標識碼:A文章編號:1671-7597(2009)0910042-01
GDI+是一種應用程序編程接口(API),通過一套部署為托管代碼的類來展現。這套類被稱為GDI+的“托管類接口”。應用程序的程序員可利用GDI+這樣的圖形設備接口在屏幕或打印機上顯示信息,而不需要考慮特定顯示設備的具體情況。應用程序的程序員調用GDI+類提供的方法,而這些方法又反過來相應地調用特定的設備驅動程序。GDI+應用程序與圖形硬件隔離,而正是這種隔離允許開發人員創建設備無關的應用程序。
一、關于GDI+
(一)什么是GDI+
GDI+是GDI(Graphics Device Inteface)的一個新版本,它不僅對原有的GDI功能進行了優化,還添加了許多新特新。GDI+提供了顏色類、畫刷類、畫筆類、字體類、區域類、圖形類、位圖類和圖像類等,使得程序員能夠輕易的完成二維和三維圖形處理。
(二)GDI+的功能
GDI+主要提供了以下三個功能服務:
1.二維矢量圖形。矢量圖形包括坐標系統中的系列點指定的繪圖基元(如直線、曲線和圖形)。例如,直線可通過它的兩個端點來指定,而矩形可通過確定其左上角位置的點并給出其寬度和高度的一對數字來指定。簡單路徑可由通過直線連接的點的數組來指定。貝塞爾樣條是由四個控制點指定的復雜曲線。GDI+提供了存儲基元自身相關信息的類(結構)、存儲基元繪制方式相關信息的類,以及實際進行繪制的類。
2.圖像處理。有些種類的圖片很難或者根本無法用矢量圖形技術來顯示。例如,工具欄按鈕上的圖片和顯示為圖標的圖片就難以指定為直線和曲線的集合。擁擠的棒球運動場的高分辨率數字照片會更難以使用矢量技術來制作。這種類型的圖像可存儲為位圖,即代表屏幕上單個點顏色的數字數組。GDI+提供了Bitmap類,可用于顯示、操作和保存位圖。
3.文字顯示版式。就是使用各種字體、字號和樣式來顯示文本。GDI+為這種復雜任務提供了大量的支持。GDI+中的新功能之一是子像素消除鋸齒,它可以使文本在LCD屏幕上呈現時顯得比較平滑。本文首先介紹GDI+的幾個主要新增的特性及其功能,然后說明它給Windows圖形圖像程序的開發模式帶來的變化,最后給出代碼實例,介紹如何在VC++6.0中使用GDI+進行程序開發。
二、PNG按鈕的應用
下面展示一個以PNG圖片為背景的按鈕的簡單應用,環境選擇在VC++6.0下。
(一)需要下載GDI+開發包
這里面包含了GDI+里的很多類和函數。先需要有GDI+的開發包(.Net Framework中包含該開發包),可以去微軟的FTP網站免費下載,需要的文件有:動態鏈接庫文件gdiplus.dll,靜態鏈接庫文件gdiplus.Lib,代碼中所需要的多個以gdiplus開頭的頭文件如gdiplus*.h等文件。
(二)VC中的設置
Tools/Options/Directories中加入所下載的文件所在路徑在Project
/Settings/Link中加入gdiplus.Lib。
StdAfx.h中包含頭文件#include
另外,要使用GDI+的文件頭部加上名字空間聲明:Using namespace GdiPlus。
(三)用VC開發GDI+程序(設工程文件名為GDIPlus2Demo)
1.先要進行初始化,在CGDIPlusDemoApp類聲明一個成員變量
ULONG PTR m_gdiplusToken;//ULONG PTR為int64類型
2.在CGDIPlusDemoApp::InitInstance()函數中加入以下代碼對GDI+進行初始化
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&m_gdiplusToken,&gdiplusStartupInput,NULL);
3.在CGDIPlusDemoApp::ExitInstance()函數加入以下代碼對GDI+關
閉GDI+
GdiplusShutdown(m_gdiplusToken);
4.接下來就可以在利用GDI+進行畫圖了
在CGDIPlusDemoView::OnPaint()中進行畫圖:
CPaintDC dc(this);//device context for painting
CRect rc;
GetDlgItem(IDC_BUTTON1)->GetWindowRect(&rc); //獲得按鈕的大小
ScreenToClient(&rc); //屏幕坐標轉換為客戶區坐標
Graphics graphics(GetDC()->m_hDC); //創建需要的DC,取得DC句柄
Image image(L"btn.png",false); //圖片的路徑(可以用相對路徑)
Graphics.DrawImage(?,rc.left-30,rc.top-30,rc.Width()+60,rc.Height()+60); //按鈕上面畫出圖片
三、結論
本文經過對GDI+進行功能研究以及開發Windows圖像程序的演示,展示了新一代的Windows圖形圖像接口種種優越特性。GDI+不但在功能上比GDI要強大很多,而且在代碼編寫方面也簡單很多,因此將很快成為Windows圖形圖像程序開發的首選。
基金項目:甘肅政法學院科研資助青年
項目編號:GZF2009XQNLW20
參考文獻:
[1]Microsoft MSDN[EB/OL].http://msdn.microsoft.com/li2rary/,Micr
osoft,20022051.
[2]侯捷,深入淺出mfc第二版[M].湖北:華中科技大學出版社,2001.
[3]王鉦旋,計算機圖像處理程序設計[M].長春:吉林大學出版社,1999.