GDI+学习及代码总结之------画刷Brush

GDI+入门(二)画刷的使用 二、画刷的使用using System.Drawing;using System.Drawing.Drawing2D;using System.Drawing.Imaging;      public Form1()        {            InitializeComponent();            comboBox1.SelectedInd 阅读详情

画刷Brush

GDI+中定义了五种画刷类型,他们都派生于Brush类,他们分别是:

注意:画刷与画笔不同,画刷只是用来填充区域,所以,画刷无宽度、长度可言。

单色画刷SolidBrush

一、构造函数

[cpp]  view plain copy
  1. SolidBrush greenBrush(Color(255,0,255,0)); //在GDI+中颜色值,没有RGB()构造,只能用Color()构造  
二、所使用的填充函数
[cpp]  view plain copy
  1. graphics.FillClosedCurve();//填充闭合曲线  
  2. graphics.FillEllipse();  //填充椭圆  
  3. graphics.FillPath(); //填充路径  
  4. graphics.FillPie();  //填充扇形  
  5. graphics.FillPolygon(); //填充多边形  
  6. graphics.FillRectangle(); //填充矩形  
  7. graphics.FillRectangles(); //填充矩形集  
  8. graphics.FillRegion(); //填充区域  
对于这些区域填充函数的使用,已经在前面讲过了,大家可以参考《GDI+学习及代码总结之------画线、区域填充、写字》这一篇文章

影线画刷HatchBrush

影线画刷,故名思意,就是用前景色与背景色,根据预定好的横线、竖线及斜线组成的图形,影线画刷用HatchBrush定义,其构造函数为:

[cpp]  view plain copy
  1. HatchBrush::HatchBrush(hatchStyle, foreColor, backColor);//hatchstyle是一个枚举类,枚举了53种风格的影线画刷,forColor:前景色 ,backColor:背景色  
大家看hatchStyle定义:

[cpp]  view plain copy
  1. enum HatchStyle{  
  2.   HatchStyleHorizontal = 0,  
  3.   HatchStyleVertical = 1,  
  4.   HatchStyleForwardDiagonal = 2,  
  5.   HatchStyleBackwardDiagonal = 3,  
  6.   HatchStyleCross = 4,  
  7.   HatchStyleDiagonalCross = 5,  
  8.   HatchStyle05Percent = 6,  
  9.   HatchStyle10Percent = 7,  
  10.   HatchStyle20Percent = 8,  
  11.   HatchStyle25Percent = 9,  
  12.   HatchStyle30Percent = 10,  
  13.   HatchStyle40Percent = 11,  
  14.   HatchStyle50Percent = 12,  
  15.   HatchStyle60Percent = 13,  
  16.   HatchStyle70Percent = 14,  
  17.   HatchStyle75Percent = 15,  
  18.   HatchStyle80Percent = 16,  
  19.   HatchStyle90Percent = 17,  
  20.   HatchStyleLightDownwardDiagonal = 18,  
  21.   HatchStyleLightUpwardDiagonal = 19,  
  22.   HatchStyleDarkDownwardDiagonal = 20,  
  23.   HatchStyleDarkUpwardDiagonal = 21,  
  24.   HatchStyleWideDownwardDiagonal = 22,  
  25.   HatchStyleWideUpwardDiagonal = 23,  
  26.   HatchStyleLightVertical = 24,  
  27.   HatchStyleLightHorizontal = 25,  
  28.   HatchStyleNarrowVertical = 26,  
  29.   HatchStyleNarrowHorizontal = 27,  
  30.   HatchStyleDarkVertical = 28,  
  31.   HatchStyleDarkHorizontal = 29,  
  32.   HatchStyleDashedDownwardDiagonal = 30,  
  33.   HatchStyleDashedUpwardDiagonal = 31,  
  34.   HatchStyleDashedHorizontal = 32,  
  35.   HatchStyleDashedVertical = 33,  
  36.   HatchStyleSmallConfetti = 34,  
  37.   HatchStyleLargeConfetti = 35,  
  38.   HatchStyleZigZag = 36,  
  39.   HatchStyleWave = 37,  
  40.   HatchStyleDiagonalBrick = 38,  
  41.   HatchStyleHorizontalBrick = 39,  
  42.   HatchStyleWeave = 40,  
  43.   HatchStylePlaid = 41,  
  44.   HatchStyleDivot = 42,  
  45.   HatchStyleDottedGrid = 43,  
  46.   HatchStyleDottedDiamond = 44,  
  47.   HatchStyleShingle = 45,  
  48.   HatchStyleTrellis = 46,  
  49.   HatchStyleSphere = 47,  
  50.   HatchStyleSmallGrid = 48,  
  51.   HatchStyleSmallCheckerBoard = 49,  
  52.   HatchStyleLargeCheckerBoard = 50,  
  53.   HatchStyleOutlinedDiamond = 51,  
  54.   HatchStyleSolidDiamond = 52,  
  55.   HatchStyleTotal,  
  56.   HatchStyleLargeGrid = HatchStyleCross,  
  57.   HatchStyleMin = HatchStyleHorizontal,  
  58.   HatchStyleMax = HatchStyleTotal - 1  
  59. };  
这个定义有些长,而且让人搞不懂他们分别对应什么图形,让我们看下面的图像,他们从左至右、从上到下排列,序号分别是0-52,(前景色为:红色,背景色为:绿色),优快云处理的有些失真,大家可以在MSDN上看下这个枚举类,有对应的图形。 微笑

我们简单使用一下影线画刷,用它来填充两个矩形,示例:

[cpp]  view plain copy
  1. Color forColor(255,0,0,0);  
  2. Color bkColor(255,255,0,255);  
  3.   
  4. HatchBrush brush(HatchStyleHorizontal, forColor, bkColor);  
  5. graphics.FillRectangle(&brush, 20, 20, 100, 50);  
  6.   
  7. HatchBrush brush1(HatchStyleVertical, forColor, bkColor);  
  8. graphics.FillRectangle(&brush1, 140, 20, 100, 50);  

影线画刷的单个与整体

从构成上看,影线画刷是小正方形图案的简单重复,单个的正方形图案决定了画刷的整体外观。下图所示为影线画刷的基本构成:


左图所示是影线画刷放大后的基本图案,该图案由前景色和背景色两部分构成。右图,就是由这些个小的基本图案重复而成。上面所枚举的53种图案,都是由它自己的基本图案重复平铺而成。

设置影线画刷的绘制原点

绘制原点,即在什么地方开始绘制,它并不是指相对所要填充的矩形原点的填充位置,而是对基本图案而言的。设置绘制原点的语句为:

[cpp]  view plain copy
  1. Graphics::SetRenderingOrigin(x, y);//X为相对X轴方向的偏移量,Y为相对Y轴方向的偏移量  
如果我们设置这样一条语句,setRenderingOrigin(0,3);会是什么效果呢?看下面讲解;

我们说了,是相对基本图案而言,我们还是3-13的图,

所以,它先从基本图案的纵向偏移3个相素,然后用偏移后的图案开始绘制

示例:(向下偏移4个相素)

[cpp]  view plain copy
  1. HatchBrush hatchBrush(  
  2.                       HatchStyle(52),   
  3.                       Color(255, 255, 0, 0),     // red  
  4.                       Color(255, 0, 255, 255));  // aqua  
  5.   
  6. graphics.FillRectangle(&hatchBrush, 0, 0, 100, 50);//未偏移前  
  7. graphics.SetRenderingOrigin(0,4);  
  8. graphics.FillRectangle(&hatchBrush, 120, 0, 100, 50);//偏移4个相素  

纹理画刷TextureBrush

纹理画刷,与影线画刷类似,也是使用同样的基本图案在水平和垂直方向上按一定的顺序平铺。不同的是,纹理画刷使用的是基本的图像来做基本图案的。

一、构造函数(待完)

[cpp]  view plain copy
  1. TextureBrush(Image* image, Rect& dstRect, ImageAttributes* imageAttributes)   
  2. TextureBrush(Image* image, RectF& dstRect, ImageAttributes* imageAttributes)   
  3. TextureBrush(image, wrapMode)   
  4. TextureBrush(Image* image, WrapMode wrapMode, Rect& dstRect)   
  5. TextureBrush(Image* image, WrapMode wrapMode, RectF& dstRect)   
  6. TextureBrush(Image* image, WrapMode wrapMode, INT dstX, INT dstY, INT dstWidth, INT dstHeight)   
  7. TextureBrush(Image* image, WrapMode wrapMode, REAL dstX, REAL dstY, REAL dstWidth, REAL dstHeight)   
这里不考虑对于ImageAttributes的设置(后面补充),只考虑除第一个外的其它五个构造函数的使用。
参数说明:

image:指定纹理画刷所使用的源图像,但这个图像并不一定是最终用来画图所用的图像,这只是一个源图,dstRect所指定的区域才是最终所使用的绘图单元图案;

dstRect:用于指定图案中用于画刷中的矩形区域。这个区域是从image中裁剪的。注意,它的大小不能超过基本图案的范围,否则,填充不会成功,也会报错。

wrapMode:指定在画刷中如何排列基本图案。

imageAtributes:用于指定基本图案的附加特征参数。

先看下示例:

基本图案:


代码:

[cpp]  view plain copy
  1. RectF rect1(10,10,200,200);  
  2. RectF rect2(210,10,200,200);  
  3. RectF rect3(410,10,200,200);  
  4.   
  5. Image image(L"img.jpg");  
  6.   
  7. TextureBrush tBrush1(&image);  
  8. graphics.FillRectangle(&tBrush1,rect1); //完整图案填充  
  9.   
  10. TextureBrush tBrush2(&image,Rect(10,10,50,50));  
  11. graphics.FillRectangle(&tBrush2,rect2);//从源图截取一部分填充  
  12.   
  13. TextureBrush tBrush3(&image);  
  14. tBrush3.SetTransform(&Matrix(0.5f,0.0f,0.0f,0.5f,0.0f,0.0f));  
  15. graphics.FillRectangle(&tBrush3,rect3);//缩小0。5倍填充  

这里是填充了,效果也出来了,但有个问题,这里可能大家不会发现,因为图像太乱了,我们单独出一个示例,

代码:

[cpp]  view plain copy
  1. Image image(L"img.jpg");  
  2. UINT X=image.GetWidth();  
  3. UINT Y=image.GetHeight();  
  4. RectF rect(20,230,image.GetWidth(),image.GetHeight());  
  5. TextureBrush tBrush(&image);  
  6. graphics.FillRectangle(&tBrush,rect);  

大家有没有看出问题来,我这里构造了一个矩形,矩形的大小与图像的一样,按说,它的填充效果,应该是图片正好将整个框填满,但事实上,原图左边却少了一块,右边却多出一块来,好像是向右移了20个相素似的,如果我们把

[cpp]  view plain copy
  1. RectF rect(20,230,image.GetWidth(),image.GetHeight());  

改成

[cpp]  view plain copy
  1. RectF rect(0,230,image.GetWidth(),image.GetHeight());  
会怎样呢?

看效果图:


到这大家可能就清楚了,画刷是先把图像从原点(0,0)平铺,然后在要显示的位置截取这一块,显示出来,并不是以要显示的区域的原点为平铺原点的!!!!

二、平铺方式

WrapMode枚举了五种平铺方式;

[cpp]  view plain copy
  1. enum WrapMode{  
  2.   WrapModeTile,  //普通平铺  
  3.   WrapModeTileFlipX,  //水平方向翻转并平铺  
  4.   WrapModeTileFlipY,  //垂直方向翻转并平铺  
  5.   WrapModeTileFlipXY,  //在水平和垂直方向都翻转并平铺,它是WrapModeTileFlipX与WrapModeTileFlipY效果的组合  
  6.   WrapModeClamp  //不进行平铺,只在以(0,0)位置为原点显示一张图片  
  7. };  
示例:

[cpp]  view plain copy
  1. Image image(L"img.jpg");  
  2.   
  3. TextureBrush tBrush1(&image,WrapModeClamp);//不进行平铺  
  4. graphics.FillRectangle(&tBrush1,Rect(0,0,170,200));  
  5.   
  6. TextureBrush tBrush2(&image,WrapModeTile);  //平铺  
  7. graphics.FillRectangle(&tBrush2,Rect(220,0,170,200));  
  8.   
  9. TextureBrush tBrush3(&image,WrapModeTileFlipX);  //水平方向翻转并平铺  
  10. graphics.FillRectangle(&tBrush3,Rect(430,0,170,200));  
  11.   
  12. TextureBrush tBrush4(&image,WrapModeTileFlipY);  //垂直方向翻转并平铺  
  13. graphics.FillRectangle(&tBrush4,Rect(640,0,170,200));  
  14.   
  15. TextureBrush tBrush5(&image,WrapModeTileFlipXY); //在水平和垂直方向都翻转并平铺,它是WrapModeTileFlipX与WrapModeTileFlipY效果的组合  
  16. graphics.FillRectangle(&tBrush5,Rect(850,0,170,200));  

三、画刷变换

纹理画刷的变换分为三种:旋转变换(RotateTransform)、缩放变换(ScaleTransform)和平移变换(TranslateTransform)。基本上与画笔的变换差不多,旋转变换,是将基本图案向左或向右旋转N度;缩放变换是将基本图案放大或缩小;平移变换容易让人迷,它是在绘图原点(0,0)向左移动、向右和向上、向下平移后,再进行平铺。

三种旋转方式的参数代码为:

[cpp]  view plain copy
  1. TextureBrush::RotateTransform(angle, order) //旋转变换,angle为度数,order指定向左还是向右转  
  2. TextureBrush::ScaleTransform(sx, sy, order) //缩放变换,sx为水平放大的倍数,1为不变;sy为垂直放大的倍数,同样,1为不变,不能设为0  
  3. TextureBrush::TranslateTransform(dx, dy, order) //平移变换,dx,dy分别指定沿X轴,沿Y轴平移的相素数,order是指向左平移还是向右平移  
示例:

[cpp]  view plain copy
  1. Image img(L"img.jpg");  
  2. TextureBrush tBrush(&img);  
  3. //原图  
  4. tBrush.ResetTransform();  
  5. graphics.FillRectangle(&tBrush,RectF(0,228,img.GetWidth(),img.GetHeight()));  
  6. //相对绘制原点平移,这里相对的是(0,0)点  
  7. tBrush.TranslateTransform(30,0,MatrixOrderPrepend);  
  8. graphics.FillRectangle(&tBrush,RectF(0,10,200,200));  
  9. //旋转  
  10. tBrush.RotateTransform(60,MatrixOrderAppend);//原本是MatrixOrderAppend是向右转,MatrixOrderPrepend是向左转,但这里设置了后并没有用,两个全都向右转了,说明API有问题  
  11. graphics.FillRectangle(&tBrush,RectF(220,10,200,200));  
  12. //放大缩小  
  13. tBrush.ResetTransform();  
  14. tBrush.ScaleTransform(2,1);//水平放大两倍  
  15. graphics.FillRectangle(&tBrush,RectF(430,10,200,200));  

线性渐变画刷(LinearGradientBrush))

