小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Gdiplus學(xué)習(xí)2——畫筆與畫刷

 預(yù)見未來的我 2017-10-15

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)行查詢。

     
     <4>、線性漸變畫刷(LinearGradientBrush)

      線性漸變畫刷的“漸變”體現(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);

     
      路徑漸變畫刷對(duì)目標(biāo)區(qū)域的填充有一個(gè)特點(diǎn),在畫刷漸變區(qū)域之外的部分,畫刷在這些區(qū)域不會(huì)進(jìn)行填充,也就是說在填充的路徑之外畫刷是透明的,因此這些透明間隙可以用另一種或幾種畫刷繼續(xù)填充,這樣就會(huì)達(dá)到意想不到的效果。

      **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校正。

     

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多