《GDI+学习及代码总结之-----画笔.docx》由会员分享,可在线阅读,更多相关《GDI+学习及代码总结之-----画笔.docx(14页珍藏版)》请在金锄头文库上搜索。
1、GDI+学习及代码总结之-画笔画笔一、构造函数画笔有两个构造函数,分别看下:Pen( const Color& color, REAL width);Pen( const Brush* brush, REAL width);注意:第一个构造函数:从一个颜色构造一个单色画笔,平时用的比较多 第二个构造函数要特别注意,它可以从一个画刷构造一个画笔,当画刷是纯色时,构造的也是纯色画笔,这与第一个构造函数效果相同,但画刷并不一定都是纯色的,如果是纹理画刷的话,构造出来的画笔会是什么样呢,我们看看例子:(同样用力宏哥哥的照片)Image image(Limg.bmp);TextureBrush tBru
2、sh(&image);Pen pen(&tBrush,40);/在三个不同区域画椭圆,看实现效果/试探在同一张图中画椭圆会怎样graphics.DrawEllipse(&pen,100,20,200,100);graphics.DrawEllipse(&pen,20,150,200,100);/试探超出会怎样graphics.DrawEllipse(&pen,400,20,200,100);/水平超出graphics.DrawEllipse(&pen,20,450,200,100);/垂直超出王力宏的照片:程序运行效果:从运行结果上可以看出,背景图会在绘制区域横向和纵向平铺,然后根据画笔的位置
3、,将其显示!二、设置画笔样式-Pen:SetDashStyle(dashStyle)DashStyle定义了下面几种线型:enum DashStyle DashStyleSolid = 0, /实线 DashStyleDash = 1, /虚线 DashStyleDot = 2, /点线 DashStyleDashDot = 3, /点划线 DashStyleDashDotDot = 4, /双点划线 DashStyleCustom = 5 /自定义线型;示例:Pen pen(Color(255, 0, 0, 255), 15);pen.SetDashStyle(DashStyleDash);
4、/虚线graphics.DrawLine(&pen, 0, 50, 400, 150);pen.SetDashStyle(DashStyleDot);/点线graphics.DrawLine(&pen, 0, 80, 400, 180); pen.SetDashStyle(DashStyleDashDot);/点划线graphics.DrawLine(&pen, 0, 110, 400, 210); 三、自定义画笔样式-Pen:SetDashPattern(dashArray, count)Pen类的成员函数SetDashPattern(设置线型风格)可以使用一个预定义的数组来描述画笔的虚实,
5、这个数组的格式为:画线部分长度,间隔部分长度,画线部分长度,间隔部分长度数组的大小由开发者自定义,画笔会按照自定义的格式循环画线例子:/定义线型数组REAL dashVals4 = 5.0f, /线长5个像素 2.0f, /间隔2个像素 15.0f, /线长15个像素 4.0f; /间隔4个像素 Pen pen(Color(255, 0, 0, 0), 5); /设置线型 pen.SetDashPattern(dashVals, 4); graphics.DrawLine(&pen, 5, 20, 405, 200); 四、设置画笔对齐方式-Pen:SetAlignment(penAlignm
6、ent)penAlignment枚举了两种对齐方式:enum PenAlignment PenAlignmentCenter = 0,/居中对齐,默认 PenAlignmentInset = 1,/嵌入方式;例子:Pen greenPen(Color(255, 0, 255, 0), 15);Pen BorderPen(Color(100,0,0,0),1);/透明度设为100/ 设置成嵌入式greenPen.SetAlignment(PenAlignmentInset);graphics.DrawEllipse(&greenPen, 10,20, 100, 200);graphics.Dra
7、wRectangle(&BorderPen,10,20,100,200);/设置成居中greenPen.SetAlignment(PenAlignmentCenter );graphics.DrawEllipse(&greenPen, 130, 20, 100, 200);graphics.DrawRectangle(&BorderPen,130,20,100,200);五、画笔的缩放与旋转(待完)注意,这是对画笔的缩放与旋转,在画笔缩放或旋转后,用这个画笔画的图像都是缩放/旋转的,这里并不是对图像缩放/旋转,这点一定要清楚。缩放几个缩放函数:Pen:ScaleTransform(sx, sy
8、, order)/方法一,sx指定水平缩放倍数,sy指定纵向缩放倍数Pen:SetTransform(matrix)/方法二,Pen:MultiplyTransform(matrix, order)/方法三,Pen:ResetTransform() /重置缩放参数,即把缩放参数全部去掉,还原到原来的1:1状态后面两个函数还不会用,方法一比较简单,举个例子吧:/缩放一-ScaleTransform/放大之前画个图,放大之后再画个图,对比一下Pen pen(Color(255, 0, 0, 255), 2);graphics.DrawRectangle(&pen, 50, 50, 150, 100
9、);/ 水平放大8倍,垂直放大4倍pen.ScaleTransform(8, 4);graphics.DrawRectangle(&pen, 250, 50, 150, 100);关于重置Pen:ResetTransform(),贴段代码吧Pen pen(Color(255, 0, 0, 255), 2);/ 水平放大8倍,垂直放大4倍pen.ScaleTransform(8, 4);graphics.DrawRectangle(&pen, 250, 50, 150, 100);pen.ResetTransform();graphics.DrawRectangle(&pen, 450, 50,
10、 150, 100);旋转旋转函数:Pen:RotateTransform(angle, order)/第一个参数表示旋转度数,第二个参数表示往左旋转还是往右旋转例子:/画笔要旋转,粗细要大于1,否则应用旋转函数不会成功Pen pen(Color:Green,5);pen.ScaleTransform(1,6);graphics.DrawEllipse(&pen,20,20,100,100);/往右旋转60度pen.RotateTransform(60,MatrixOrderAppend );graphics.DrawEllipse(&pen,150,20,100,100);/再往右旋转60度
11、,也就是相对于原来的旋转了120度pen.RotateTransform(60,MatrixOrderAppend );graphics.DrawEllipse(&pen,300,20,100,100);/注意:RotateTransform按说设置成MatrixOrderPrepend会往左旋转,但我设置成它之后,总是不成功的,不知为什么六、设置系统线帽“线帽”,顾名思义,就是线条首尾的外观,默认情况下,使用画笔绘制的直线,其起点和结束点的外观都是相同的方形。在程序设计中,我们可以对这两个端点的外观进行修改。对于起点,可以使用SetStartCap,对于终点,可以使用SetEndCap来完成
12、。看这两个函数:Pen:SetStartCap(startCap)/设置起点线帽Pen:SetEndCap(endCap)/设置终点线帽线帽是由LineCap枚举列出的。LineCap定义如下:enum LineCap LineCapFlat = 0, LineCapSquare = 1, LineCapRound = 2, LineCapTriangle = 3, LineCapNoAnchor = 0x10, LineCapSquareAnchor = 0x11, LineCapRoundAnchor = 0x12, LineCapDiamondAnchor = 0x13, LineCap
13、ArrowAnchor = 0x14, LineCapCustom = 0xff;对于它们各是什么线帽,看例子:(对于每一种线帽都一一把它画了出来,并在其后标上该线帽的名字,大家可以比对一下)Pen pen(Color:Green,15);SolidBrush brush(Color(255,255,0,0);FontFamily fontfamily(L黑体);Font font(&fontfamily,16,FontStyleRegular,UnitPixel);pen.SetStartCap(LineCapFlat);pen.SetEndCap(LineCapFlat);graphics
14、.DrawLine(&pen,PointF(30,20),PointF(400,20);graphics.DrawString(LLineCapFlat,-1,&font,PointF(430,10),&brush);pen.SetStartCap(LineCapSquare);pen.SetEndCap(LineCapSquare);graphics.DrawLine(&pen,PointF(30,50),PointF(400,50);graphics.DrawString(LLineCapSquare,-1,&font,PointF(430,40),&brush);pen.SetStartCap(LineCapRound);pen.SetEndCap(LineCapRound);graphics.DrawLine(&pen,PointF(30,80),PointF(400,80);graphics.DrawString(LLineCapRound,-1,&font,PointF(430,70),&brush);pen.SetStartCap(LineCapTriangle);pen.SetEndCap(LineCapTriangle);graphics.DrawLine