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