GDI 學習筆記之GDI 環境初始化

2021-08-25 13:32:54 字數 1505 閱讀 3200

儘管以前接觸過一下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.lib

然後在應用程式類的initinstance加上下面初始化**:

上面**的作用是初始化gdi+資源。

在應用程式類的initinstance加上下面**:

上面**的作用是銷毀gdi+資源。

vc 6.0中使用gdi+庫,請參考這篇文章:在vc6.0中使用gdi+的兩種辦法

現在測試一下我們初始化gdi+環境是否成功。我們使用gdi+的類介面在檢視客戶區繪製乙個字串,具體**如下:

cdc *pdc = pview->getdc(); gdiplus::graphics graphics(pdc->m_hdc); gdiplus::pen pen(gdiplus::color(255,0,0,255)); gdiplus::solidbrush brush(gdiplus::color(255,0,0,255)); gdiplus::fontfamily fontfm(l"宋體"); gdiplus::font font(&fontfm,24,gdiplus::fontstyleregular,gdiplus::unitpixel); crect rt; pview->getclientrect(&rt); gdiplus::pointf pointf(rt.width()/2,rt.height()/2); graphics.drawstring(l"gdi+程式示意",-1,&font,pointf,&brush); graphics.releasehdc(pdc->m_hdc); pview->releasedc(pdc);

效果圖如下:

使用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)。

GDI 學習筆記之GDI 環境初始化

儘管以前接觸過一下gdi 但決心從現在開始系統學習gdi 所用的教材為 精通gdi程式設計 在vs 2010以下版本的vs 編譯器使用gdi 都需要對gdi 環境進行初始化操作 vs 2010中的mfc 10依賴gdi 故不用初始化 vs 2003 vs 2005和vs 2008的gdi 環境初始化...

GDI 學習筆記之GDI 環境初始化

儘管以前接觸過一下gdi 但決心從現在開始系統學習gdi 所用的教材為 精通gdi程式設計 在vs 2010以下版本的vs 編譯器使用gdi 都需要對gdi 環境進行初始化操作 vs 2010中的mfc 10依賴gdi 故不用初始化 vs 2003 vs 2005和vs 2008的gdi 環境初始化...

GDI 學習筆記之GDI 環境初始化

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!儘管以前接觸過一下gdi 但決心從現在開始系統學習gdi 所用的教材為 精通gdi程式設計 在vs 2010以下版本的vs 編譯器使用gdi 都需要對gdi 環境進行初始化操作 vs 2010中的mfc 10依賴gdi 故不用初始化 vs 2003...