一、构造方法

线性渐变画刷有两种构造方式,两点构造和两条直线构造(矩形构造)

[cpp]  view plain copy
  1. LinearGradientBrush(Point& point1, Point& point2, Color& color1, Color& color2) ;  
  2. LinearGradientBrush(PointF& point1, PointF& point2, Color& color1, Color& color2) ;//两点构造  
  3. LinearGradientBrush(Rect& rect, Color& color1, Color& color2, REAL angle, BOOL isAngleScalable) ;  
  4. LinearGradientBrush(RectF& rect, Color& color1, Color& color2, REAL angle, BOOL isAngleScalable) ;  
  5. LinearGradientBrush(Rect& rect, Color& color1, Color& color2, LinearGradientMode mode) ;  
  6. LinearGradientBrush(RectF& rect, Color& color1, Color& color2, LinearGradientMode mode) ;//矩形构造  
前两个是两点构造,后四个是矩形构造,这里分别讲解。

(一)两点构造

使用两个点来定义色彩渐变区域时,只需用直线两个点连接起来即可,所有与这条连线平等的直线就构成渐变区域,这些直线中的任一条在外观上都是相同的,并且,每条直线色彩的变化反映着整个区域的色彩渐变。如图所示,为使用两个点定义的渐变区域的效果图。


