GDIGDI+從入門到精通-第三講_第1頁
GDIGDI+從入門到精通-第三講_第2頁
GDIGDI+從入門到精通-第三講_第3頁
GDIGDI+從入門到精通-第三講_第4頁
GDIGDI+從入門到精通-第三講_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第三講:GDI+編程的基本概念主講人:闕海忠 UIPower CEOGDI+的介紹GDI+是Windows XP中的一個子系統(tǒng),它主要負(fù)責(zé)在顯示屏幕和打印設(shè)備輸出有關(guān)信息,它是一組通過C+類實(shí)現(xiàn)的應(yīng)用程序編程接口。GDI+對以前的Windows版本中GDI進(jìn)行了優(yōu)化,并添加了許多新的功能。作為圖形設(shè)備接口的GDI+使得應(yīng)用程序開發(fā)人員在輸出屏幕和打印機(jī)信息的時候無需考慮具體顯示設(shè)備的細(xì)節(jié),他們只需調(diào)用GDI+庫輸出的類的一些方法即可完成圖形操作。2GDI+的使用方法在使用GDI+的cpp文件中包含GdiPlus.h文件,并引用命名空間using namespace Gdiplus; 代碼如下:

2、#include using namespace Gdiplus;3GDI+的使用方法需要在項(xiàng)目屬性中作如下設(shè)置,以支持GDI+的靜態(tài)庫編譯:4GDI+的使用方法GDI+進(jìn)行初始化:/GDI+資源初始化ULONG_PTR uToken = 0;GdiplusStartupInput gdiplusStartupInput;GdiplusStartup(&uToKen, &gdiplusStartupInput, NULL);5GDI+的使用方法反初始化代碼:/銷毀GDI+資源GdiplusShutdown(uToKen);6透明度合成運(yùn)算透明度是像素之間的一種合成運(yùn)算。它的計(jì)算公式是:輸出顏色

3、=前景色*Alpha/255+背景色*(255-Alpha)/255舉個例子來說,假設(shè)有一個點(diǎn),其顏色值為RGB(0,0,0),背景色值為RGB(255,255,255),在進(jìn)行輸出時將透明度設(shè)置為100,輸出的顏色為:Result.Red = 0*100/255+255*(255-100)/255 = 155Result.Green = 0*100/255+255*(255-100)/255 = 155Result.Blue = 0*100/255+255*(255-100)/255 = 1557Graphics類的構(gòu)造Graphics(HDC hdc);/以HDC構(gòu)造Graphics,對G

4、raphics的繪制操作,就繪制在hdc指定的位圖中。Graphics(HWND hwnd);/以HWND構(gòu)造Graphics,對Graphics的繪制操作,就繪制在hwnd窗口上。Graphics(Image *image);/Image *是GDI+中的圖像指針,對Graphics的繪制操作,就繪制在image所指的圖像對象中。8Bitmap類的構(gòu)造Bitmap(const WCHAR *filename);/通過圖片的文件名來構(gòu)造一個Bitmap對象。Bitmap(INT width, INT height, PixelFormat format = PixelFormat32bppAR

5、GB);/通過位圖的寬度,位圖的高度,像素格式來構(gòu)造一個空的Bitmap對象,其中format的默認(rèn)值是PixelFormat32bppARGB,代表32位的顏色信息,顏色組成是A、R、G、B。像素格式還有很多種,比如PixelFormat24bppRGB代表24位的顏色信息,顏色組成為R、G、B;比如PixelFormat16bppRGB,代表16位的顏色信息,顏色組成為R、G、B,其中R占5位,G占6位,B占5位。等等。9Bitmap類的常用方法Bitmap* Clone(const Rect& rect, PixelFormat format);Bitmap* Clone(INT x,

6、INT y, INT width, INT height, PixelFormat format); Bitmap* Clone(const RectF &rect, PixelFormat format);Bitmap* Clone(REAL x, REAL y, REAL width, REAL height, PixelFormat format);/以上四個方法為Bitmap的拷貝方法,從源位圖的指定區(qū)域拷貝出新的位圖對象出來,并用format像素格式應(yīng)用在新的Bitmap對象中。10Bitmap類的常用方法UINT GetWidth();/獲取位圖的寬度UINT GetHeight(

7、);/獲取位圖的高度GetPixel(INT x, INT y, Color *color);/獲取位圖指定位置的顏色SetPixel(INT X, INT y, const Color &color);/設(shè)置位圖指定位置的顏色11常用的畫刷單色畫刷,類名SolidBrush,用純色填充圖形。影線畫刷,類名HatchBrush,用各種線型圖案填充圖形。紋理畫刷,類名TextureBrush,使用圖像來填充圖形。線性漸變畫刷,類名LinearGradientBrush,使用漸變的色彩填充圖形,漸變是指一種顏色沿著指定的方向慢慢變?yōu)榱硪环N顏色。12SolidBrush創(chuàng)建單色畫刷SolidBrus

