如何在VC中使用GDI+。

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文件。

Windows XP或Windows Server 2003應使用系統自帶的GdiPlus.dll,以免與系統服務衝突。而對於版本低於Windows XP的Windows,如Windows NT 4.0 SP6, Windows 2000, Windows98及Windows Me,則需要此文件。可到微軟的官方地址去下載分發包gdiplus_dnld.exe文件,地址爲:
http://www.microsoft.com/downloads/details.aspx?FamilyID=6a63ab9c-df12-4d41-933c-be590feaa05a&DisplayLang=en

該文件是一個自解壓的文件,應將其解壓到應用程序的目錄下,但不要安裝在系統目錄中。

C++程序員還應去找GdiPlus.h及GdiPlus.lib。以下地址所提供的名爲gdiplus.zip的文件就包括了這些文件:
http://www.crazy-bit.com/download/gdiplus.zip

而以下的地址則提供了一站式的所有資源,即包含了GdiPlus.h等頭文件, GdiPlus.lib及GdiPlus.dll:
http://www.codersource.net/samples/mfcgdiplus.zip

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

第一種方法是直接引用,需要將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 <gdiplus.h>
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。

在使用GDI+之前,您必須通過GdiplusStartup()啓動GDI+,而在使用完畢後,調用GdiplusShutdown()來清理現場。 根據MFC的特點,應相應地放在XXXApp類的InitInstance()及ExitInstance()中。

先爲XXXApp類添加兩私有成員變量:
private:
 GdiplusStartupInput gdiplusStartupInput;
 ULONG_PTR gdiplusToken;

然後在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()中,如下編寫代碼:

 GdiplusShutdown(gdiplusToken);
 return CWinApp::ExitInstance();

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

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

文章出處:http://www.diybl.com/course/3_program/c++/cppjs/2008219/100318.html

發佈了22 篇原創文章 · 獲贊 25 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章