1、构造函数:

[cpp]  view plain copy
  1. LinearGradientBrush(Point& point1, Point& point2, Color& color1, Color& color2) ;  
  2. LinearGradientBrush(PointF& point1, PointF& point2, Color& color1, Color& color2) ;  
示例:

[cpp]  view plain copy
  1. LinearGradientBrush lgBrush1(PointF(0,0),PointF(40,0),Color(255,255,0,0),Color(255,0,0,255));//水平渐变  
  2. LinearGradientBrush lgBrush2(PointF(0,0),PointF(40,40),Color(255,0,255,0),Color(255,255,255,0));//斜向渐变  
  3.   
  4. graphics.FillRectangle(&lgBrush1,0,0,200,200);  
  5. graphics.FillRectangle(&lgBrush2,240,0,200,200);  


2、平铺方式

设置平铺方式的函数:

[cpp]  view plain copy
  1. LinearGradientBrush::SetWrapMode(wrapMode);//wrapMode是个枚举类,包括:  
  2. //WrapModeTile,WrapModeTileFlipXWrapModeTileFlipY,WrapModeTileFlipXY,WrapModeClamp  
  3. //WrapModeClamp不能在这里使用。原因见下面的注意讲解  

与TextureBrush类似,TextureBrush类的成员函数SetWrapMode可设置平铺方式,图片可以使用水平翻转、垂直翻转或水平垂直叠加翻转方式在目标区域中平铺显示。其实我们的线性渐变画刷在目标区域中也可以这样控制填充方式。

