如何在VC6 MFC中使用GDI

2021-06-16 05:21:41 字數 3667 閱讀 7088

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+描繪美好的未來了。:)

rtcap(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...

如何在VC6中使用SGI STL

首先到 sgistl 216k 的zip 包,真是個了不起的傑作 網上都是溢美之詞。將 stl.zip 解壓到乙個目錄,比如 c sgistl 然後在 vc6的 ide環境下,tools options directories include files 將c sgistl 你解壓的目錄 新增進去,...

在VC中使用GDI

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