• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            流量統(tǒng)計:
            Rixu Blog (日需博客)
            日需博客,每日必需來踩踩哦..
            posts - 108,comments - 54,trackbacks - 0

            五年前,筆者曾在C#中使用GDI+開發(fā)程序,對其頗有好感。這一段時間,在使用VC6作圖時,深切感會到使用GDI的種種不便,不比GDI+好用。沉迷于VC6的高效與輕便,不想只為了一個GDI+而被迫安裝沉甸甸的.Net,便產(chǎn)生了一個疑問,難道GDI+只能用于.Net中嗎?

            訪問微軟的MSDN網(wǎng)站后,隨即解開了此謎。于是便有了此文 – 如何在VC6 MFC中使用GDI+。

            GDI+可應用于二維向量圖象,柵格圖象及排版,是為C/C++程序員而設計的表現(xiàn)為C++類而存在的接口,能用于一切基于Windows的應用中。作為GDI的后繼者,GDI+在GDI中增加了新功能,如文本的反鋸齒,漸變筆刷,Alpha溶合;也優(yōu)化了GDI許多已有的功能。此外,GDI+改變了編程模式,使其更靈活及易用。

            GDI+并不限于在.Net中存在,實際上它由Windows XP或Windows Server 2003操作系統(tǒng)提供。它被打包在一個名為GdiPlus.dll的文件中。此文件位于C:/Windows/WinSxS下的相應文件夾下。以筆者的XP系統(tǒng)為例,共有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

            在應用程序中,我們不需指定版本號,系統(tǒng)自動選擇最新的版本。先假設我們已經(jīng)在VC6中編好一個GDI+應用,在degbug版本中單擊菜單Build->Start Debug->Go啟動調(diào)試,再終止應用,在VC6的Output區(qū)域中可以看到以下信息:
            Loaded 'C:/WINDOWS/WinSxS/x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.2600.2180_x-ww_522f9f82/GdiPlus.dll'
            說明系統(tǒng)自動選擇了最新的版本。

            如同Windows是用C語言編寫,GdiPlus.dll是以C函數(shù)實現(xiàn)的,并沒有封裝為C++類,從而給非C程序員帶來不便。又如同MFC所為,微軟再次將這些C函數(shù)打包為C++類的形式,向C++程序員提供了以GdiPlus.h領頭的30個頭文件及一個GdiPlus.lib。因此,如果您是C程序員,則只需GdiPlus.dll就行了;C++程序員則還需要找到GdiPlus.h等頭文件及GdiPlus.lib文件。

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

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

            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

            根據(jù)解壓的不同方式,有不同的引用方法。

            第一種方法是直接引用,需要將gdiplus.h, gdiplus.lib分別拷貝至VC相應的include及l(fā)ib目錄下。這兩個目錄可通過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的數(shù)據(jù)類型,但此類型在VC6中沒有定義。因此必須在#include語句之前先進行定義。#pragma comment(lib, "gdiplus.lib")指示在連接時在應用所在目錄或系統(tǒng)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+,而在使用完畢后,調(diào)用GdiplusShutdown()來清理現(xiàn)場。 根據(jù)MFC的特點,應相應地放在XXXApp類的InitInstance()及ExitInstance()中。

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

            然后在InitInstance()中,在調(diào)用m_pMainWnd->ShowWindow()及m_pMainWnd->UpdateWindow()之前調(diào)用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();

            現(xiàn)在,GDI+已經(jīng)準備完畢,可以使用了。

            在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()方法的參數(shù)pDC的成員變量m_hDC在堆上構(gòu)造一個Graphics的實例graphics,創(chuàng)建一個Pen并進行設置,然后通過graphics的DrawLine()方法畫出直線來。

            與GDI相比較,GDI+不必將Pen, Brush等對象選進DC再畫圖,而是通過使用DC的句柄來創(chuàng)建一個Graphics實例,之后,直接使用此實例來進行畫圖。這種風格,確實大大方便了編程人員。

            至此,我們可以在VC6 MFC中使用GDI+描繪美好的未來了。:) 

            Logo
            作者:Gezidan
            出處:http://www.rixu.net    
            本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權(quán)利。
            posted on 2011-08-23 09:10 日需博客 閱讀(2865) 評論(6)  編輯 收藏 引用 所屬分類: C C++Windows技術文章轉(zhuǎn)載

            FeedBack:
            # re: GDI+ for VC6 MFC
            2011-08-23 14:58 | 布拉德比特
            好東西,樓主牛逼  回復  更多評論
              
            # re: GDI+ for VC6 MFC
            2011-08-23 15:52 | K.V
            我覺得還是放棄VC6的好  回復  更多評論
              
            # re: GDI+ for VC6 MFC
            2011-08-23 16:05 | 他她女鞋
            還挺復雜的。  回復  更多評論
              
            # re: GDI+ for VC6 MFC
            2011-08-23 21:47 | Gezidan Studio
            為啥呢@K.V
              回復  更多評論
              
            # re: GDI+ for VC6 MFC
            2011-08-24 11:30 | 空明流轉(zhuǎn)
            @Gezidan Studio
            編譯器爛,運行時也爛。  回復  更多評論
              
            # re: GDI+ for VC6 MFC
            2011-08-26 13:31 | xhk
            貌似MFC中的CImage對象就是用了GDI plus吧  回復  更多評論
              
            久久久久久亚洲Av无码精品专口| 久久国产精品免费一区| 久久精品国产亚洲AV蜜臀色欲| 18岁日韩内射颜射午夜久久成人| 久久精品无码专区免费青青| 爱做久久久久久| 日韩人妻无码精品久久久不卡| 国产精品久久久久影院嫩草| 午夜精品久久久久久久无码| 国产精品久久久久久久久鸭| 亚洲国产日韩欧美久久| 国产精品一久久香蕉国产线看| 欧美久久一级内射wwwwww.| 久久久久久久久久久久中文字幕| 国内精品久久久久久久coent| 老色鬼久久亚洲AV综合| 午夜福利91久久福利| 99热精品久久只有精品| 少妇内射兰兰久久| 热RE99久久精品国产66热| 国产欧美久久一区二区| 色婷婷综合久久久中文字幕| 蜜桃麻豆www久久国产精品| 久久不射电影网| 国产99精品久久| 久久久久成人精品无码中文字幕 | 欧美亚洲国产精品久久蜜芽| 亚洲精品美女久久777777| 久久99热这里只频精品6| 久久久青草青青国产亚洲免观| 久久96国产精品久久久| 久久w5ww成w人免费| 国产高潮国产高潮久久久| 亚洲国产精品无码久久一区二区| 一本久道久久综合狠狠躁AV| 欧美与黑人午夜性猛交久久久| 久久精品无码免费不卡| 亚洲第一永久AV网站久久精品男人的天堂AV| 国产精品一区二区久久精品无码 | 91久久国产视频| 777久久精品一区二区三区无码|