我们可以把线性渐变画刷定义的区域(两点间的连线区域)看成一个单独的基本图案。对线性渐变画刷的填充方式进行控件,也就相当于在纹理画刷中对基本图案排列方式进行控制,是一样的。

示例:

[cpp]  view plain copy
  1. LinearGradientBrush lgBrush2(PointF(0,0),PointF(40,40),Color(255,0,255,0),Color(255,255,255,0));//斜向渐变  
  2. //普通平铺  
  3. lgBrush2.SetWrapMode(WrapModeTile);//默认  
  4. graphics.FillRectangle(&lgBrush2,RectF(0,0,200,200));  
  5. //水平方向翻转并平铺    
  6. lgBrush2.SetWrapMode(WrapModeTileFlipX);  
  7. graphics.SetRenderingOrigin(210,0);//设置绘画原点,默认是从(0,0)开始  
  8. graphics.FillRectangle(&lgBrush2,RectF(210,0,200,200));  
  9. //垂直方向翻转并平铺    
  10. lgBrush2.SetWrapMode(WrapModeTileFlipY);  
  11. graphics.SetRenderingOrigin(420,0);  
  12. graphics.FillRectangle(&lgBrush2,RectF(420,0,200,200));  
  13. //在水平和垂直方向都翻转并平铺,它是WrapModeTileFlipX与WrapModeTileFlipY效果的组合    
  14. lgBrush2.SetWrapMode(WrapModeTileFlipXY);  
  15. graphics.SetRenderingOrigin(630,0);  
  16. graphics.FillRectangle(&lgBrush2,RectF(630,0,200,200));  

注意:需要强调的是,在纹理画刷中使用的WrapModeClamp图片翻转方式,并不能在线性渐变画刷中使用,主要原因是因为纹理画刷和图片是有固定大小的,而线性渐变画刷没有大小,在绘图平面中也无法独立放置。

(二)矩形构造

线性渐变画刷的渐变区域可以通过两条平行的直线来定义。如图所示为使用平行线定义渐变区域的效果图。


假设如图所示的线条1是红色的,线条2是蓝色的,在线条1与线条2之间的区域就是一个从红色到蓝色的渐变区域。使用这种方式定义渐变区域有一个特点,就是在渐变区域中任一与定义区域的直线相平行的直线的色彩都是由一种色彩构成,单条直线的色彩不存在渐变。

构造函数

[cpp]  view plain copy
  1. LinearGradientBrush(Rect& rect, Color& color1, Color& color2, LinearGradientMode mode)   
  2. LinearGradientBrush(RectF& rect, Color& color1, Color& color2, LinearGradientMode mode)   
  3. LinearGradientBrush(Rect& rect, Color& color1, Color& color2, REAL angle, BOOL isAngleScalable)   
  4. LinearGradientBrush(RectF& rect, Color& color1, Color& color2, REAL angle, BOOL isAngleScalable)   
