1、畫筆的使用 畫筆用于描繪圖形的輪廓,Gdi 畫筆除了常見的色彩和寬度屬性外,還添加了其他屬性,如對(duì)其方式、線帽和變換方式等。 <1>、Pen類 Gdi 使用Pen(畫筆)類來定義一個(gè)畫筆,Pen類的構(gòu)造函數(shù)如下: *Pen(color, width)//利用此構(gòu)造函數(shù)將創(chuàng)建一個(gè)寬為width、色彩為color的畫筆; 例如:創(chuàng)建寬度為4的紅色畫筆: Pen redpen(Color(255, 255,0,0),4.0f); *Pen(brush, width)//利用指定畫刷來構(gòu)建一個(gè)畫筆,色彩為畫刷的色彩, 寬度為width 例1: 使用純色畫刷創(chuàng)建寬度為4的紅色畫筆 SolidBrush sBrush(Color(255, 255, 0, 0)); Pen pen(&sBrush, 4.0f); 例2:使用畫刷來創(chuàng)建文理畫筆 Image image(_T('texture.bmp'));//加載文理圖片 TextureBrush tBrush(&image);//構(gòu)建文理畫刷 Pen texturedPen(&tBrush, 30);//用文理畫刷構(gòu)建畫筆 graphics.DrawLine(&texturedPen, 0, 0, 100, 200); <2>、畫筆的線型 使用Pen類的成員函數(shù)SetDashStyle來設(shè)置畫筆的線型。 DashStyle(線型)是一個(gè)枚舉結(jié)構(gòu),提供了5種畫筆線型風(fēng)格: enum DashStyle{ DashStyleSolid =0;//實(shí)線 DashStyleDash =1;//虛線 DashStyleDot = 2;//點(diǎn)線 DashStyleDashDot = 3;//點(diǎn)劃線 DashStyleDashDotDot = 4;//雙點(diǎn)劃線 DashStyleCustom = 5;//自定義線型 }; 關(guān)于自定義線型的實(shí)現(xiàn): *使用Pen類的成員函數(shù)SetDashPattern(設(shè)置線型風(fēng)格)來自定義線型: 首先,定義一個(gè)描述畫筆虛實(shí)的數(shù)組,數(shù)組的格式是: [畫線部分長(zhǎng)度, 間隔部分長(zhǎng)度, 畫線部分長(zhǎng)度, 間隔部分長(zhǎng)度......] 然后將該數(shù)組傳參給SetDashPattern實(shí)現(xiàn)自定義線型。 示例: REAL dashVals[4] = { 5.0f,//線長(zhǎng)5個(gè)像素 2.0f,//間斷2個(gè)像素 15.0f,//線長(zhǎng)15個(gè)像素 4.0f,//間隔4個(gè)像素 }; pen.SetDashPattern(dashVals, 4); 注:Pen類的成員函數(shù)GetDashPattern(獲取線型風(fēng)格),GetDashPatternCount(獲取線型的定義點(diǎn)總數(shù)) <3>、畫筆的對(duì)齊方式 畫筆是具有寬度的,相對(duì)與繪制線條來說,畫筆寬度中的中心位置是由其對(duì)齊方式?jīng)Q定的。 畫筆的對(duì)齊方式是由Pen類的成員變量PenAlignment枚舉描述的: enum PenAlignment{ PenAlignmentCenter =0;//居中 PenAlignmentInset = 1;//嵌入}; 設(shè)置對(duì)齊方式:例:pen.SetAlignment(PenAlignmentInset);//設(shè)置內(nèi)嵌對(duì)齊方式 <4>、畫筆的縮放與旋轉(zhuǎn) 畫筆的縮放:三種方法:ScaleTransform、MultiplyTransform、SetTransfrom 例子:Pen pen(Color(255, 255, 0,0), 5); Matrix matrix(1,0,0,2,0,0); pen.MultiplyTransform(&matrix, MatrixOrderPrepend);//方法一 pen.SetTransform(&matrix);//方法二 pen.ScaleTransform(1,4);//方法三 graphics.DrawRectangle(&pen, 50,50,200,200); 畫筆的旋轉(zhuǎn):RotateTransform。注:只有當(dāng)畫筆寬度大于1時(shí),畫筆的旋轉(zhuǎn)才會(huì)對(duì)繪制的線條外觀產(chǎn)生影響。 例子:pen.RotateTransform(60, MatrixOrderAppend);//將畫筆旋轉(zhuǎn)60度。 <5>、畫筆的線帽屬性 “線帽”(LineCap是指線條首尾的外觀。 設(shè)置起點(diǎn)線帽:SetStartCap; 設(shè)置終點(diǎn)線帽:SetEndCap; 不同的線帽外觀由LineCap枚舉。自定義線帽使用CustomLineCap類。 例子:
GraphicsPath StartPath, EndPath;//定義兩個(gè)路徑
StartPath.AddRectangle(Rect(-10,-5, 20,10));//在路徑中添加一個(gè)矩形
//構(gòu)造結(jié)束點(diǎn)線帽外觀
EndPath.AddLine(0, -20, 10, 0);
EndPath.AddLine(0, -20, -10, 0);
EndPath.AddLine(0,-10, 10, 0);
EndPath.AddLine(0, -10, -10, 0);
Pen MyLineCapPen(Color(255, 0,0,255),2);
//將路徑設(shè)置為線帽外觀
CustomLineCap startCap(NULL, &StartPath);
CustomLineCap endCap(NULL, &EndPath);
//設(shè)置畫筆的線帽外觀
MyLineCapPen.SetCustomStartCap(&startCap);
MyLineCapPen.SetCustomEndCap(&endCap);
graphics.DrawLine(&MyLineCapPen, 800,30, 1000,30);
//以(300,300)為中心,繪制直線
for(float i=0; i<6.28f; i =0.15f)
{
graphics.DrawLine(&MyLineCapPen,800.0f,300.0f, 800.0f 200.0f*cos(i),300.0f 200.0f*sin(i));
} <6>、畫筆連接點(diǎn)屬性
”連接點(diǎn)“(LineJoin):兩條端點(diǎn)重合或重疊的直線形成的公共區(qū)域。 Gdi 提供了4種直線連接方式:斜接(LineJoinMiter)、斜切(LineJoinBevel)、圓形(LineJoinRound)及剪切斜接(LineJoinMiterClipped)。由LineJoin枚舉。 通過Pen類SetLineJoin成員方法來定義線條之間的連接方式。 例:將連接點(diǎn)設(shè)置為圓形:pen.SetLineJoin(LineJoinRound); 注:LineJoinMiterClipped與LineJoinMiter的區(qū)別主要在直線的'斜連接限制'。 <7>、畫刷透明度 在GDI 中之所以能夠?qū)崿F(xiàn)透明的效果,是因?yàn)樗鼘?duì)色彩的定義使用了ARGB的方式。 創(chuàng)建帶透明度的畫筆,本質(zhì)是在設(shè)置畫筆色彩時(shí),在色彩中加入透明度。 例子,書上的代碼,效果非常漂亮:
Pen MyRedPen(Color(255, 255, 0, 0));
Pen MyBluePen1(Color(255, 0, 0, 255));
//繪制網(wǎng)線
int y = 512;
for(int x=0; x<512; x =5)
{
graphics.DrawLine(&MyBluePen1,0, y, x, 0);
graphics.DrawLine(&MyRedPen, 512, x, y, 512);
y-= 5;
Sleep(120);
}
//使用綠色畫筆繪制不同透明度的線條
//透明度從上到下遞減
for(y=0; y<512;y )
{
Pen MyGreenPen(Color(y/2, 0,255,0));
graphics.DrawLine(&MyGreenPen, 0, y, 512, y);
//延時(shí)查看動(dòng)態(tài)效果
Sleep(20);
}
2、畫刷的使用 在GDI 中,畫刷分為5種,分別為單色畫刷、影線畫刷、紋理畫刷、線性漸變畫刷和路徑漸變畫刷。 用畫刷填充區(qū)域時(shí),可能用到的填充函數(shù): *FillClosedCurve:填充閉合曲線 *FillEllipse:填充橢圓 *FillPath:填充路徑 *FillPie:填充扇形 *FillPolygon:填充多邊形 *FillRectangle:填充矩形 *FillRectangles:填充矩形集 *FillRegion:填充區(qū)域 <1>、單色畫刷(SolidBrush) 例:SolidBrush greenBrush(Color(255,0,255,0)); //定義幾個(gè)點(diǎn), ...... PointF points[4] = {point1,point2,point3,point4}; graphics.FillClosedCurve(&greenBrush, points, 4, FillModeAlternate, 1.0); *使用GDI 填充函數(shù)時(shí),一個(gè)值得注意的問題:如何保存填充的區(qū)域信息? 對(duì)于大多數(shù)由數(shù)學(xué)函數(shù)曲線構(gòu)成的封閉區(qū)域而言,程序不可能將每一點(diǎn)的坐標(biāo)都保存在數(shù)組中(這樣的數(shù)組體積很大,而且保存規(guī)則的定義也很難控制),GDI 中提供的“圖形路徑對(duì)象(GraphicsPath)”可以很好地簡(jiǎn)化對(duì)此問題的處理:(先在圖形路徑中繪圖,再填充路徑) 例子:繪制正葉曲線 數(shù)學(xué)公式:R= A*sin(N*Angle) X = R*cos(Angle) Y = R*sin(Angle) 注:A相當(dāng)于葉子長(zhǎng)度,N是決定葉子數(shù)目的常量, Angle是葉子的偏轉(zhuǎn)角度。
/******************************************************************************/
//繪制正葉曲線
CRect rect;
this->GetClientRect(&rect);
int cx = rect.Width()/2;
int cy = rect.Height()/2;
//設(shè)定葉子長(zhǎng)度
int LeafLength = 100;
//設(shè)定葉子數(shù)目
int LeafNum = 5;
float PI = 3.14159;
int x2,y2, x,y, r;
//創(chuàng)建一個(gè)圖形路徑對(duì)象,用來容納正葉曲線的邊界線
GraphicsPath tmpPath(FillModeAlternate);
//生成曲線邊界數(shù)據(jù):角度變化為一周2*PI
for(float i= 0.0f; i<PI*2 0.1f; i =PI/180)
{
r = abs(LeafLength*sin(LeafNum*i));
x = r*cos(i);
y = r*sin(i);
x2 = cx x;
y2 = cy y;
//將曲線的邊界信息存入臨時(shí)路徑,如果想要查看這些信息所構(gòu)成的區(qū)域,可以在此加入
//graphics.DrawLine(&BlackPen, x2,y2, x2-1,y2-1);
tmpPath.AddLine(x2,y2,x2-1, y2-1);
}
//填充路徑
graphics.FillPath(&greenBrush, &tmpPath);
//繪制中心坐標(biāo)軸
Pen pen(Color::Gray, 1);
graphics.DrawLine(&pen, 0, cy, cx*2, cy );
graphics.DrawLine(&pen, cx, 0, cx, cy*2);
<2>影線畫刷(HatchBrush) GDI 使用HatchBrush類來定義影線畫刷: HatchBrush( HatchStyle hatchStyle,//影線畫刷的類型 const Color& foreColor,//影線畫刷線條的前景色 const Color& backColor//影線畫刷線條的背景色); 使用影線畫刷的步驟:定義畫刷、定義填充區(qū)域、開始填充; hatchStyle 枚舉了53種風(fēng)格的畫刷類型 ***繪制原點(diǎn): 影線畫刷是使用單個(gè)基本圖案對(duì)區(qū)域進(jìn)行填充的,基本圖案必須以一個(gè)特定的像素位置作為排列的起點(diǎn),這個(gè)起點(diǎn)在GDI 中稱為“RenderingOrigin”。 在繪圖平面中設(shè)置繪制原點(diǎn)的方法:調(diào)用SetRenderingOrigin函數(shù): Status SetRenderingOrigin(INT x, INT y); 其中,參數(shù)x,y是點(diǎn)相對(duì)位移像素?cái)?shù)目。 例子: HatchBrush Brush_Test(HatchStyleForwardDiagonal, black, white);
for(int i =0; i<12; i )
{
graphics.FillRectangle(&Brush_Test, (i%4)*50, 200 50*(i/4), 50,50);
}
for(int j=0; j<12; j )
{
//設(shè)置畫刷原點(diǎn)
graphics.SetRenderingOrigin(j, 0);
graphics.FillRectangle(&Brush_Test, 250 (j%4)*50, 200 50*(j/4), 50,50);
}
注:就影線畫刷而言,原點(diǎn)的設(shè)定對(duì)于多窗口程序的界面設(shè)定也有一定影響,如果有兩個(gè)窗口,一個(gè)父窗口、一個(gè)子窗口,而且這兩個(gè)窗口的背景都使用影線畫刷進(jìn)行填充,那么,在進(jìn)行子窗口背景重繪時(shí),如果將子窗口的原點(diǎn)設(shè)定成與父窗口的左上角一致,就能達(dá)到一種子窗口與父窗口融合的視覺效果。 <3>、紋理畫刷(TextureBrush) 1*紋理畫刷是將圖片在目標(biāo)區(qū)域中進(jìn)行平鋪。紋理畫刷的基本圖案是基于光柵的圖形。 2*創(chuàng)建紋理畫刷的基本步驟: 定制紋理畫刷使用的基本圖案(圖形); 設(shè)定畫刷圖片的大小; 確定基本圖案的排列方式; GDI 使用TextureBrush類來構(gòu)造紋理畫刷,TextureBrush要求依以上3個(gè)步驟在類構(gòu)造函數(shù)中完成。 TextureBrush有以下7種構(gòu)造函數(shù): TextureBrush(Image* image, Rect& dstRect, ImageAttributes* imageAttributes); TextureBrush(Image* image, RectF& dstRect, ImageAttributes* imageAttributes ); TextureBrush(Image* image, WrapMode wrapMode); TextureBrush(Image* image, WrapMode wrapMode, Rect& dstRect); TextureBrush(Image* image, WrapMode wrapMode, RectF& dstRect); TextureBrush(Image* image, WrapMode wrapMode, INT dstX, INT dstY, INT dstWidth, INT dstHeight); TextureBrush(Image* image, WrapMode wrapMode,REAL X, REAL Y, REALWidth, REAL Height); 參數(shù): image: 紋理畫刷使用的基本圖案; dstRect: 用于指定圖案中用于畫刷的矩形區(qū)域,它的大小不能超過基本圖案的范圍,否則不能完成正常填充效果。 wrapMode:指定在畫刷中如何排列基本圖案。 imageAttributes:用于指定基本圖案的附加特征參數(shù)。 3* 紋理畫刷對(duì)基本圖案的3種載入方式:正常加載基本圖案、部分選取基本圖案、縮放后的基本圖案。 //裝入紋理圖片
Image image(L'Chrysanthemum.jpg');
//構(gòu)造紋理畫刷1,使用原始圖片
TextureBrush tBrush(&image);
//使用紋理畫刷填充圓形區(qū)域
graphics.FillEllipse(&tBrush, rect1);
//構(gòu)造紋理畫刷2,使用部分圖片
TextureBrush tBrush2(&image, Rect(0,0, 35,70));
graphics.FillEllipse(&tBrush2, rect2);
//構(gòu)造紋理畫刷3,對(duì)圖片進(jìn)行縮放
TextureBrush tBrush3(&image);
tBrush3.SetTransform(&Matrix(0.1f,0.0f, 0.0f, 0.1f, 0.0f,0.0f));
graphics.FillEllipse(&tBrush3, rect3);
注意:通過對(duì)基本圖案進(jìn)行縮放來構(gòu)造紋理畫刷時(shí),如果將矩形區(qū)域的大小設(shè)置的比基本圖案大,則這種方式生成紋理畫刷會(huì)失敗,編程時(shí)要注意。 4*紋理畫刷的排列方式(即基本圖案單元的平鋪方式) TextureBrush類的構(gòu)造函數(shù)中,參數(shù)WrapMode指定了畫刷中基本圖案的排列方式。 WrapMode枚舉提供了5種圖案排列方式: enmu WrapMode{ WrapModeTile,//對(duì)圖片使用簡(jiǎn)單的平鋪方式 WrapModeTileFlipX,//水平翻轉(zhuǎn)并平鋪,填充的目標(biāo)區(qū)域相鄰兩列的基本圖案一列是原始的,一列是水平翻轉(zhuǎn)的 WrapModeTileFilpY,//垂直翻轉(zhuǎn)并平鋪,填充的目標(biāo)區(qū)域相鄰兩行的基本圖案一行是原始的,一行是垂直翻轉(zhuǎn)的 WrapModeTileFilpXY,//垂直水平都翻轉(zhuǎn)并平鋪,WrapModeTileFlipX和WrapModeTileFilpY的疊加效果。 WrapModeClamp//對(duì)基本圖案不進(jìn)行平鋪,填充的目標(biāo)區(qū)域只有左上角是圖案,其余部分透明不可見。 }; RectF rect5(10, 250, 200,200); TextureBrush tBrush5(&image, WrapModeTileFlipY); tBrush5.SetTransform(&Matrix (0.1f,0.0f, 0.0f, 0.1f,0.0f, 0.0f)); graphics.FillEllipse(&tBrush5, rect5); 5* 紋理畫刷的變換(即基本圖案在畫刷中的外觀) 紋理畫刷的變換分為3種:旋轉(zhuǎn)變換(RotateTransform)、縮放變換(ScaleTransform)、平移變換(TranslateTransform)。 平移變換:對(duì)基本圖案在水平方向和垂直方向上的移動(dòng); 縮放變換:對(duì)基本圖案的放大和縮??; 旋轉(zhuǎn)變換:對(duì)基本圖案按照順時(shí)針方向轉(zhuǎn)動(dòng); 例子:tBrush.RotateTransform(30);//將畫刷旋轉(zhuǎn)30度。 tBrush.ScaleTransform(3,1);//將畫刷水平方向上放大3倍。 tBrush.TranlateTransform(30, 0);//將畫刷在水平方向上平移30個(gè)像素。 注意:畫刷的變換是可以疊加的,如果進(jìn)行一次變換后,恢復(fù)變換前的畫刷狀態(tài),可以使用ResetTransform函數(shù)。 tBrush.ResetTransform 使用GetTransform函數(shù)可以對(duì)畫刷的狀態(tài)進(jìn)行查詢。 線性漸變畫刷的“漸變”體現(xiàn)在:色彩變化沿著指定角度的直線路徑方向進(jìn)行。線性漸變畫刷可以是雙色漸變,也可以是多色漸變。 LinearGradientBrush的構(gòu)造函數(shù): LinearGradientBrush(Point& point1, Point& point2, Color& color1, Color& color2); LinearGradientBrush(PointF& point1, PointF& point2, Color& color1, Color& color2); LinearGradientBrush(Rect& rect, Color& color1, Color& color2, REAL angle, BOOL isAngleScalable); LinearGradientBursh(RectF& rect, Color& color1, Color& color2, REAL angle, BOOL isAngleScalable); LinearGradientBrush(Rect& rect, Color& color1, Color& color2, LinearGradientMode mode); LinearGradientBrush(RectF& rect, Color& color1, Color& color2, LinearGradientMode mode); 參數(shù): color1, color2 :起點(diǎn)、終點(diǎn)的色彩; point1, point2 :起點(diǎn)、終點(diǎn)的坐標(biāo); rect : 畫刷的矩形定義區(qū)間; isAngleScalable: 畫刷是否需要旋轉(zhuǎn); Angle : 漸變畫刷的旋轉(zhuǎn)角度,只有當(dāng)參數(shù)isAngleScalable為真時(shí),該參數(shù)才有效; LinearGradientMode: 漸變線的填充方向。 1* 填充方式 把線性漸變畫刷要定義的區(qū)域看成是一個(gè)單獨(dú)的基本圖案,就相當(dāng)于紋理畫刷中對(duì)基本圖案的排列方式進(jìn)行控制。 例子: LineGraBrush(Point(0,0), Point(40,40),Color(255,255,0,0), Color(255,0,0,255)); LineGraBrush.SetWrapMode(WrapModeTile);//平鋪排列(默認(rèn)方式) 其余排列方式WrapModeTileFlipX、WrapModeTileFlipY、WrapModeTileFlipXY.(注意沒有WrapModeClamp) 若要重置繪制原點(diǎn),調(diào)用:graphics.SetRenderingOrigin函數(shù); 2* 使用漸變模式 LinearGradientMode(漸變模式)枚舉定義了漸變線是如何從矩形的一邊或一角構(gòu)成的。 enum LinearGradientMode { LinearGradientModeHorizontal,//漸變線是水平的,起點(diǎn)色在左邊,終點(diǎn)色在右邊 LinearGradientModeVertical,//漸變線是垂直的,起點(diǎn)色在上面,終點(diǎn)色在下面 LinearGradientModeForwardDiagonal,//從左上角到右下角漸變,起點(diǎn)色在左上角,終點(diǎn)色在右下角 LinearGradientModeBackwardDiagonal//從右上角到左下角漸變,起點(diǎn)色在右上角,終點(diǎn)色在左下角 } 注意:后兩種漸變模式,矩形的對(duì)角線是色彩的混合線,而不是漸變線。 3* 漸變線 漸變線是一條虛線,代表色彩變化的方向,漸變線由指定的矩形的左上角點(diǎn)和偏轉(zhuǎn)角共同決定,例如LinearGradientModeHorizontal模式下偏轉(zhuǎn)角是0度,LinearGradientModeVertical模式下偏轉(zhuǎn)角是90度。 開發(fā)人員可以對(duì)漸變線的偏轉(zhuǎn)角度進(jìn)行任意設(shè)置,設(shè)置的方法是:在LinearGradientBrush的構(gòu)造函數(shù)中通過參數(shù)angle的值來進(jìn)行。 例如:定義一個(gè)漸變線偏角為30度的漸變畫刷: LinearGradientBrush lineBrush(Rect(0,0,40,20), Color(255,255,0,0), Color(255,0,0,255), 30.0f); 4* 多色線性漸變畫刷的實(shí)現(xiàn) 多色漸變是指在起點(diǎn)色和終點(diǎn)色的漸變過程中加入其它色彩作為變化的過渡色(又稱為插值色)。 實(shí)現(xiàn)多色漸變畫刷的過程是,指明參與漸變的每一種過渡色彩值,然后定義每一個(gè)過渡色的合成位置值。 GDI 通過設(shè)置插色值函數(shù)SetInterpolationColors來實(shí)現(xiàn): 原型:Status SetInterpolationColors(const Color* presetColors, const REAL* blendPositions, INT count); 參數(shù): presetColors:包含多種預(yù)定義過渡色的數(shù)組,該數(shù)組的第一個(gè)變量定義漸變的起點(diǎn)色,最后一個(gè)變量定義終點(diǎn)色,其余元素是過渡色色彩值。 blendPositions:包含色彩合成位置的數(shù)組。在GDI 中,合成位置用百分比來表示,即從起點(diǎn)色到合成位置點(diǎn)的長(zhǎng)度占整個(gè)區(qū)域的百分比,該數(shù)組的第一個(gè)變量代表了起點(diǎn)色的合成位置,必須為0%,最后一個(gè)變量代表終點(diǎn)色的合成位置,必須為100%。注意:合成位置并不是過渡色的開始,而是過渡色最濃的位置。 count : 參與漸變的色彩總數(shù),該值等于數(shù)組presetColors和blendPositions的大小。 5* 定制色彩漸變行為 線性漸變畫刷的合成因子(Blend Factors):合成因子以百分比的形式代表色彩的漸變程度, 100%意味著色彩完全轉(zhuǎn)換,0%意味著色彩不進(jìn)行漸變。 雙色漸變畫刷,合成因子代表的是終點(diǎn)色的轉(zhuǎn)變程度,對(duì)于多色漸變畫刷,合成因子代表每一種參與過渡的漸變色的漸變程度。 **1、使用設(shè)置合成方式函數(shù)SetBlend可以改變默認(rèn)的色彩漸變行為。 原型:Status SetBlend(const REAL* blendFactors, const REAL* blendPositions, INT count); 參數(shù):blendFactors:包含合成因子的數(shù)組,每一個(gè)數(shù)組成員的取值范圍為0~1; blendPosition : 包含合成位置的數(shù)組, 每一個(gè)成員依次代表著參與漸變的過渡色的合成位置,第一個(gè)變量代表起點(diǎn)色的合成位置,必須為0%, 最后一個(gè)成員代表終點(diǎn)色的合成位置,必須為100%。 count:合成點(diǎn)位置數(shù),與blendFactors和blendPosition的數(shù)組大小一致。 色彩回歸現(xiàn)象:當(dāng)一種色彩向另一種色彩漸變時(shí),如果色彩的合成因子到一定程度,就會(huì)出現(xiàn)另一種色主導(dǎo)的色彩。 **2、還可以使用下列函數(shù)自定義漸變過程: SetBlendTriangularShape(REAL focus, REAL scale);//基于三角形的漸變 SetBlendBellShape(REAL focus, REAL scale);//基于鐘型曲線的漸變 這兩個(gè)函數(shù)功能相同,只是內(nèi)部實(shí)現(xiàn)原理不同,focus設(shè)置合成點(diǎn)位置, scale指明合成因子的大小。
<5>、路徑漸變畫刷(PathGradientBrush) 路徑漸變畫刷是指畫刷的色彩變化在指定的路徑內(nèi)完成,漸變色從路徑內(nèi)部的中心點(diǎn)逐漸過渡到路徑的邊框。 路徑的概念: 路徑表明了一定的區(qū)間,應(yīng)用程序使用路徑來繪制形體的輪廓、填充形體內(nèi)部以及創(chuàng)建剪切區(qū)域。路徑可以由一個(gè)或多個(gè)圖案組成,而每一個(gè)圖案又可以由一系列的直線或曲線組成,還可以是基本的幾何形體(矩形、圓形、扇形); 路徑漸變畫刷(PathGradientBrush)的構(gòu)造函數(shù): PathGradientBrush(GraphicsPath* path); PathGradientBrush(Point* points, int count, WrapMode warpMode); PathGradientBrush(PointF* points, int count, WrapMode warpMode); 參數(shù): path: 由GraphicsPath類定義的路徑; points: 用數(shù)組形式表示的組成路徑的各個(gè)端點(diǎn)的坐標(biāo); count: 構(gòu)造函數(shù)的端點(diǎn)總數(shù); warpMode:漸變畫刷在目標(biāo)區(qū)域中的排列方式。 路徑漸變畫刷與線性漸變畫刷的比較: 路徑漸變畫刷的漸變方向是從路徑中央到路徑邊緣,是一種呈發(fā)散狀的漸變,而線性漸變畫刷的漸變方向較為單一(水平、垂直、固定角度)。 它們的漸變實(shí)質(zhì),都是點(diǎn)到點(diǎn)的漸變。 在使用路徑漸變畫刷填充目標(biāo)區(qū)域前,要指明路徑對(duì)象和指定路徑的中心點(diǎn)色彩(起點(diǎn)色)和路徑邊界的色彩(終點(diǎn)色),中心色默認(rèn)為黑色,邊界色可以使用相同的色彩,也可以分別為每一個(gè)不同的路徑邊緣點(diǎn)指明終點(diǎn)色。
Point points[] = {
Point(75,0),Point(100, 50),
Point(150,50),Point(112,75),
Point(150,150), Point(75, 100),
Point(0, 150), Point(37, 75),
Point(0, 50), Point(50, 50),
Point(75,0) };
//創(chuàng)建路徑
GraphicsPath path;
//在路徑中加入直線
path.AddLines(points, 11);
PathGradientBrush pthGrBrush(&path);
//設(shè)置起點(diǎn)色
pthGrBrush.SetCenterColor(Color(255, 255, 0, 0));
//設(shè)置每個(gè)終點(diǎn)的色彩
Color colors[] ={
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),
Color(255, 0, 0, 255),Color(255, 255, 255, 255),
Color(255, 0, 0,0), Color(255, 0, 255, 0),
};
int Count =10;
//設(shè)置終點(diǎn)色
pthGrBrush.SetSurroundColors(colors, &Count);
//填充路徑
graphics.FillPath(&pthGrBrush, &path);
**1、漸變路徑的約束矩形對(duì)象和漸變路徑的中心點(diǎn) 漸變路徑的約束矩形對(duì)象:包圍路徑區(qū)域的最小矩形,這個(gè)矩形的左上角是定義路徑的各點(diǎn)坐標(biāo)的最小值,右下角是最大值。 利用PathGradientBrush類的成員函數(shù)GerRectangle能夠得到漸變路徑的約束矩形對(duì)象。 約束矩形的意義:在使用畫刷對(duì)目標(biāo)區(qū)域填充時(shí),畫刷的排列相當(dāng)于約束矩形的排列。 路徑的中心點(diǎn):定義路徑的各個(gè)點(diǎn)坐標(biāo)的平均值。 PathGradientBrush類的成員函數(shù)GetCenterPoint能夠直接獲得路徑中心點(diǎn)坐標(biāo),SetCenterPoint能夠改變中心點(diǎn)坐標(biāo)。 注意:漸變路徑中心點(diǎn)并不一定是約束矩形的中心點(diǎn)。 **2、路徑漸變畫刷的填充方式 路徑畫刷的排列方式與其他畫刷一樣,也是使用SetWrapMode函數(shù)來完成的。
注意:GDI 平面的默認(rèn)繪制原點(diǎn)是窗口左上角(0,0),對(duì)于畫刷而言,其填充區(qū)域相當(dāng)于在程序中指定的填充區(qū)域加上該區(qū)域到窗口左上角之間的總和。 **3、改變路徑漸變畫刷的中心點(diǎn) 由于路徑漸變畫刷的色彩漸變體現(xiàn)在中心點(diǎn)到邊緣點(diǎn)之間的一種色彩過渡,所以改變中心點(diǎn)將很大程度上影響整個(gè)填充效果,尤其適合對(duì)立體圖形的處理。方法:調(diào)用路徑漸變畫刷的成員SetCenterPoint(point); 注意:當(dāng)設(shè)置的中心點(diǎn)位于路徑之外時(shí),路徑色彩的變化還是從中心點(diǎn)到路徑邊緣,只不過顯示的色彩只是漸變的一部分。 **4、路徑漸變畫刷的多色漸變 路徑漸變畫刷的多色漸變與線性漸變畫刷一樣,調(diào)用SetInterpolationColors來增加漸變色。編程也遵從“指明漸變色總數(shù)、指明合成位置”的基本思路。 **5、更改路徑漸變畫刷的焦點(diǎn)縮放比例 注:Graphics的成員函數(shù)CloseFigure提供對(duì)區(qū)域的封閉操作。 對(duì)路徑構(gòu)成的一個(gè)封閉區(qū)域,如果在封閉區(qū)域的內(nèi)部再選擇一個(gè)與整個(gè)路徑的形狀一致、但是面積更小一些的區(qū)域,這個(gè)區(qū)域就稱為對(duì)原始區(qū)域的焦點(diǎn)縮放。對(duì)三角形區(qū)域進(jìn)行焦點(diǎn)縮放后的效果如下圖:
圖中,實(shí)線三角形是預(yù)定義的原始區(qū)域,虛線三角形是按照不同焦點(diǎn)縮放比例縮放后的三角形區(qū)域。 焦點(diǎn)縮放比例是縮放后的區(qū)域尺寸與原始區(qū)域尺寸之比,分為水平焦點(diǎn)縮放比例和垂直焦點(diǎn)縮放比例,區(qū)域的焦點(diǎn)縮放就是對(duì)原始區(qū)域進(jìn)行水平和垂直方向上的放大或縮小。 注意:在路徑漸變畫刷中,設(shè)置的中心點(diǎn)色彩只在“中心點(diǎn)”(只有這一個(gè)點(diǎn))顯示,而在中心點(diǎn)周圍的點(diǎn)的色彩則是漸變后的色彩。 更改路徑漸變畫刷的焦點(diǎn)縮放比例的目的在于,讓路徑中心點(diǎn)的色彩按照不同的縮放比例在中心區(qū)域的每一處都顯示,而不是僅僅在中心點(diǎn)顯示。 可以使用SetFouceScales函數(shù)來更改路徑默認(rèn)的焦點(diǎn)縮放比例。該函數(shù)的調(diào)用方法: Status SetFouceScales( REAL xScale,//水平方向上的縮放比例 REAL yScale//垂直方向上的縮放比例 ); 注:路徑漸變畫刷默認(rèn)的水平和垂直方向上的焦點(diǎn)縮放比例都是0,也就是將區(qū)域縮放為一點(diǎn)。 使用GetFocusScale函數(shù)可以獲得水平、垂直方向上的焦點(diǎn)縮放比例。 注意:對(duì)路徑漸變畫刷的焦點(diǎn)進(jìn)行縮小,縮小的極限是中心區(qū)域變成一個(gè)點(diǎn)(即中心點(diǎn)色彩僅在中心點(diǎn)顯示,路徑漸變畫刷的默認(rèn)值);如果對(duì)路徑漸變畫刷的焦點(diǎn)進(jìn)行放大,放大的極限是中心區(qū)域與路徑漸變畫刷的約束矩形大小一致。 **6、路徑漸變畫刷的變換 同線性漸變畫刷相同,路徑漸變畫刷同樣支持3種常見的坐標(biāo)變換:平移變換、縮放變換、旋轉(zhuǎn)變換。操作過程與線性漸變畫刷變換相同。通常將畫刷的變換和排列方式結(jié)合使用,可以實(shí)現(xiàn)復(fù)雜的填充效果。 **7、啟動(dòng)路徑漸變畫刷的Gamma校正 不同的計(jì)算機(jī)對(duì)于同一幅圖片的顯示結(jié)果可能不一樣,尤其是色彩信息。在計(jì)算機(jī)系統(tǒng)中,由于顯卡或者顯示器的原因,會(huì)出現(xiàn)實(shí)際圖像在亮度上有偏差的情況,而Gamma校正就是通過一定的方法來校正圖像的這種偏差方法。一般情況下,當(dāng)Gamma校正值大于1時(shí),圖像的高光部分被壓縮而暗調(diào)部分被擴(kuò)展;當(dāng)Gamma校正值小于1時(shí),圖像高光部分被擴(kuò)展而暗調(diào)部分被壓縮,Gamma一般用于平滑地?cái)U(kuò)展暗調(diào)細(xì)節(jié)。 注:如果想讓數(shù)字圖片在不同計(jì)算機(jī)中能夠達(dá)到同一顯示效果,必須通過軟件進(jìn)行Gamma設(shè)置。 對(duì)于路徑漸變畫刷的Gamma校正,可以通過PathGradientBrush類的“設(shè)置伽馬校正”成員函數(shù)SetGammaCorrection來完成。 默認(rèn)情況下,路徑漸變畫刷的Gamma校正功能是被禁止的。調(diào)用SetGammaCorrection(TRUE);就可以啟動(dòng)Gamma校正。
|
|