作者:朱金燦
來源:http://blog.csdn.net/clever101/
儘管以前接觸過一下GDI+,但決心從現在開始系統學習GDI+,所用的教材為《精通GDI編程》。在VS 2010以下版本的VS 編譯器使用GDI+都需要對GDI+環境進行初始化操作(VS 2010中的MFC 10依賴GDI+,故不用初始化)。
VS 2003、VS 2005和VS 2008的GDI+環境初始化操作步驟一樣。
在應用程式類添加一個保護許可權的資料成員:
ULONG_PTR m_gdiplusToken;
在應用程式類的實現檔案包含gdi+的標頭檔:
#include <GdiPlus.h>
在工程附加庫加上:GdiPlus.lib
然後在應用程式類的InitInstance加上下面初始化代碼:
BOOL C***App::InitInstance()<br />{<br />Gdiplus::GdiplusStartupInput StartupInput;<br />GdiplusStartup(&m_gdiplusToken,&StartupInput,NULL);<br />}<br />
上面代碼的作用是初始化GDI+資源。
在應用程式類的InitInstance加上下面代碼:
int C***App::ExitInstance()<br />{<br />// TODO: 在此添加專用代碼和/或調用基類</p><p>Gdiplus::GdiplusShutdown(m_gdiplusToken);<br />return __super::ExitInstance();<br />}<br />
上面代碼的作用是銷毀GDI+資源。
VC 6.0中使用GDI+庫,請參考這篇文章:在VC6.0中使用GDI+的兩種辦法
現在測試一下我們初始化GDI+環境是否成功。我們使用GDI+的類介面在視圖客戶區繪製一個字串,具體代碼如下:
CDC *pDC = pView->GetDC();<br />Gdiplus::Graphics graphics(pDC->m_hDC);<br />Gdiplus::Pen pen(Gdiplus::Color(255,0,0,255));<br />Gdiplus::SolidBrush brush(Gdiplus::Color(255,0,0,255));<br />Gdiplus::FontFamily fontfm(L"宋體");<br />Gdiplus::Font font(&fontfm,24,Gdiplus::FontStyleRegular,Gdiplus::UnitPixel);<br />CRect rt;<br />pView->GetClientRect(&rt);<br />Gdiplus::PointF pointF(rt.Width()/2,rt.Height()/2);<br /> graphics.DrawString(L"GDI+程式示意",-1,&font,pointF,&brush);<br /> graphics.ReleaseHDC(pDC->m_hDC);<br /> pView->ReleaseDC(pDC);<br />
如下:
使用GDI+一些注意事項:
1.在DLL中使用GDI+庫,只需要包含GdiPlus.h和GdiPlus.lib,初始化GDI+環境的工作只需要在主調用程式做,否則在DLL初始化代碼中初始化GDI+環境容易發生DLL重入的錯誤(以前我犯過這樣的錯誤)。
2.GDI+介面參數使用的是unicode字元集,因為調用任何GDI+類介面時其字串參數都必須確保是unicode字元。在多位元組字元集環境下開發常量字串可以通過L宏轉換,變數多位元組字元轉unicode字元可以使用Windows API函數MultiByteToWideChar或ATL的A2W宏。
3. GDI+的對象和GDI控制代碼一樣,同樣會佔用資源,一次使用過多的GDI+的對象甚至會發生程式崩潰的現象。因此必須隨時將不必要的GDI+的對象佔用的資源釋放掉,如上例的:graphics.ReleaseHDC(pDC->m_hDC)。