前两个通过指定矩形的大小的色彩及填充方式来定义画笔。

后两个更自由,可以通过指定填充角度来指定色彩的渐变方向。

前两个构造函数中有一个参数LinearGradientMode,这是个枚举类,定义了色彩有渐变方向;

[cpp]  view plain copy
  1. enum LinearGradientMode{  
  2.   LinearGradientModeHorizontal = 0,//水平渐变  
  3.   LinearGradientModeVertical   = 1, //垂直渐变  
  4.   LinearGradientModeForwardDiagonal  = 2,//从左上角到右下角渐变(矩形对角线方向)  
  5.   LinearGradientModeBackwardDiagonal = 3//从右上角到左下角渐变(另一条矩形对角线方向)  
  6. };  
前两个构造函数示例:

[cpp]  view plain copy
  1. LinearGradientBrush lgBrush1(RectF(0,0,40,20),Color(255,0,255,0),Color(255,0,255,255),LinearGradientModeHorizontal);  
  2. graphics.FillRectangle(&lgBrush1,RectF(0,0,200,200));  
  3.   
  4. LinearGradientBrush lgBrush2(RectF(0,0,40,20),Color(255,0,255,0),Color(255,0,255,255),LinearGradientModeVertical);  
  5. graphics.SetRenderingOrigin(210,0);  
  6. graphics.FillRectangle(&lgBrush2,RectF(210,0,200,200));  
  7.   
  8. LinearGradientBrush lgBrush3(RectF(0,0,40,20),Color(255,0,255,0),Color(255,0,255,255),LinearGradientModeForwardDiagonal);  
  9. graphics.SetRenderingOrigin(420,0);  
  10. graphics.FillRectangle(&lgBrush3,RectF(420,0,200,200));  
  11.   
  12. LinearGradientBrush lgBrush4(RectF(0,0,40,20),Color(255,0,255,0),Color(255,0,255,255),LinearGradientModeBackwardDiagonal);  
  13. graphics.SetRenderingOrigin(630,0);  
  14. graphics.FillRectangle(&lgBrush4,RectF(630,0,200,200));  

后两个的示例(指定填充方向,相当于旋转度数):

[cpp]  view plain copy
  1. //不旋转  
  2. LinearGradientBrush lgBrush1(RectF(0,0,40,20),Color(255,0,255,0),Color(255,0,255,255),0.0f);  
  3. graphics.FillRectangle(&lgBrush1,RectF(0,0,200,200));  
  4. //旋转30度  
  5. LinearGradientBrush lgBrush2(RectF(0,0,40,20),Color(255,0,255,0),Color(255,0,255,255),30.0f);  
  6. graphics.SetRenderingOrigin(210,0);  
  7. graphics.FillRectangle(&lgBrush2,RectF(210,0,200,200));  
  8. //旋转60度  
  9. LinearGradientBrush lgBrush3(RectF(0,0,40,20),Color(255,0,255,0),Color(255,0,255,255),60.0f);  
  10. graphics.SetRenderingOrigin(420,0);  
  11. graphics.FillRectangle(&lgBrush3,RectF(420,0,200,200));  
  12. //旋转90度  
  13. LinearGradientBrush lgBrush4(RectF(0,0,40,20),Color(255,0,255,0),Color(255,0,255,255),90.0f);  
  14. graphics.SetRenderingOrigin(630,0);  
  15. graphics.FillRectangle(&lgBrush4,RectF(630,0,200,200));  

二、多色渐变

线性渐变画刷的多色渐变是指在画刷的起点、终点两种色彩的渐变过程中加入了其它色彩作为变化的过渡色,这种过渡色有时又称为插值色(Interpolation color) 。如图所示为一个“红-》绿-》蓝”3色渐变画刷的填充效果图。


注意,60这个位置,叫做混合位置,也叫插入位置,它在整个渐变区域的1/3位置,这个1/3我们以后会用到的,这里大家先注意一下;

实现多色渐变画刷的过程是,指明参与渐变的每一个过渡色彩值,然后指定每一个色彩值的插入位置。GDI+中实现多色渐变画刷是通过函数SetInterpolationColors实现的,定义如下:

[cpp]  view plain copy
  1. Status SetInterpolationColors(  
  2.   const Color* presetColors,//一个包含多种预定义过渡色的数组。  
  3.   const REAL* blendPositions,//下面具体讲解  
  4.   INT count//过渡色的个数  
  5. );  
blendPositions:包含色彩合成位置的数组。在GDI+中,合成位置是用百分比表示的,即从起点到时合成位置的长度占整个区域的百分比。 该数组的第一个和最后一个位置必须是0%和100%, 分别代表起止点色彩的位置,否则定义出的渐变画刷是不能正常工作的,所以这里的色彩就把定义画刷时我渐变色彩给替代了,也就是如果用了插入色彩来进行多色渐变,定义画刷时色彩就没用了。

示例(三色渐变):

