在VC中使用GDI

2021-06-12 14:07:11 字數 3258 閱讀 2109

gdi+可應用於二維向量圖象,柵格圖象及排版,是為c/c++程式設計師而設計的表現為c++類而存在的介面,能用於一切基於windows的應用中。作為gdi的後繼者,gdi+在gdi中增加了新功能,如文字的反鋸齒,漸變筆刷,alpha溶合;也優化了gdi許多已有的功能。此外,gdi+改變了程式設計模式,使其更靈活及易用。

gdi+並不限於在.net中存在,實際上它由windows xp或windows server 2003作業系統提供。它被打包在乙個名為gdiplus.dll的檔案中。此檔案位於c:/windows/winsxs下的相應資料夾下。以筆者的xp系統為例,共有2個版本,其相應的資料夾分別是:

x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.0.0.0_x-ww_8d353f13

x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.0.2600.2180_x-ww_522f9f82

在應用程式中,我們不需指定版本號,系統自動選擇最新的版本。先假設我們已經在vc6中編好乙個gdi+應用,在degbug版本中單擊選單build->start debug->go啟動除錯,再終止應用,在vc6的output區域中可以看到以下資訊:

loaded ''c:/windows/winsxs/x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.0.2600.2180_x-ww_522f9f82/gdiplus.dll''

說明系統自動選擇了最新的版本。

如同windows是用c語言編寫,gdiplus.dll是以c函式實現的,並沒有封裝為c++類,從而給非c程式設計師帶來不便。又如同mfc所為,微軟再次將這些c函式打包為c++類的形式,向c++程式設計師提供了以gdiplus.h領頭的30個頭檔案及乙個gdiplus.lib。因此,如果您是c程式設計師,則只需gdiplus.dll就行了;c++程式設計師則還需要找到gdiplus.h等標頭檔案及gdiplus.lib檔案。

該檔案是乙個自解壓的檔案,應將其解壓到應用程式的目錄下,但不要安裝在系統目錄中。

c++程式設計師還應去找gdiplus.h及gdiplus.lib。以下位址所提供的名為gdiplus.zip的檔案就包括了這些檔案:

而以下的位址則提供了一站式的所有資源,即包含了gdiplus.h等標頭檔案, gdiplus.lib及gdiplus.dll:

根據解壓的不同方式,有不同的引用方法。

第一種方法是直接引用,需要將gdiplus.h, gdiplus.lib分別拷貝至vc相應的include及lib目錄下。這兩個目錄可通過vc6的toos->options->directories標籤頁中,在show directories for下拉列表框中分別選擇include files及library files查詢到。如include,一般包括3個路徑:vc98/include, vc98/mfc/include及vc98/atl/include,分別對應非mfc應用,mfc應用及atl應用所用的不同路徑。

然後在stdafx.h中加入如下的語句:

#define ulong_ptr ulong

#include

using namespace gdiplus;

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

gdiplusinit.h中使用了ulong_ptr的資料型別,但此型別在vc6中沒有定義。因此必須在#include語句之前先進行定義。#pragma comment(lib, "gdiplus.lib")指示在連線時在應用所在目錄或系統lib目錄下查詢gdiplus.lib。

第二種方法是將其解壓到任意乙個資料夾,然後在stdafx.h中明確指明具體路徑。

#define ulong_ptr ulong

#include "c:/gdiplus/include/gdiplus.h"

using namespace gdiplus;

#pragma comment(lib, "c:/gdiplus/lib/gdiplus.lib")

除了用以上的方法連線gdiplus.lib之外,還可以在project->settings->link->object/library modules中輸入gdiplus.lib(若有多個庫,可用空格隔開,但gdi+只有乙個庫)。這種方法,可不用在stdafx.h中輸入#pragma comment。

然後在initinstance()中,在呼叫m_pmainwnd->showwindow()及m_pmainwnd->updatewindow()之前呼叫gdiplusstartup():

gdiplusstartup(&gdiplustoken, &gdiplusstartupinput, null);

// the one and only window has been initialized, so show and update it.

m_pmainwnd->showwindow(sw_show);

m_pmainwnd->updatewindow();

return true;

注意,如果gdiplusstartup()放在showwindow()及updatewindow()之後,則當視窗第一次顯示時,由於gdi+還未啟動,gdi+所畫的圖形不會顯示出來,直到第二個wm_paint的訊息傳到。

而在exitinstance()中,如下編寫**:

現在,gdi+已經準備完畢,可以使用了。

在***view類的ondraw()方法中:

graphics graphics(pdc->m_hdc);

pen pen(color(50, 255, 0, 255), 15);

pen.setdashstyle(dashstyledash);

pen.setstartcap(linecaproundanchor);

pen.setendcap(linecaparrowanchor);

graphics.drawline(&pen, 20, 20, 300, 100);

graphics.drawline(&pen, 300, 100, 600, 100);

先使用ondraw()方法的引數pdc的成員變數m_hdc在堆上構造乙個graphics的例項graphics,建立乙個pen並進行設定,然後通過graphics的drawline()方法畫出直線來。

與gdi相比較,gdi+不必將pen, brush等物件選進dc再畫圖,而是通過使用dc的控制代碼來建立乙個graphics例項,之後,直接使用此例項來進行畫圖。這種風格,確實大大方便了程式設計人員。

至此,我們可以在vc6 mfc中使用gdi+描繪美好的未來了。:)

文章出處:

在VC6中使用GDI

包含了標頭檔案和庫 dll和.lib形式的都有 我在編譯過程中出現了編譯錯誤 ulong ptr沒被定義。錯誤在gdiplusinit.h中 typedef status winapi notificationhookproc out ulong ptr token 一行。然後我在gdiplusin...

在VC使用GDI 的配置方法

vc6配置 1.執行gdi 需要gdiplus.dll gdiplus.lib和gdiplus h.這些檔案在 sdk中,vs2003 已經自帶了庫檔案。2.在stdafx.h中包含 include gdiplus.h 3.在 工程 選項 裡,新增乙個鏈結庫 gdiplus.lib 4.在 incl...

在非託管C 中使用GDI

微軟說,gdi 可以在所有基於windows的應用程式中使用,包括64位的windows版本 不包括win3.x 你只需要把gdiplus.dll拷入windows的系統目錄,即可使用需要gdi 支援的應用程式。在非託管的c 中使用,你只需要包含gdiplus.h標頭檔案,然後在連線設定包含gdip...