8、h(const Color &color);下列的代碼創(chuàng)建了一個藍(lán)色的單色畫刷。SolidBrush blueBrush(Color(255,0,0,255);13HatchBrush創(chuàng)建影線畫刷HatchBrush(HatchStyle hatchStyle, const Color& foreColor, const Color& backColor);hatchStyle:影線畫刷的類型foreColor:影線畫刷線條的前景色backColor:影線畫刷線條的背景色。14HatchBrush創(chuàng)建影線畫刷創(chuàng)建代碼如下:Color black(255,0,0,0);Color white(2

9、55,255,255,255);HatchBrush brushA(HatchStyleHorizontal, black, white); /水平橫線HatchBrush brushB(HatchStyleVertical, black, white); /垂直堅(jiān)線HatchBrush brushC(HatchStyleCross, black, white); /十字網(wǎng)格線15HatchBrush創(chuàng)建影線畫刷前景色與背景色的關(guān)系,就像國際象棋盤,第一塊為背景色,第二塊為前景色,第三塊為背景色,如圖:16TextureBrush創(chuàng)建紋理畫刷TextureBrush(Image *image)

10、;image為圖像的指針。如:Image image(L“TEXTURE.BMP”);TextureBrush textureBrush(&image);17LinearGradientBrush創(chuàng)建漸變畫刷LinearGradientBrush(Point &point1, Point &point2, Color &color1, Color &color2);point1為漸變的起點(diǎn)坐標(biāo)。point2為漸變的終點(diǎn)坐標(biāo)。color1為起點(diǎn)的顏色。color2為終點(diǎn)的顏色。18Pen創(chuàng)建畫筆Pen(const Color &color, REAL width = 1.0f );/color為

11、畫筆的顏色,width為畫筆的寬度。Pen(const Brush *brush, REAL width = 1.0f );/brush為畫刷的指針,width為畫筆的寬度。通過畫刷來構(gòu)造一個畫筆,這種畫筆繪制出來的線條,邊框就猶如在一張帶圖案的紙張上,剪出的指定寬度的線條,邊框的效果。19Graphics繪制圖片把圖片繪制在指定位置的方法如下:DrawImage(Image* image,const Point& point);DrawImage(Image* image,INT x,INT y);DrawImage(Image* image, const PointF& point)Dra

12、wImage(Image* image, REAL x, REAL y);其中x,y為要繪制的位置,可為INT類型,也可為REAL類型。point為要繪制的位置的結(jié)構(gòu)體變量,可為Point類型(內(nèi)部成員為INT類型),也可為PointF類型(內(nèi)部成員為REAL類型)。20Graphics繪制圖片把圖片繪制在指定區(qū)域的方法如下:DrawImage(Image* image, const Rect& rect);DrawImage(Image* image, INT x, INT y, INT width, INT height);DrawImage(Image* image, const Rec

13、tF& rect);DrawImage(Image* image, REAL x, REAL y, REAL width, REAL height);其中x,y為指定矩形區(qū)域的坐上角坐標(biāo),可為INT類型,也可為REAL類型。width,height為指定矩形區(qū)域的寬度與高度,可為INT類型,也可為REAL類型。rect為指定的矩形區(qū)域,可為Rect類型(內(nèi)部成員為INT類型),也可為RectF類型(內(nèi)部成員為REAL類型)。21Graphics繪制圖片把圖片的指定區(qū)域繪制在指定位置的方法如下:DrawImage(Image* image, INT x, INT y, INT srcx, INT

14、 srcy, INT srcwidth, INT srcheight, Unit srcUnit);DrawImage(Image* image, REAL x, REAL y, REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight, Unit srcUnit);其中x,y為要繪制的指定位置??蔀镮NT類型,也可為REAL類型。srcx,srcy為圖片指定區(qū)域的左上角坐標(biāo)??蔀镮NT類型,也可為REAL類型。srcwidth,srcheight為圖片指定區(qū)域的寬度與高度??蔀镮NT類型,也可為REAL類型。22Graphics繪制圖片srcUn

15、it為Unit的枚舉成員,它指定了所用的度量單位。比如UnitPixel表示以像素為單位;UnitPoint表示以點(diǎn)為單位;UnitInch表示以英寸為單位。一般情況下,我們是選擇UnitPixel,以像素為單位。23Graphics繪制圖片把圖片的指定區(qū)域繪制在指定目標(biāo)區(qū)域的方法如下:DrawImage(Image* image, const Rect& destRect, INT srcx, INT srcy, INT srcwidth, INT srcheight, Unit srcUnit);DrawImage(Image* image, const RectF& destRect,

16、REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight, Unit srcUnit);destRect為指定目標(biāo)區(qū)域??蔀镽ect類型(內(nèi)部成員為INT類型),也可以RectF類型(內(nèi)部成員為REAL類型)。srcx,srcy為圖片指定區(qū)域的左上角的坐標(biāo),可為INT類型,也可為REAL類型。24Graphics繪制圖片srcwidth,srcheight為圖片指定區(qū)域的寬度與高度,可為INT類型,也可為REAL類型。srcUnit為Unit的枚舉成員,它指定了所用的度量單位。25Graphics繪制文字DrawString(const WCHAR

17、 *string, INT length, const Font *font, const PointF &origin, const Brush *brush);DrawString(const WCHAR *string, INT length, const Font *font, const RectF &layoutRect, const StringFormat *stringFormat, const Brush *brush);DrawString(const WCHAR *string, INT length, const Font *font, const PointF &o

18、rigin, const StringFormat *stringFormat, const Brush *brush);其中:string為要繪制的字符串,類型為const WCHAR*,寬字符指針。length為要繪制的字符串的長串,如果該值為-1,表明繪制以NULL結(jié)尾的string字符串。26Graphics繪制文字font為要繪制的文本所使用的字體。比如Font myFont(L宋體, 16);,宋體,字體大小為16號。layoutRect為文本輸出的矩形區(qū)域。origin為文本的繪制起點(diǎn)位置,數(shù)據(jù)類型是PointF。stringFormat為文本輸出的格式,數(shù)據(jù)類型是StringF

19、ormat*。brush為繪制文本所使用的畫刷。27Graphics繪制文字以下為簡單的繪制文本的示例代碼:Gdiplus:Font myFont(LArial, 10);SolidBrush brushA(Color(255,0,0,255);graphics.DrawString(L示例文本, -1, &myFont, PointF(200,575), &brushB);28Graphics繪制文字以下為帶文本輸出格式的字符串繪制代碼:Gdiplus:Font myFont(LArial, 16);RectF layout(0, 0, 500.0f, 200.0f);/設(shè)置對齊方式(水平居

20、中對齊)StringFormat format;format.SetAlignment(StringAlignmentCenter);SolidBrush brushB(Color(255,0,0,255);graphics.DrawString(L示例文本, -1, &myFont, layout, &format, &brushB);29字符串格式設(shè)置StringFormat為字符串格式類,通過它的SetAlignment跟SetLineAlignment可以設(shè)置字符串的對齊方式。SetAlignment為水平方向上的對齊方式。參數(shù)StringAlignmentNear為左對齊,參數(shù)Str

21、ingAlignmentCenter為水平居中對齊,參數(shù)StringAlignmentFar為右對齊。SetLineAlignment為垂直方向上的對齊方式。參數(shù)StringAlignmentNear為頂對齊,參數(shù)StringAlignmentCenter為垂直居中對齊,參數(shù)StringAlignmentFar為底對齊。30MeasureString測量字符串MeasureString(const WCHAR *string, INT length, const Font *font, const PointF &origin, const StringFormat *stringFormat

22、, RectF *boundingBox);MeasureString(const WCHAR *string, INT length, const Font *font, const PointF &origin, RectF *boundingBox);MeasureString(const WCHAR *string, INT length, const Font *font, const RectF &layoutRect, const StringFormat *stringFormat, RectF *boundingBox);MeasureString(const WCHAR *

23、string, INT length, const Font *font, const RectF &layoutRect, RectF *boundingBox);31MeasureString測量字符串MeasureString(const WCHAR *string, INT length, const Font *font, const SizeF &layoutRectSize, const StringFormat *stringFormat,SizeF *size);其中:string為欲測量的字符串。Length為要測量的字符串長度,-1表示測試以NULL結(jié)尾的string字符

24、串。Font為字符串要輸出時采用的字體。layoutRect為文本輸出時指定的矩形區(qū)域。layoutRectSize為文本輸出時指定的尺寸。32MeasureString測量字符串boundingBox為測量結(jié)果,表示容納全部文本時所需要的矩形區(qū)域。size為測量結(jié)果,表示容納全部文本時所需要的尺寸。codepointsFitted為測量結(jié)果,表示指定的區(qū)域中能夠容納的字符個數(shù)。linesFilled為測量結(jié)果,表示指定的區(qū)域中能夠容納的字符行數(shù)。origin為文本輸出的起點(diǎn)。33SetTrimming字符串去尾SetTrimming(StringTrimming trimming);Stri

25、ngTrimming是一個枚舉值,有以下成員:StringTrimmingNone,代表不使用去尾。StringTrimmingCharacter,代表以字符為單位去尾。StringTrimmingWord,代表以單詞為單位去尾。StringTrimmingEllipsisCharacter,代表以字符為單位去尾,被去尾的部分用省略號表示。StringTrimmingEllipsisWord,代表以單詞為單位去尾,被去尾的部分用省略號表示。StringTrimmingEllipsisPath,代表省略了字符串的中間部分,保證字符串的首尾都能夠顯示。這種方式比較不常用。34Graphics繪制直

26、線DrawLine(const Pen* pen, INT x1, INT y1, INT x2, INT y2);DrawLine(const Pen* pen,const Point& pt1, const Point& pt2);DrawLine(const Pen* pen, REAL x1,REAL y1,REAL x2,REAL y2);DrawLine(const Pen* pen,const PointF& pt1,const PointF& pt2);其中:pen為GDI+的畫筆。x1,y1為直線的起點(diǎn)坐標(biāo),可為INT類型,也可為REAL類型。X2,Y2為直線的終點(diǎn)坐標(biāo),可為

27、INT類型,也可為REAL類型。pt1為直線的起點(diǎn)坐標(biāo),可為Point類型,也可為PointF類型。Pt2為直線的起點(diǎn)坐標(biāo),可為Point類型,也可為PointF類型。35Graphics繪制矩形DrawRectangle( const Pen* pen, INT x, INT y, INT width, INT height);DrawRectangle( const Pen* pen, const Rect& rect );DrawRectangle( const Pen* pen, REAL x, REAL y, REAL width, REAL height);DrawRectangl

28、e( const Pen* pen, const RectF& rect );其中:pen為GDI+的畫筆。x,y為矩形的左上角坐標(biāo)位置,可為INT類型,也可為REAL類型。width,height為矩形的寬度與高度,可為INT類型,也可為REAL類型。rect為矩形的區(qū)域,可為Rect類型(內(nèi)部成員是INT類型),也可為RectF類型(內(nèi)部成員是REAL類型)。36Graphics繪制圓DrawEllipse(const Pen* pen, INT x, INT y, INT width, INT height);DrawEllipse(const Pen* pen, const Rect&

29、 rect);DrawEllipse(const Pen* pen, REAL x, REAL y, REAL width, REAL height);DrawEllipse(const Pen* pen, const RectF& rect);其中:pen為GDI+的畫筆。x為圓的外切矩形的左上角x坐標(biāo),可為INT類型,也可為REAL類型。y為圓的外切矩形的左上角y坐標(biāo),可為INT類型,也可為REAL類型。width為圓的外切矩形的寬度,可為INT類型,也可為REAL類型。height為圓的外切矩形的高度,可為INT類型,也可為REAL類型。rect為圓的外切矩形,可為Rect類型,也可為R

30、ectF類型。37Graphics繪制餅DrawPie(const Pen* pen, INT x, INT y, INT width, INT height, REAL startAngle, REAL sweepAngle);DrawPie(const Pen* pen, const Rect& rect, REAL startAngle, REAL sweepAngle);DrawPie(const Pen* pen, REAL x, REAL y, REAL width, REAL height, REAL startAngle, REAL sweepAngle);DrawPie(co

31、nst Pen* pen, const RectF& rect, REAL startAngle, REAL sweepAngle);其中:pen為GDI+的畫筆。x為餅的限定矩形的左上角坐標(biāo)X,可為INT類型,也可為REAL類型。y為餅的限定矩形的左上角坐標(biāo)Y,可為INT類型,也可為REAL類型。38Graphics繪制餅width為餅的限定矩形的寬度,可為INT類型,也可為REAL類型。height為餅的限定矩形的高度,可為INT類型,也可為REAL類型。rect為餅的限定矩形,可為Rect類型,也可為RectF類型。startAngle為餅在圓中的起始角度。sweepAngle為餅角的角

32、度。39Graphics填充矩形FillRectangle( const Brush* brush, INT x, INT y, INT width, INT height);FillRectangle( const Brush* brush, const Rect& rect );FillRectangle( const Brush* brush, REAL x, REAL y, REAL width, REAL height);FillRectangle( const Brush* brush, const RectF& rect );其中:brush為GDI+的畫刷。x,y為矩形的左上角

33、坐標(biāo)位置,可為INT類型,也可為REAL類型。width,height為矩形的寬度與高度,可為INT類型,也可為REAL類型。rect為矩形的區(qū)域,可為Rect類型(內(nèi)部成員是INT類型),也可為RectF類型(內(nèi)部成員是REAL類型)。40Graphics填充圓FillEllipse(const Brush* brush, INT x, INT y, INT width, INT height);FillEllipse(const Brush* brush, const Rect& rect);FillEllipse(const Brush* brush, REAL x, REAL y, R

34、EAL width, REAL height);FillEllipse(const Brush* brush, const RectF& rect);其中:brush為GDI+的畫刷。x為圓的外切矩形的左上角x坐標(biāo),可為INT類型,也可為REAL類型。y為圓的外切矩形的左上角y坐標(biāo),可為INT類型,也可為REAL類型。width為圓的外切矩形的寬度,可為INT類型,也可為REAL類型。height為圓的外切矩形的高度,可為INT類型,也可為REAL類型。rect為圓的外切矩形,可為Rect類型,也可為RectF類型。41Graphics填充餅FillPie(const Brush* brush

35、, INT x, INT y, INT width, INT height, REAL startAngle, REAL sweepAngle);FillPie(const Brush* brush, const Rect& rect, REAL startAngle, REAL sweepAngle);FillPie(const Brush* brush, REAL x, REAL y, REAL width, REAL height, REAL startAngle, REAL sweepAngle);FillPie(const Brush* brush, const RectF& rec

36、t, REAL startAngle, REAL sweepAngle);其中:brush為GDI+的畫刷。x為餅的限定矩形的左上角坐標(biāo)X,可為INT類型,也可為REAL類型。y為餅的限定矩形的左上角坐標(biāo)Y,可為INT類型,也可為REAL類型。42Graphics填充餅width為餅的限定矩形的寬度,可為INT類型,也可為REAL類型。height為餅的限定矩形的高度,可為INT類型,也可為REAL類型。rect為餅的限定矩形,可為Rect類型,也可為RectF類型。startAngle為餅在圓中的起始角度。sweepAngle為餅角的角度。43GDI的設(shè)備描述表DC與GDI+的Graphic

37、s的作用與區(qū)別 DC:現(xiàn)在大家已經(jīng)用GDI編寫過應(yīng)用程序了,對設(shè)備描述表(DC)的概念比較熟悉,設(shè)備描述表是Windows使用的一個數(shù)據(jù)結(jié)構(gòu),用于存儲具體設(shè)備能力和與如何在設(shè)備上重繪一些項(xiàng)目有關(guān)的屬性信息。首先你必須獲得一個設(shè)備描述表句柄,然后在圖形繪制時,你把這個句柄作為一個參數(shù)傳遞給GDI圖形繪制函數(shù)。當(dāng)然你也可以把它傳遞給獲得或設(shè)置設(shè)備描述表有關(guān)屬性的函數(shù)。44GDI的設(shè)備描述表DC與GDI+的Graphics的作用與區(qū)別利用GDI+函數(shù),你不必使用句柄或者設(shè)備描述表。相反,你可以簡單地創(chuàng)建一個圖形對象(Graphics),然后以你熟悉的面向?qū)ο蟮木幊谭绞秸{(diào)用它的方法即可,譬如myGra

38、phicsObject.DrawLine(parameters)。Graphics對象是GDI+的核心,正如設(shè)備描述表是GDI的核心一樣,設(shè)備描述表(DC)和圖形對象(Graphics)在不同的環(huán)境下扮演著同樣的角色,發(fā)揮著類似的作用,但是兩者也存在著本質(zhì)的不同。前者使用基于句柄的編程方法而后者使用面向?qū)ο蟮木幊谭椒ā?5繪圖對象的使用方式的差別圖形對象和設(shè)備對象一樣,與屏幕的顯示窗口有關(guān),它包含著與項(xiàng)目重繪有關(guān)的屬性信息(譬如平滑度),然而圖形對象并沒有像GDI那樣與Pen(畫筆)、Path(路徑)、Image(圖像)、Font(字體)等攪在一起。46繪圖對象的使用方式的差別在GDI中,所有與繪圖有關(guān)的繪圖對象必須選入指定設(shè)備描述表中(使用SelectObject函數(shù)),才能被指定的設(shè)備描述表所使用。而在GDI+中,你只需把這些繪圖對象作為一個參數(shù)傳遞給圖形對象Graphics方法調(diào)用即可,每一個圖形對象所使用的繪圖工具至于它調(diào)用方法使用的參數(shù)有關(guān),它可以通過參數(shù)使用多種Pen和Brush繪圖,而不是與特定的筆和畫刷聯(lián)系在一起。47GDI+新增的功能漸變的畫刷GDI+允許用戶創(chuàng)建一個沿路徑或直線漸變的畫刷,來填充外形(shapes),路

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論