河北網(wǎng)絡(luò)_GDI+圖形編程_第1頁
河北網(wǎng)絡(luò)_GDI+圖形編程_第2頁
河北網(wǎng)絡(luò)_GDI+圖形編程_第3頁
河北網(wǎng)絡(luò)_GDI+圖形編程_第4頁
河北網(wǎng)絡(luò)_GDI+圖形編程_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、GDI+圖形編程GDI+圖形編程圖形編程n1 GDI+編程基礎(chǔ)n2 畫刷和畫筆n3 文本與字體n4 路徑和區(qū)域1 GDI+編程基礎(chǔ)編程基礎(chǔ)nGDI+體系結(jié)構(gòu)nGDI+新特色nGDI與GDI+nGDI+程序的開發(fā)n一個(gè)簡單的GDI+程序GDI+體系結(jié)構(gòu)體系結(jié)構(gòu)二維幾何圖形的處理:矢量圖元顯示圖像:位圖、JPGE等圖形的顯示排版:字體、風(fēng)格、顏色、文本的反鋸齒GDI+新特色新特色n漸變畫刷q線性漸變畫刷:可以是雙色漸變,也可以是多色漸變。默認(rèn)情況下,雙色漸變由起始顏色沿著水平方向平均過渡到終止顏色,其漸變過程是可以控制的。q路徑漸變畫刷:用于定義路徑內(nèi)部的漸變色畫刷。漸變色從路徑內(nèi)部的中心點(diǎn)逐漸過

2、渡到路徑的邊框。GDI+中使用GraphicsPath(圖形路徑)來定義路徑,應(yīng)用程序使用路徑來繪制形體的輪廓、填充形體內(nèi)部及創(chuàng)建剪切區(qū)域。n獨(dú)立的路徑對象(Path Objects)q路徑是可以被填充、被畫出輪廓或同時(shí)畫出輪廓并填充的一個(gè)或多個(gè)圖形。q在GDI中,路徑是設(shè)備環(huán)境的一個(gè)對象,在BeginPath函數(shù)和EndPath函數(shù)之間進(jìn)行繪圖時(shí),繪圖的住處自動存入路徑信息,下次使用BeginPath后便被新的路徑信息覆蓋,即GDI中的路徑信息是唯一的且不斷改變的;在GDI+中,繪圖是由圖形對象來完成,可以創(chuàng)建多個(gè)圖形對象進(jìn)行繪圖,多個(gè)圖形對象產(chǎn)生的路徑信息是相對獨(dú)立的,而且不會被新的繪圖操

3、作所覆蓋。n矩陣對象(Matrix Object)qGDI+提供了矩陣對象來使圖形在變形(旋轉(zhuǎn)及平移)時(shí)做到簡單且效果平滑。q通過矩陣運(yùn)算,可以完成包含投射變換在內(nèi)的所有偽射變換:例如坐標(biāo)變換、色彩變換。nAlpha通道合成運(yùn)算(Alpha Blending)n多格式圖片支持:BMP、GIF、JPEG、EXIF、PNG、TIFF、ICON、WMF、EMFGDI與與GDI+nGDI是一個(gè)狀態(tài)模型編程(將畫刷等對象選入設(shè)備環(huán)境之后才能進(jìn)行繪圖輸出的編程方式);而GDI+中使用的是非狀態(tài)模型編程。nGDI是過程化的編程模式,需要關(guān)心設(shè)備環(huán)境(DC),所有的輸出都是由設(shè)備環(huán)境來完成的。GDI+是對GD

4、I的高級封裝,只需要關(guān)心Graphics對象,而無需關(guān)心設(shè)備環(huán)境和句柄。MFC的CDC只是對GDI的一個(gè)簡單封裝,并不是一個(gè)完全的面向?qū)ο蟮乃枷?。n關(guān)于坐標(biāo),GDI+沒有坐標(biāo)映射的概念。GDI+程序的開發(fā)程序的開發(fā)nGDI+相關(guān)的SDKqWindows 2000及之前的版本,要用Gdi+需要下載GDI+的動態(tài)鏈接庫:GdiPlus.dll。Widnows XP及之后的則勿需。q開發(fā)GDI+應(yīng)用程序,Visual Studio 6.0及其之前的版本均需要下載SDK包,可在http:/ SDK。Platform SDK的頭文件和庫文件中有70多個(gè)類、50個(gè)枚舉、6個(gè)結(jié)構(gòu)體。一個(gè)簡單的一個(gè)簡單的GD

