代码中的注释还是很清楚的,在此不罗嗦了:
void CGDI画刷Dlg::GDIBrushDrawImage(CDC* pDC) { Graphics g(pDC->m_hDC); //用单色画刷填充闭合曲线区域 SolidBrush solidBrush(Color(255,0,255,0)); PointF p1(30.0f,30.0f); PointF p2(100.0,100.0f); PointF p3(60.0,160.0f); PointF p4(5.0f,100.0f); PointF p5(30.0f,200.0f); PointF pt[4]={p1,p2,p3,p4}; //填充闭合区域 g.FillClosedCurve(&solidBrush,pt,4,FillModeAlternate,1.0); //构造比和多边形 PointF p[5]={p1,p2,p3,p4,p5}; //填充多边形 solidBrush.SetColor(Color(255,155,0,200)); g.FillPolygon(&solidBrush,p,5); /*绘制正夜曲线 * 对应的数学公式为: * R=A*Sin(N*Angle) * X=R*Cos(Angle) * Y=R*Sin(Angle) *其中A相当于叶子的长度,N是决定叶子数量的一个常量,Angle相当于叶子的旋转角度*/ int cx,cy; CRect rc; GetClientRect(&rc); //以当前窗口的正中心绘制正夜曲线 cx=rc.Width()/2; cy=rc.Height()/2; int LeafLen=200;//设置叶子长度 int LeafNum=20; float PI=3.14; int x,y,x2,y2,r; GraphicsPath tempPath(FillModeAlternate); for(float i=0.0f;i<PI*2+0.1f;i+=PI/180.0) { r=abs(LeafLen*cos(LeafNum*i)); x=r*cos(float(i)); y=r*sin(float(i)); x2=cx+x; y2=cy+y; tempPath.AddLine(x2,y2,x2,y2); } //接下来填充区域 g.FillPath(&solidBrush,&tempPath); Pen pen1(Color(255,255,0,0),1); g.DrawLine(&pen1,cx,0,cx,cy*2); g.DrawLine(&pen1,0,cy,cx*2,cy); //使用影线画刷 Color black(255,0,0,0),white(255,255,255,255); HatchBrush brush(HatchStyleHorizontal,black,white);//风格1 g.FillRectangle(&brush,100,40,100,50); ////////////////////////////////////////////////////////// HatchBrush br1(HatchStyleVertical,black,white);//风格2 g.FillRectangle(&br1,210,40,100,50); ////////////////////////////////////////////////////////// HatchBrush br2(HatchStyleForwardDiagonal,black,white);//风格3 g.FillRectangle(&br2,320,40,100,50); ////////////////////////////////////////////////////////// HatchBrush br3(HatchStyleBackwardDiagonal,black,white);//风格4 g.FillRectangle(&br3,430,40,100,50); ///////////////////////////////////////////////////////// HatchBrush br4(HatchStyleCross,black,white);//风格5 g.FillRectangle(&br4,150,100,100,50); /////////////////////////////////////////////////////// HatchBrush br5(HatchStyleDiagonalCross,black,white);//风格6-交叉对角线 g.FillRectangle(&br5,380,100,100,50); Color black(255,0,0,0); Color white(255,255,255,255); SolidBrush redBrush(Color(255,255,0,0)); Pen pen(Color(255,0,0,255)); CRect rc; GetClientRect(&rc); int columnCount=(int)rc.Width()/40;//设定每块矩形的大小为40X40 int rol=0; int column=0; CString str; WCHAR WideChar[2]; Font ft(L"Arial",16); //在当前窗口使用53种风格的影线画刷填充矩形 for(int i=0;i<53;i++) { if(rol>columnCount-1) { column++; rol=0; } HatchBrush tempBrush(HatchStyle(i),black,white); g.FillRectangle(&tempBrush,rol*40,column*40,35,35);//填充矩形区域 g.DrawRectangle(&pen,rol*40,column*40,35,35);//绘制边框 str.Format(L"%d",i); int strLen=str.GetLength(); memcpy(WideChar,str.GetBuffer(),sizeof(WideChar)); StringFormat format; RectF rect(rol*40,column*40,35,35); format.SetAlignment(StringAlignmentCenter); format.SetLineAlignment(StringAlignmentCenter); g.DrawString(WideChar,strLen,&ft,rect,&format,&redBrush); rol++; } /*设置画刷原点*/ Color black(255,0,0,0),white(255,255,255,255); HatchBrush hatchBrush(HatchStyle(20),black,white); //在垂直方向填充8个矩形,使用默认的画刷原点 for(int i=0;i<8;i++) g.FillRectangle(&hatchBrush,0,i*50,100,50); //使用不同的画刷原点 for(int i=0;i<8;i++) { g.SetRenderingOrigin(i,0); g.FillRectangle(&hatchBrush,100,i*50,100,50); } /*使用纹理画刷,纹理化刷实际是将图片在目标区域进行平铺*/ Pen pen(Color(255,0,0,255),2); SolidBrush brush(Color(255,0,0,0)); Font font(L"宋体",20); RectF rc1(10,10,200,200); RectF rc2(210,10,200,200); RectF rc3(410,10,200,200); Image image(L"2.jpg"); TextureBrush textureBrush(&image);//构造纹理化刷使用默认方式 g.FillEllipse(&textureBrush,rc1); g.DrawEllipse(&pen,rc1); g.DrawString(L"图片原始大小",6,&font,PointF(40,220),NULL,&brush); //方法二,只使用给定图片的部分区域 TextureBrush tBrush2(&image,Rect(0,0,60,50)); g.FillEllipse(&tBrush2,rc2); g.DrawEllipse(&pen,rc2); g.DrawString(L"只用部分区域",6,&font,PointF(240,220),NULL,&brush); /*构造纹理化刷3:将制定图片进行缩放*/ TextureBrush tBrush3(&image); tBrush3.SetTransform(&Matrix(0.5f,0.0f,0.0f,0.5f,0.0f,0.0f));//对话刷进行50%的缩放 g.FillEllipse(&tBrush3,rc3); g.DrawEllipse(&pen,rc3); g.DrawString(L"比例缩小图",6,&font,PointF(440,220),NULL,&brush); }