[cpp]  view plain copy
  1. Color colors[] = {  
  2.     Color(255, 255, 0, 0),   // red  
  3.     Color(255, 0, 0, 255),   // blue  
  4.     Color(255, 0, 255, 0)};  // green  
  5.   
  6.     REAL positions[] = {  
  7.         0.0f,   // 红色位置,必须是0  
  8.         0.3f,   // 蓝色在30%位置  
  9.         1.0f};  //绿色在右边界,必须是1,看上面的blendPositions说明  
  10. //注意,这里原定义的是黑色到白色的渐变,上面插入的颜色将他们替换掉了。  
  11.         LinearGradientBrush linGrBrush(Point(0, 0), Point(200, 0),  
  12.             Color(255, 0, 0, 0),         // 黑色  
  13.             Color(255, 255, 255, 255));  // 白色  
  14.   
  15.     linGrBrush.SetInterpolationColors(colors, positions, 3);  
  16.     graphics.FillRectangle(&linGrBrush, 0, 0, 400, 250);  

三、定制线性渐变画刷的色彩渐变行为

对于双色渐变画刷,默认情况下,其色彩的渐变是沿着水平方向逐渐进行的,两种色彩的差异在渐变区域的中央部分达到最小(最模糊)。线性渐变画刷引入了“合成因子”(Blend Factors)这个概念来量化“彩色差异最小”这个模糊的概念。简单地说,合成因子以百分比的形式代表色彩渐变的度。GDI+中全成因子的默认值为100%,表示色彩完全转换。任何使用小于100%的合成因子值进行的渐变,被渐变的色彩都会不完全地转换成第2种颜色。如果将该值设置成0,这意味着色彩将不进行渐变。对于双色渐变画刷,合成因子代表的终点色的转变程序,0表示不转变成终点色,1表示全部转变成终点色;对于多色渐变画刷,合成因子代表着每一个参与渐变的过渡色的渐变程度。

使用SetBlend函数可以改变默认的色彩渐变行为,该函数的定义为:

[cpp]  view plain copy
  1. Status SetBlend(  
  2.   const REAL* blendFactors,  
  3.   const REAL* blendPositions,  
  4.   INT count  
  5. );  
blendFactiors:包含合成因子的数组,每一个数组成员的取值范围为0-1,0表示不转变成终点色,1表示完全转变成终点色。

blendPosition:包含合成位置的数组,每一个数组成员依次代表着参与渐变的过渡色的合成位置。注意:该数组的第一个和最后一个变量代表了起止点色彩的合成位置,这两个值必须是0%和100%。

count:合成点位置数。与blendPosition数组大小一致。

SetBlend函数功能在于告诉GDI+在什么地方进行了色彩合成,色彩的合成度是多少。

看例子:

[cpp]  view plain copy
  1. REAL factors[4]={0.0f,0.9f,0.3f,0.0f};  
  2. REAL position[4]={0.0f,0.1f,0.6f,1.0f};  
  3.   
  4. RectF rect(0,0,200,200);  
  5. LinearGradientBrush lgbrush(rect,Color::Red,Color::Green,LinearGradientModeHorizontal);  
  6.   
  7. lgbrush.SetBlend(factors,position,4);  
  8. graphics.FillRectangle(&lgbrush,rect);  

说明:positions变量指明了色彩渐变在4个相对的位置进行,factors具体指明了在每个相对位置进行渐变的合成因子。factors的第一个成员值是0.0f,表示绿色不参与渐变,所以在第一个位置全部是红色,形成红色光带。在第2个位置的合成因子是0.9f,表示该位置90%显示绿色,10%显示红色,进行色彩合成,所以基本保持了绿色原貌,所以形成绿色光带;在第3个位置的合成因子是0.3f,表示蓝色以30%的程度叠加上70%的红色,形成该部位的颜色值,红色成了主色,所以红色光带再次形成。最后位置的合成因子为0,所以根第一个位置一样,全部显示为红色。 需要再次强调的是:对于双色画刷,合成因子是终点色相对于起点色的渐变程度。

四、改变合成位置

在双色渐变中,我们可以通过上面的SetBlend()来定制画刷的渐变形为,这种方法比较简单易用,我们还有另一种方法来定制画刷的渐变形为,但并没有上面的SetBlend()强大,只能改变最终色的合成位置,在默认情况下,最终色的合成位置在最右边(比例位置为1.0),我们可以通过函数改变它的位置,让他在指定位置合成。

改变最终色合成位置的函数如下:

[cpp]  view plain copy
  1. LinearGradientBrush::SetBlendTriangularShape(focus, scale);//基于三角形的渐变  
  2. LinearGradientBrush::SetBlendBellShape(focus, scale);//基于钟型曲线的渐变  
这两种方法都能实现合成位置的改变,而且实现的效果上不会有太大差异,一般选中哪个都可以。

示例:

[cpp]  view plain copy
  1. RectF rect(0,0,200,200);  
  2. LinearGradientBrush lgbrush(rect,Color::Red,Color::Green,LinearGradientModeHorizontal);  
  3. LinearGradientBrush lgbrush2(rect,Color::Red,Color::Green,LinearGradientModeHorizontal);  
  4. //使用三角形渐变  
  5. lgbrush.SetBlendTriangularShape(0.1f,0.8);  
  6. lgbrush2.SetBlendBellShape(0.1,0.8);  
  7. //使用钟形渐变  
  8. graphics.FillRectangle(&lgbrush,rect);  
  9. graphics.FillRectangle(&lgbrush2,RectF(0,210,200,200)  

说明:从效果图上可以看出,最终色的合成位置被移到了0.1处,从效果来看,钟形曲线渐变效果更平滑一些。

路径渐变画刷(GraphicsPath)--未学

暂时用不到,先不学习,待以后用到的时候再学吧,嘿嘿


WIN32 GDI+ 学习笔记(三):使用画刷(I) gdi+中的brush对象是用来填充一个封闭形状的内部,而且brush对象分为以下四种: 1.实心画刷 2.渐变画刷 3.阴影画刷 4.贴图画刷 (参考MSDN) 1.实心画刷(SolidBrush) 首先我们需要一个SolidBrush对象,其构造函数为SolideBrush(Color& color),所以我们只需要指定一种颜色就行了 例如: SolidBrush b 阅读详情

相关推荐

winform自定义控件(gdi+)(9)——Brush类的用法

顶顶顶顶

qq_34059233的博客 2697

GDI+ 中 Brush 使用总结

GDI+ 中 Brush 使用总结

编程猿来如此 916

【愚公系列】2023年10月 GDI+绘图专题 图形图像编程基础

GDI+是微软在Windows 2000以后操作系统中提供的新的图形设备接口,其通过一套部署为托管代码的类来展现,这套类被称为GDI+的“托管类接口”,GDI+主要提供了以下三类服务:(1) 二维矢量图形:GDI+提供了存储图形基元自身信息的类(或结构体)、存储图形基元绘制方式信息的类以及实际进行绘制的类。(2) 图像处理:大多数图片都难以划定为直线和曲线的集合,无法使用二维矢量图形方式进行处理。

愚公智库 3万+

GDI+ 路径 - Create、FillPath、DrawPath

unit Unit1; interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormPaint(Sender: TObject); end; var Form1: TF...

java开发指南博客 【转载】 735

GDI+中画刷和笔的高级应用

本文深入探讨了GDI+中画刷和笔的高级应用,包括如何使用颜色对话框选择颜色,创建线性和路径渐变画刷,以及如何创建和配置GDI+中的笔。文章还详细介绍了如何通过编程方式设置画刷和笔的属性,以实现复杂的图形效果。

weixin_35906794的博客 349

kettle从入门到精通 第九十二课 ETL之kettle 使用Kettle的Carte对外发布读写接口

场景:使用kettle实现将查询结果返回给客户端,也就是说kettle暴露查询接口供外围系统调用。前提必须是使用carte服务才可以提供接口供外部系统调用。具体实操方法如下:1、设计转换根据具体需求设计转换,主要用到的步骤有获取变量(从请求参数中获取变量)、json输入(解析入参),json 输出将结果转换为json格式输出到客户端。如下图所示:2、接收参数使用获取变量步骤来接收接口请求参数,变量通过${}方法进行获取,如下图${PARAM}则是获取PARAM参数,将参数赋值为req字段。

zhangjin1222的博客 954

【GDI+】GDI+学习及代码总结之------画刷Brush

画刷Brush GDI+中定义了五种画刷类型,他们都派生于Brush类,他们分别是: 注意:画刷与画笔不同,画刷只是用来填充区域,所以,画刷无宽度、长度可言。 单色画刷SolidBrush 一、构造函数 [cpp]  view plain copy So...

kevin的博客 1375

内网开发必备:银河麒麟V10离线安装全流程(含镜像挂载+yum源配置)

本文详细介绍了在内网隔离环境下,银河麒麟V10操作系统的离线安装与部署全流程。核心内容包括官方镜像的获取与校验、使用mount命令进行镜像挂载的详细步骤与问题排查,以及构建稳定、可维护的本地Yum软件仓库的完整方法论。通过实战案例演示了如何基于本地源部署LNMP环境,并提供了高级配置技巧与常见故障排除指南,旨在帮助运维人员系统性地构建高可用的内网软件供应链。

weixin_29268637的博客 560

GDI+学习及代码总结之------画刷Brush .

画刷Brush GDI+中定义了五种画刷类型,他们都派生于Brush类,他们分别是: 注意:画刷与画笔不同,画刷只是用来填充区域,所以,画刷无宽度、长度可言。 单色画刷SolidBrush 一、构造函数 [cpp] view plaincopy SolidBrush greenBrush(Color(2

mao_mao37的博客 1784

【信道编码/Channel Coding】线性分组码

这是本专栏信道编码/Channel Coding的第二站,想对信道编码有一个系统性的认识可以看本专栏的信道编码的整体框架一文。而在本篇文章中,将介绍线性分组码的基本原理。

Tomatomatodo的博客 9243

机器学习预测材料性能:从特征工程到SHAP可解释性分析

机器学习在材料科学中的应用,核心在于将复杂的材料性能预测问题转化为数据驱动的建模任务。其基本原理是通过算法从历史数据中学习特征与目标属性之间的映射关系。这项技术的价值在于能够大幅加速新材料的发现与设计周期,降低传统“试错法”的高昂成本。在工程实践中,它广泛应用于预测如形成能、带隙、弹性模量以及居里温度等关键材料性能。具体到磁性材料领域,居里温度的准确预测对于永磁体和自旋电子器件设计至关重要。本项目深入探讨了如何利用特征工程从材料成分与结构中构建有效描述符,并借助SHAP这一可解释性工具,揭示模型决策背后的物

weixin_27155667的博客 650

【学习笔记】Windows GDI绘图(八)画笔Pen与画刷Brush

详细示例Pen与Brush的属性与方法

图南堂 1562

运放+三极管恒流源电路设计实战:从原理到仿真一步到位(附Multisim文件)

本文详细解析了运放与三极管构建恒流源电路的核心原理,重点阐述了负反馈机制如何实现精准的电流控制。通过Multisim仿真实战,从电路搭建、参数计算到负载调整率与动态响应分析,一步步指导设计过程,并提供常见故障的调试技巧与PCB设计要点,帮助工程师从理论平稳过渡到可靠实践。

7z8x2c4v6b9的博客 711

GDI+学习笔记(六)渐变画刷

本节讲述了VC++怎样使用GDI+渐进画刷(线性渐进和路径渐进)。

2108

从入门到精通:Cursor使用全攻略

Cursor是一款基于VSCode深度定制的AI编程工具,由Anysphere公司开发。它将AI技术与代码开发深度融合,能够理解自然语言指令并生成高质量代码,支持代码补全、跨文件上下文理解等功能。本文详细介绍了Cursor的安装设置、界面导航、基本操作和Composer模式等核心功能,并提供了高效提示词写作技巧和实际应用案例(如浏览器插件开发、复杂表单组件构建等)。文章还总结了使用注意事项和常见问题解决方案,展望了AI编程工具的发展前景。Cursor通过智能代码生成和项目理解能力,显著提升了开发效率,适合各

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 6457

RAP BDL 里的 field ( readonly ) 到底控制了什么?——从语法到运行时的全景解析

RAP行为定义中的只读字段控制 摘要:该代码片段展示的是RAP(ABAP RESTful Application Programming)行为定义语言(BDL)中的字段控制语法,用于声明业务对象中需由框架自动维护的只读字段。field ( readonly )语句将订单ID和审计字段(CreatedBy/CreatedAt等)标记为只读,确保这些字段在更新阶段不可修改。在managed场景下,RAP框架会自动处理这些行政性数据的写入:创建时填充创建信息,更新时刷新变更记录,并利用LocalLastChang

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 154

GDI+学习记录(8)- 画刷 Brush简介

画刷是用来填充区域的,在GDI+ 中,画刷分为五种: 单色画刷,也叫固体画刷(SolidBrush), 影线画刷(HatchBrush),纹理画刷(TextureBrush),线型渐变画刷(LinearGradientBrush),路径渐变画刷(PathGradientBrush)。这五种画刷全部都是由其共同的基类 Brush 类派生而来的,与画笔笔筒,画刷是用来填充区域的,所以画刷是没有宽度和...

bluecard2008的博客 981

由于找不到mfc110u.dll,无法继续执行代码,重新安装程序可能会解决此问题的 解决方案

本文主要介绍了由于找不到mfc110.dll,无法继续执行代码的解决方案,希望能对使用Windows的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 5万+

(转载)GDI+画刷Brush

原文地址:http://blog.youkuaiyun.com/harvic880925/article/details/9071795 画刷Brush GDI+中定义了五种画刷类型,他们都派生于Brush类,他们分别是: 注意:画刷与画笔不同,画刷只是用来填充区域,所以,画刷无宽度、长度可言。 单色画刷SolidBrush 一、构造函数      SolidBrush g

_Tucci 928

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

第5章,[Win32 章节] :绘制填充区域

Windows 程序设计

2401_82825368的博客 759

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

win32 学习笔记(九)画笔和画刷(了解,不继续学)

绘图基础: 绘图设备DC(Device Context),绘图上下文/绘图描述表 HDC-DC句柄,表示绘图设备 GDI-Windows graphics device interface(Win32 提供的绘图API) 颜色:计算机使用红、绿、蓝, R - 0 ~ 255 G - 0 ~ 255 B - 0 ~ 255 每一个点颜色是三个字节24位保存0-2^24-1 16位:5,5,6 32位:8, 8, 8, 8绘图或透明度。 HDC hdc = BeginPaint(hWnd...); Tex.

qq1003735377的博客 1555

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C#学习笔记:GDI图形高级编程(2)——关于Brush类

本文主要是探讨C#在GDI绘图高级编程中用到的Brush类、SolidBrush类、TextureBrush类、LinearGradientBrush类、PathGradientBrush类、HatchBrush类的用法

qq_28249373的博客 5915

GDI的一些很方便的代码

自己有点孤陋寡闻!!!!!!!!!!!! 改变画笔颜色和画刷颜色很方便 ms-help://MS.MSDNQTR.v90.en/gdi/devcons_34qa.htm Setting the Pen or Brush Color The following example shows how an application can change the DC pen col

cay22的专栏 1239
上一篇: WIN32界面开发之DUI雏形开发(二)
下一篇: 爱因斯坦72法则
htt9931
博客等级 码龄24年 43粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值