5、I+程序程序n創(chuàng)建一個(gè)簡單的Windows窗口應(yīng)用,也可以是MFC應(yīng)用程序。我們采用了MFC單文檔視圖應(yīng)用程序,工程名稱為:GdiplusExam01 。n引入Gdi+庫。在stdafx.h文件中加入三行代碼:#include #pragma comment(lib, “GdiPlus.lib”)using namespace Gdiplus;使用名字空間。也可以只在需要使用GDI+的代碼文件中引入名字空間,如在本例中則為在GdiplusExam01View.cpp;可以考慮不用名字空間,而在聲明GDI+對象前加入名字空間。n添加GDI+記號。在CGdiplusExam01App類中加入一個(gè)私

6、有成元變量,變量類型為ULONG_PTR,變量名m_ulGdiToken。此變量用于在初始化GDI+庫時(shí)記錄GDI+初始化后的標(biāo)志,并用于卸載GDI+庫。n初始化GDI+庫。在使用GDI+對象前,必須先初始化GDI+庫。在CGdiplusExam01App類中的InitInstance函數(shù)CWinApp:InitInstance()后加入以下代碼:/ 初始化GDI+庫GdiplusStartupInput iGsi;if (GdiplusStartup(&m_ulGdiToken, &iGsi, NULL) != Ok)AfxMessageBox(_T(初始化GDI+庫失敗);

7、return FALSE;n卸載GDI+庫。在CGdiplusExam01App類中添加方法ExitInstance,并加入以下代碼:/ 卸載GDI+庫if (m_ulGdiToken != NULL)GdiplusShutdown(m_ulGdiToken);m_ulGdiToken = NULL;n畫圖。在CGdiplusExam01View:OnDraw加入:/ 構(gòu)造Graphics對象Graphics g(pDC-GetSafeHdc();/ 設(shè)定文本輸出使用的畫刷、字體SolidBrush brush(Color(255, 0, 0, 255);Font font(L“楷體_GB23

8、12”, 24, FontStyleRegular, UnitPixel); / 設(shè)定文本輸出坐標(biāo)CRect rtClient;GetClientRect(&rtClient);PointF pt(rtClient.right/2, rtClient.bottom/2);/ 輸出文體g.DrawString(LHello World!, -1, &font, pt, &brush); n練習(xí):q考慮用傳統(tǒng)的GDI方式實(shí)現(xiàn)上述代碼。q要求在上述例子,將打印的字體格式設(shè)為視圖居中。提示:Graphics:MeasureString。q采用漸變畫刷,漸變顏色從左到右,字的最左

9、邊顏色為Color(128, 255, 0, 255),最右邊為Color(255, 0, 0, 255)。提示:漸變畫刷類為LinearGradientBrush。2 畫刷和畫筆畫刷和畫筆n畫刷(Brush)q單色畫刷(SolidBrush)q影線畫刷(HatchBrush)q紋理畫刷(TextureBrush)q線性漸變畫刷(LinearGradientBrush)q路徑漸變畫刷(PathGradientBrush)n畫筆(Pen)q畫筆的線型q畫筆的對齊方式q畫筆的縮放與旋轉(zhuǎn)q畫筆的線帽屬性q直線的連接點(diǎn)屬性畫刷(畫刷(Brush)BrushGdiplusBase(from GDIPlu

10、s)SolidBrushHatchBrushTextureBrushLinearGradientBrushPathGradientBrushnGDI+提供了五種畫刷畫刷類型畫刷類型定義類定義類畫刷的基本描述畫刷的基本描述單色畫刷SolidBrush用純色填充圖形影線畫刷HatchBrush用各種線型填充圖形紋理畫刷TextureBrush使用基于光柵的圖像填充圖形線性漸變畫刷LinearGradientBrush使用漸變的色彩填充圖形,漸變是指一種色彩沿著指定的方向在兩個(gè)邊界線這間變?yōu)榱硪环N色彩路徑漸變畫刷PathGradientBrush畫刷沿著預(yù)定義的路徑進(jìn)行色彩漸變的填充,色彩漸變的方向

11、是從路徑的邊界到中心n畫刷的使用qGraphics:FillClosedCurve:填充閉合曲線qGraphics:FillEllipse:填充橢圓qGraphics:FillPath:填充路徑qGraphics:FillPie:填充扇形qGraphics:FillPolygon:填充多邊形qGraphics:FillRectangle:填充矩形qGraphics:FillRectangles:填充矩形集qGraphics:FillRegion:填充區(qū)域qGraphics:DrawString:畫字符串單色畫刷(單色畫刷(SolidBrush)n創(chuàng)建SolidBrush(const Color

12、 &color); n示例q創(chuàng)建一個(gè)單文檔視圖的MFC應(yīng)用程序,工程名稱:GdiplusExam02,視圖名稱定義為CSolidView。導(dǎo)入GDI+庫、并完成相應(yīng)的初始化及卸載代碼。q在CSolidView:OnDraw中加入以下代碼:/ 畫一個(gè)半圓Graphics g(pDC-GetSafeHdc();SolidBrush sbr(Color(255, 255, 255, 0);g.FillPie(&sbr, 0, 0, 100, 100, 90, -90);/ 重設(shè)畫刷顏色,再畫半圓Color clr;sbr.GetColor(&clr);clr.SetValue

13、(Color:MakeARGB(clr.GetAlpha()/2, clr.GetRed()/2, clr.GetGreen()/2, clr.GetBlue()/2);sbr.SetColor(clr);g.FillPie(&sbr, 0, 0, 100, 100, 0, -180);影線畫刷(影線畫刷(HatchBrush)n創(chuàng)建HatchBrush(HatchStyle hatchStyle, const Color &foreColor, const Color &backColor ); n繪制原點(diǎn)Status SetRenderingOrigin(INT x

14、, INT y); n示例:q原上述例子上,添加一個(gè)視圖,CHatchView,并在CHatchView:OnDraw中完成:/ 創(chuàng)建一個(gè)影線畫刷,并畫一個(gè)矩形HatchBrush hbr1(HatchStyleLargeCheckerBoard, Color(128, 128, 128, 128), Color(0, 0, 0, 0);g.FillRectangle(&hbr1, 0, 0, 200, 200);/ 設(shè)置繪制原點(diǎn),并畫一個(gè)矩形g.SetRenderingOrigin(2, 2);HatchBrush hbr2(HatchStyleLargeCheckerBoard,

15、Color(255, 0, 192, 0), Color(0, 0, 0, 0);g.FillRectangle(&hbr2, 200, 0, 200, 200);n練習(xí)q在上述例子中,比較加入繪制原點(diǎn)與沒有加入的區(qū)別。q另外創(chuàng)建一個(gè)工程,繪制出所有類型的影線畫刷圖形。每個(gè)類型都用一個(gè)100*100的矩形畫圖,每行10個(gè)類型。q學(xué)生成績統(tǒng)計(jì)。學(xué)生成績有平時(shí)成績、期中成績、期末成績、學(xué)期成績(平時(shí)成績0.3期中成績0.3期末成績0.4),要求用影線畫刷畫出統(tǒng)計(jì)柱形統(tǒng)計(jì)圖。紋理畫刷(紋理畫刷(TextureBrush)n創(chuàng)建TextureBrush:TextureBrush(Image*,

16、 WrapMode);TextureBrush:TextureBrush(Image*, WrapMode, Rect&); TextureBrush:TextureBrush(Image*, wrapMode, RectF&);TextureBrush:TextureBrush(Image*,WrapMode, INT, INT, INT, INT);TextureBrush:TextureBrush(Image*,WrapMode, REAL, REAL, REAL, REAL);TextureBrush:TextureBrush(Image*, RectF&,Im

17、ageAttributes*); TextureBrush:TextureBrush(Image*,Rect&, ImageAttributes*);紋理畫刷使用的基本圖案指定在畫刷中如何排列基本圖案指定圖案中用于畫刷中的矩形區(qū)域。它的大小不能超過基本圖案的范圍,否則畫刷不能夠完成正常的填充效果指定基本圖案的附加特征參數(shù)n畫刷排列方式qWrapModeTile:簡單的平鋪基本圖像方式。qWrapModeTileFlipX:水平方向翻轉(zhuǎn)并平鋪基本圖像方式。qWrapModeTileFlipY:垂直方向翻轉(zhuǎn)并平鋪基本圖像方式。qWrapModeTileFlipXY:水平和垂直方向同時(shí)翻轉(zhuǎn)基

18、本圖片,qWrapModeClamp:對圖像不進(jìn)行平鋪,并只能在客戶區(qū)域的最左上角顯示。n紋理畫刷的變換q旋轉(zhuǎn)變換:RotateTransformStatus RotateTransform(REAL angle, MatrixOrder order = MatrixOrderPrepend);q縮放變換:ScaleTransformStatus ScaleTransform(REAL sx, REAL sy, MatrixOrder order = MatrixOrderPrepend);q矩陣變換:SetTransformStatus SetTransform(const Matrix *

19、matrix );n示例/ 創(chuàng)建一個(gè)紋理畫刷,并畫一個(gè)矩形Image img(LTexture.jpg);TextureBrush tbr(&img, WrapModeTile);g.FillEllipse(&tbr, 0, 0, 100, 100);/ 更改紋理畫刷類型,并畫一個(gè)矩形tbr.SetWrapMode(WrapModeTileFlipXY);g.FillEllipse(&tbr, 100, 0, 100, 100);/ 平移轉(zhuǎn)換TextureBrush tbrTrans(&img, WrapModeTile);Matrix matrix(2.0f,

20、 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);tbrTrans.SetTransform(&matrix);g.FillRectangle(&tbrTrans, 200, 0, 200, 200);/ 旋轉(zhuǎn)轉(zhuǎn)換TextureBrush tbrRotate(&img, WrapModeTile);tbrRotate.RotateTransform(30);g.FillRectangle(&tbrRotate, 400, 0, 200, 200);/ 旋轉(zhuǎn)轉(zhuǎn)換TextureBrush tbrScale(&img, WrapModeTile);

21、tbrScale.ScaleTransform(0.5f, 0.5f);g.FillRectangle(&tbrScale, 600, 0, 200, 200);線性漸變畫刷(線性漸變畫刷(LinearGradientBrush)n創(chuàng)建LinearGradientBrush(cons PointF& point1, const PointF& point2, const Color& color1, const Color& color2);LinearGradientBrush(const RectF& rect, const Color&am

22、p; color1, const Color& color2,REAL angle, BOOL isAngleScalable);LinearGradientBrush(const RectF& rect, const Color& color1, const Color& color2, LinearGradientMode mode);LinearGradientBrush(cons Point& point1, const Point& point2, const Color& color1, const Color& co

23、lor2);LinearGradientBrush(const Rect& rect, const Color& color1, const Color& color2,REAL angle, BOOL isAngleScalable);LinearGradientBrush(const Rect& rect, const Color& color1, const Color& color2, LinearGradientMode mode);起點(diǎn)和終點(diǎn)的坐標(biāo)起點(diǎn)和終點(diǎn)的顏色漸變的旋轉(zhuǎn)角度是否需要旋轉(zhuǎn),為真是,angle參數(shù)方有效漸變的填充方向n

24、線性漸變畫刷的填充方式:SetWrapModen線性漸變畫刷的漸變模式:在創(chuàng)建線性漸變畫刷時(shí)有指定LinearGradientMode:qLinearGradientModeHorizontal:水平漸變,左邊為起點(diǎn)色,右邊為終點(diǎn)色。qLinearGradientModeVertical:垂直漸變,上邊為起點(diǎn)色,下邊為終點(diǎn)色。qLinearGradientModeForwardDiagonal:從左上角到右下角,左上角為起點(diǎn)色,右下角為終點(diǎn)色。qLinearGradientModeBackwardDiagonal:從右上角到左下角,右上角為起點(diǎn)色,左下角為終點(diǎn)色。n線性漸變畫刷的漸變線q漸變線

25、是一條虛構(gòu)的線,實(shí)際上就是漸變的旋轉(zhuǎn)角度線。q在創(chuàng)建線性漸變畫刷時(shí),可以輸入旋轉(zhuǎn)角度來改變漸變線。n多色線性漸變畫刷Status SetInterpolationColors(const Color* presetColors, const REAL* blendPositions,INT count); 包含多個(gè)預(yù)定義過渡色的數(shù)組,第一個(gè)為起始色,最后一個(gè)為終止色包含色彩合成位置的數(shù)組,合成位置為百分比。首尾必須為0%和100%參與漸變的色彩總數(shù),實(shí)際上為數(shù)組presetColors和數(shù)組blendPositions的大小n定制線性漸變畫刷的色彩漸變行為Status SetBlend( co

26、nst REAL* blendFactors,const REAL* blendPositions,INT count ); n線性漸變畫刷的變換q旋轉(zhuǎn)變換:RotateTransformStatus RotateTransform(REAL angle, MatrixOrder order = MatrixOrderPrepend);q縮放變換:ScaleTransformStatus ScaleTransform(REAL sx, REAL sy, MatrixOrder order = MatrixOrderPrepend);q矩陣變換:SetTransformStatus SetTra

27、nsform(const Matrix *matrix );包含了合成因子的數(shù)組,每個(gè)數(shù)的大小為01包含合成位置的數(shù)組,合成位置為百分比。首尾必須為0%和100%合成點(diǎn)位置數(shù),實(shí)際上為數(shù)組blendColors和數(shù)組blendPositions的大小定制線性漸變畫刷的色彩漸變與多色漸變結(jié)合時(shí),需要預(yù)先處理定制線性漸變畫刷的色彩漸變再設(shè)置多色漸變過程n示例:/ 創(chuàng)建線性漸變畫刷,并畫一個(gè)圓形LinearGradientBrush lbr(Point(0, 0), Point(100, 100), Color(255, 255, 0, 0), Color(255, 255, 255, 0);g.F

28、illEllipse(&lbr, Rect(0, 0, 100, 100);/ 創(chuàng)建一個(gè)平鋪排列方式(默認(rèn))線性漸變畫刷,并畫一個(gè)矩形LinearGradientBrush lbrTile(Rect(120, 200, 20, 20), Color(255, 255, 0, 0), Color(255, 255, 255, 0),LinearGradientModeBackwardDiagonal);g.FillRectangle(&lbrTile, Rect(120, 0, 100, 100);/創(chuàng)建一個(gè)水平翻轉(zhuǎn)排列方式線性漸變畫刷,并畫一個(gè)矩形LinearGradientB

29、rush lbrFlipX(Rect(240, 200, 20, 20), Color(255, 255, 0, 0), Color(255, 255, 255, 0),LinearGradientModeBackwardDiagonal);lbrFlipX.SetWrapMode(WrapModeTileFlipX);g.FillRectangle(&lbrFlipX, Rect(240, 0, 100, 100);/ 創(chuàng)建一個(gè)線性漸變畫刷,并指定多色漸變過程,畫一個(gè)矩形Color aClr = Color(255, 255, 0, 0), Color(128, 255, 0, 0)

30、, Color(128, 255, 255, 0), Color(255, 255, 255, 0), Color(128, 0, 255, 0), Color(255, 0, 255, 0);REAL aPosition = 0.0f, 0.1f, 0.3f, 0.6f, 0.9f, 1.0f;LinearGradientBrush lbrInter(Rect(0, 120, 200, 100), Color(255, 255, 0, 0), Color(255, 255, 255, 0), 0, FALSE);lbrInter.SetInterpolationColors(&aCl

31、r0, &aPosition0, static_cast(sizeof(aClr)/sizeof(aClr0);g.FillRectangle(&lbrInter, 0, 120, 200, 100);/ 創(chuàng)建一個(gè)線性漸變畫刷,并自定義畫刷的色彩漸變過程,畫一個(gè)矩形REAL aFactor = 0.0f, 0.4f, 0.5f, 0.6f, 0.7f, 1.0f;LinearGradientBrush lbrBlend(Rect(220, 120, 200, 100), Color(255, 255, 0, 0), Color(255, 255, 255, 0), 0, FAL

32、SE);lbrBlend.SetBlend(aFactor, aPosition, static_cast(sizeof(aFactor)/sizeof(aFactor0);g.FillRectangle(&lbrBlend, 220, 120, 200, 100);n練習(xí)q完成線性漸變畫刷的四種填充方式,并觀察之間的差別。q自定義畫刷的色彩漸變過程,共為10個(gè)點(diǎn),依次為0.0、0.1、0.2、0.3、0.4、0.5、0.6、0.7、0.8、0.9、1.0。要求自定義過程結(jié)果與默認(rèn)一致。q在上題的基礎(chǔ)上,更改自定義結(jié)果,并結(jié)合色彩自定義過程,觀察變化。q用線性漸變畫刷完成一個(gè)光譜圖(可

33、見光波長由長到短分為紅、橙、黃、綠、青、蘭、紫光)。路徑漸變畫刷路徑漸變畫刷(PathGradientBrush)n路徑q路徑:表明了一定的區(qū)間,應(yīng)用程序使用路徑來繪制形體的輪廓、填充形體內(nèi)部以及創(chuàng)建剪切區(qū)域。路徑可以由一個(gè)或多個(gè)圖形組成,而第一個(gè)圖形以可以由一系列直線或曲線組成,還可以是基本的幾何體(例如矩形、圓形、扇形)。q在GDI+中用GraphicsPath表示。q創(chuàng)建路徑GraphicsPath(FillMode fillMode);GraphicsPath(const Point *points, const BYTE *types, INT count, FillMode fil

34、lMode);GraphicsPath(const PointF *points, const BYTE *types, INT count, FillMode fillMode);填充模式定義子路徑的坐標(biāo)點(diǎn)Points數(shù)組成員的類型描述。這些點(diǎn)的類型有PathPointType枚舉列出的點(diǎn)、直線的端點(diǎn)、曲線的端點(diǎn)或控制點(diǎn)3種。Points數(shù)組的大小,同樣為types數(shù)組的大小n創(chuàng)建路徑漸變畫刷PathGradientBrush(const GraphicsPath *path); PathGradientBrush(const Point *points, INT count, WrapMo

35、de wrapMode);PathGradientBrush(const PointF *points, INT count, WrapMode wrapMode);n路徑漸變畫刷排列方式:SetWrapModen路徑漸變畫刷的中心點(diǎn):SetCenterPoint。q默認(rèn)情況下,路徑的中心點(diǎn)是定義路徑的各個(gè)點(diǎn)坐標(biāo)的平均值。q路徑漸變畫刷色彩漸變過程是由中心點(diǎn)到邊緣的一個(gè)過渡。由GraphicsPath類定義的路徑對象用數(shù)組形式表示的組成路徑的各個(gè)端點(diǎn)的坐標(biāo)構(gòu)造路徑的端點(diǎn)總數(shù),即為數(shù)組points的大小漸變畫刷在目標(biāo)區(qū)域中的排列方式n路徑漸變畫刷端點(diǎn)顏色qStatus SetSurroundCo

36、lors(const Color *colors, / 端點(diǎn)顏色數(shù)組INT *count / 端點(diǎn)數(shù));n路徑漸變畫刷的多色漸變q默認(rèn)情況下,路徑漸變畫刷的色彩只有兩種:中心點(diǎn)色彩與邊緣色彩。qSetInterpolationColorsn路徑漸變畫刷的焦點(diǎn)縮放比例qGDI+中的路徑是由若干個(gè)點(diǎn)定義而形成的一個(gè)封閉區(qū)域。如果在封閉區(qū)域的內(nèi)部再選一個(gè)與整個(gè)路徑的形狀一致,但面積小一些的區(qū)域,這個(gè)區(qū)域就稱為原始區(qū)域的焦點(diǎn)縮放。q更改焦點(diǎn)比例的目的在于讓路徑中心點(diǎn)的色彩按照不同的縮放比例在中心區(qū)域內(nèi)部的每一處都顯示,而不是僅僅在中心點(diǎn)顯示,指定端點(diǎn)顏色時(shí)無效。qStatus SetFocusScal

37、es(REAL xScale, / 水平方向上的縮放比例REAL yScale / 垂直方向上的縮放比例);n路徑漸變畫刷的變換q旋轉(zhuǎn)變換:RotateTransformStatus RotateTransform(REAL angle, MatrixOrder order = MatrixOrderPrepend);q縮放變換:ScaleTransformStatus ScaleTransform(REAL sx, REAL sy, MatrixOrder order = MatrixOrderPrepend);q矩陣變換:SetTransformStatus SetTransform(co

38、nst Matrix *matrix );n路徑漸變畫刷的Gamma(伽瑪)校正qGamma校正是GDI+支持的新功能,用于保證同一數(shù)字圖片在沒的計(jì)算機(jī)上達(dá)到同樣的顯示效果。默認(rèn)情況下是不支持Gamma校正的。qStatus SetGammaCorrection(BOOL useGammaCorrection); n示例/ 創(chuàng)建路徑對象Point points = Point(75, 0), Point(100, 50), Point(150, 50), Point(112, 75), Point(150, 150), Point(75, 100), Point(0, 150), Point(

39、37, 75), Point(0, 50), Point(50, 50);GraphicsPath path;path.AddLines(points, sizeof(points)/sizeof(points0);/ 創(chuàng)建路徑畫刷,并設(shè)置中心點(diǎn)顏色PathGradientBrush pthGrBrush(&path);pthGrBrush.SetCenterColor(Color(255, 255, 0, 0);/ 路徑漸變畫刷的多色漸變Color colors = Color(255, 0, 0, 0), Color(255, 0, 255, 0),Color(255, 0, 0,

40、 255), Color(255, 255, 255, 255), Color(255, 0, 0, 0), Color(255, 0, 255, 0), Color(255, 0, 0, 255), Color(255, 255, 255, 255),Color(255, 0, 0, 0), Color(255, 0, 255, 0);int count = sizeof(points)/sizeof(points0);pthGrBrush.SetSurroundColors(colors, &count); / 填充路徑g.FillPath(&pthGrBrush, &am

41、p;path);n練習(xí)q創(chuàng)建一個(gè)正三角形路徑漸變畫刷,路徑漸變畫刷的多色漸變(邊(255, 255, 0, 0)、中心(255, 255, 255, 0)。完成焦點(diǎn)縮放比例(0.0, 0.0)、(0.1, 0.6)、(0.5, 0.5)、(1.0, 1.0)、(1.5, 1.8),并比較。q指定上述畫刷的端點(diǎn)顏色,觀察效果。q指定端點(diǎn)顏色后,啟動Gamma校正,觀察效果。畫筆(畫筆(Pen)n畫筆用于描繪圖形的輪廓。其屬性有:色彩、寬度、對齊方式、線帽、變換方式。n創(chuàng)建:Pen(Color& color, / 畫筆顏色REAL width/ 畫筆寬度);Pen(Brush* brush

42、, / 用于創(chuàng)建畫筆的畫刷REAL width / 畫筆寬度);畫刷是沒有寬度的,畫筆可以通過GetWidth來獲取畫筆寬度畫筆的線型畫筆的線型n畫筆類型值:typedef enum DashStyleSolid = 0,/ 實(shí)線DashStyleDash = 1, / 虛線DashStyleDot = 2, / 點(diǎn)線DashStyleDashDot = 3, / 點(diǎn)劃線DashStyleDashDotDot = 4, / 雙點(diǎn)劃線DashStyleCustom = 5/ 自定義 DashStyle;n獲取和改變畫筆線型DashStyle GetDashStyle(VOID); Status

43、SetDashStyle(DashStyle dashStyle); n自定義畫筆線型/ 設(shè)定自定義線型 Status SetDashPattern(const REAL *dashArray,/ 自定義點(diǎn)線長度數(shù)組INT count / 數(shù)組大小);/ 獲取自定義點(diǎn)線數(shù)組大小INT GetDashPatternCount(VOID);/ 獲取自定義點(diǎn)線長度數(shù)據(jù)Status GetDashPattern(REAL *dashArray, INT count);自定義格式:畫線部分長度,間隔部分長度,畫線部分長度,畫筆的對齊方式畫筆的對齊方式n對齊方式類型值:typedef enum PenAl

44、ignmentCenter = 0,/ 居中PenAlignmentInset = 1/ 嵌入 PenAlignment; n設(shè)置和獲取對齊方式Status SetAlignment(PenAlignment penAlignment);PenAlignment GetAlignment(VOID);畫筆的縮放與旋轉(zhuǎn)畫筆的縮放與旋轉(zhuǎn)n旋轉(zhuǎn)變換:RotateTransformStatus RotateTransform(REAL angle, MatrixOrder order = MatrixOrderPrepend);n縮放變換:ScaleTransformStatus ScaleTrans

45、form(REAL sx, REAL sy, MatrixOrder order = MatrixOrderPrepend);n矩陣變換:SetTransformStatus SetTransform(const Matrix *matrix );畫筆的線帽屬性畫筆的線帽屬性n線帽枚舉類型值typedef enum LineCapFlat = 0, LineCapSquare = 1, LineCapRound = 2,LineCapTriangle = 3,LineCapNoAnchor = 0 x10,LineCapSquareAnchor = 0 x11,LineCapRoundAnch

46、or = 0 x12,LineCapDiamondAnchor = 0 x13,LineCapArrowAnchor = 0 x14,LineCapCustom = 0 xff LineCap;線帽類型值外觀描述LineCapFlat平面,直線的起點(diǎn)始于平面的右側(cè)LineCapSquare矩形,高度等于直線寬度,直線端點(diǎn)始于矩形中心點(diǎn)LineCapRound圓形,直徑等于直線寬度,圓形中心點(diǎn)即直線端點(diǎn)LineCapTriangle三角形,高度等于直線寬度,直線端點(diǎn)起于三角形邊線LineCapNoAnchor矩形,高度大于直線寬度,直線端點(diǎn)起于三角形邊線LineCapSquareAnchor圓形

47、,直徑大于直線寬度,圓形中心即直線端點(diǎn)LineCapRoundAnchor菱形(矩形翻轉(zhuǎn)75度),高度大于直線寬度,菱形中點(diǎn)即直線端點(diǎn)LineCapDiamondAnchor矩形,高度大于直線寬度,直線端點(diǎn)起于矩形中心點(diǎn)LineCapArrowAnchor箭頭,高度大于直線寬度,直線端點(diǎn)即為箭頭終點(diǎn)LineCapCustom自定義形狀,使用CutomLineCap類定義n自定義線帽類型qCustomLineCap類型CustomLineCap(const GraphicsPath *fillPath, / 填充路徑const GraphicsPath *strokePath,/ 畫線路徑 Li

48、neCap baseCap = LineCapFlat, / 基于線帽類型 REAL baseInset = 0 / 嵌入長度); q設(shè)置與獲取SetCustomStartCap:設(shè)置自定義起點(diǎn)線帽SetCustomEndCap:設(shè)置自定義終點(diǎn)線帽n示例:/ 創(chuàng)建自定義開始路徑GraphicsPath pthStart;pthStart.AddEllipse(-5, -5, 10, 10);/ 創(chuàng)建自定義結(jié)束路徑GraphicsPath pthEnd;pthEnd.AddLine(0, -20, 10, 0);pthEnd.AddLine(0, -20, -10, 0);pthEnd.AddL

49、ine(0, -10, 10, 0);pthEnd.AddLine(0, -10, -10, 0);/ 創(chuàng)建自定義線帽CustomLineCap clcStart(&pthStart, NULL);CustomLineCap clcEnd(NULL, &pthEnd);/ 創(chuàng)建畫刷,并指定自定義線帽Pen pen(Color(255, 255, 0, 0), 2.0f);pen.SetCustomStartCap(&clcStart);pen.SetCustomEndCap(&clcEnd);/ 畫線Graphics g(pDC-GetSafeHdc();g.D

50、rawLine(&pen, 100, 100, 200, 100);直線的連接點(diǎn)屬性直線的連接點(diǎn)屬性n連接點(diǎn)枚舉類型typedef enum LineJoinMiter = 0, /斜聯(lián)接,產(chǎn)生一個(gè)銳角或切除角,具體取決于斜聯(lián)接的長度是否超過斜聯(lián)接限制。 LineJoinBevel = 1, / 斜角的聯(lián)接,產(chǎn)生一個(gè)斜角 LineJoinRound = 2, / 圓形聯(lián)接,在兩條線之間產(chǎn)生平滑的圓弧 LineJoinMiterClipped = 3 /斜聯(lián)接,產(chǎn)生一個(gè)銳角或斜角,具體取決于斜聯(lián)接的長度是否超過斜聯(lián)接限制。 LineJoin;3 文本與字體文本與字體n在GDI+中使用文字

51、qGDI+字體q列舉出系統(tǒng)目前安裝的字體信息q字體輪廊的平滑處理q創(chuàng)建私有字體集合n在GDI+中輸出文本在在GDI+中使用文字中使用文字n創(chuàng)建字體Font(HDC hdc);Font(HDC hdc, const LOGFONTA *logfont);Font(HDC hdc, const LOGFONTW *logfont);Font(HDC hdc, const HFONT hfont);Font(const FontFamily *family, REAL emSize, INT style, Unit unit);Font(const WCHAR *familyName, REAL e

52、mSize, INT style, Unit unit, const FontCollection *fontCollection);nFontFamilyFontFamily();FontFamily(const WCHAR *name, const FontCollection *fontCollection);設(shè)備環(huán)境句柄字體信息結(jié)構(gòu)體指針GDI邏輯字體句柄字體系列對象指針字體高度字體風(fēng)格,由FontStyle指定字體高度的單位,默認(rèn)為UnitPoint字體集,默認(rèn)為NULL,表示與系統(tǒng)一致。字體名GDI+字體字體n字體信息描述結(jié)構(gòu)體typedef struct tagLOGFONT L

53、ONG lfHeight; LONG lfWidth; LONG lfEscapement; LONG lfOrientation; LONG lfWeight; BYTE lfItalic; BYTE lfUnderline; BYTE lfStrikeOut; BYTE lfCharSet; BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; TCHAR lfFaceNameLF_FACESIZE; LOGFONT;n字體的大小單位枚舉typedef enum UnitWorld

54、 = 0,UnitDisplay = 1,UnitPixel = 2,UnitPoint = 3,UnitInch = 4,UnitDocument = 5,UnitMillimeter = 6 Unit;n字體風(fēng)格枚舉typedef enum FontStyleRegular = 0,FontStyleBold = 1,FontStyleItalic = 2,FontStyleBoldItalic = 3,FontStyleUnderline = 4,FontStyleStrikeout = 8 FontStyle;列舉出系統(tǒng)目前安裝的字體信息列舉出系統(tǒng)目前安裝的字體信息nInstalled

55、FontCollection類qGetFamilyCountqStatus GetFamilies(INT numSought, FontFamily *gpfamilies, INT *numFound ) const;nInstalledFontCollection派生自FontCollection n練習(xí):增強(qiáng)型字體對話框字體輪廊的平滑處理字體輪廊的平滑處理nSetTextRenderingHint Status SetTextRenderingHint(TextRenderingHint newMode);nTextRenderingHinttypedef enum / 使用系統(tǒng)默認(rèn)TextRenderingHintSystemDefault = 0, / 不消除鋸齒,使用網(wǎng)格匹配TextRenderingHintSingleBitPerPixelGridFit = 1,/ 不消除鋸齒,不使用網(wǎng)格匹配TextRenderingHintSingleBitPerPixel = 2,/ 消除鋸齒,使用網(wǎng)格匹配TextRenderingHintAntiAliasGridFit = 3, / 消除鋸齒,不使用網(wǎng)格匹配TextRenderingHintAntiAlias = 4, / 在液晶顯示上,使用ClearType技術(shù)TextRender

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論