博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MFC绘图小实验(2)
阅读量:5290 次
发布时间:2019-06-14

本文共 5215 字,大约阅读时间需要 17 分钟。

1,以正五边形的5个顶点为基础,隔点存储构成五角星。填充模式采用WINDING。五角星边界线为5个像素宽的蓝色实线,内部使用红色填充。

CRect rect;  //定义矩形    GetClientRect(&rect);  //获得客户区矩形    pDC->SetMapMode(MM_ANISOTROPIC);  //设置映射模式    pDC->SetWindowExt(rect.Width(),rect.Height());  //设置窗口    pDC->SetViewportExt(rect.Width(),-rect.Height());  //设置视区:x轴水平向右为正,y轴垂直向上为正    pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);  //设置客户区中心为坐标系原点    rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);  //客户区矩形校正    CPen penBlue(PS_SOLID,5,RGB(0,0,255));  //定义5个像素宽的蓝色画笔    CPen *pOldPen=pDC->SelectObject(&penBlue);    CBrush brushRed(RGB(255,0,0));  //定义红色画刷    CBrush *pOldBrush=pDC->SelectObject(&brushRed);      pDC->SetPolyFillMode(WINDING);  //设置填充模式    int r=200;  //正五边形外接圆半径    CPoint p[5];  //定义正五边形顶点数组    double Beta=2*PI/5;  //定义每个顶点的圆心角β    double Alpha=PI/10;  //定义初始角α    for(int i=0;i<5;i++)    {        p[i].x=Round(r*cos(i*Beta+Alpha));        p[i].y=Round(r*sin(i*Beta+Alpha));    }    CPoint v[5];    v[0]=p[0];v[1]=p[2];v[2]=p[4];v[3]=p[1];v[4]=p[3];  //转储顶点    pDC->Polygon(v,5);  //绘制五角星    pDC->SelectObject(pOldPen);  //恢复画笔    pDC->SelectObject(pOldBrush);  //恢复画刷

 

注意:在该例程中用到了三角函数,要包含数学头文件;用到了圆周率π的值,需要把它宏定义为PI;由于五边形的顶点数组的计算值为浮点型数据,存储为CPoint类型时需要进行舍入处理。为此在文件头添加了以下编译预处理语句:

#include
#define PI 3.1415926#define Round(d) int(floor(d+0.5))

 

 

2,使用直线函数绘制P0(-160,20)、P1(-240,100)、P2(-280,0)、P3(-240,-100)、P4(-180,-40)、P5(-140,-100)、P6(-60,40)左侧多边形,水平右移360个像素绘制同样形状的多边形,使用FillPath()函数填充左侧多边形,使用StrokeAndFillPath()函数填充右侧多边形。多边形边界线颜色保持默认黑色,内部填充为红色。

CRect rect;  //定义矩形    GetClientRect(&rect);  //获得客户区矩形    pDC->SetMapMode(MM_ANISOTROPIC);  //设置映射模式    pDC->SetWindowExt(rect.Width(),rect.Height());  //设置窗口    pDC->SetViewportExt(rect.Width(),-rect.Height());  //设置视区:x轴水平向右为正,y轴垂直向上为正    pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);  //设置客户区中心为坐标系原点    rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);  //客户区矩形校正    CPoint p[7];  //定义顶点数组    p[0]=CPoint(-160,20);p[1]=CPoint(-240,100);    p[2]=CPoint(-280,0);p[3]=CPoint(-240,-100);    p[4]=CPoint(-180,-40);p[5]=CPoint(-140,-100);p[6]=CPoint(-60,40);    CBrush NewBrush;    NewBrush.CreateSolidBrush(RGB(255,0,0));    CBrush *pOldBrush=pDC->SelectObject(&NewBrush);    pDC->BeginPath();    pDC->MoveTo(p[0]);  //绘制左侧多边形    for(int i=1;i<7;i++)        pDC->LineTo(p[i]);    pDC->LineTo(p[0]);    pDC->EndPath();    pDC->FillPath();    p[0]=CPoint(200,20);p[1]=CPoint(120,100);    p[2]=CPoint(80,0);p[3]=CPoint(120,-100);    p[4]=CPoint(180,-40);p[5]=CPoint(220,-100);p[6]=CPoint(300,40);    pDC->BeginPath();    pDC->MoveTo(p[0]);    for(i=1;i<7;i++)  //绘制右侧多边形        pDC->LineTo(p[i]);    pDC->LineTo(p[0]);    pDC->EndPath();    pDC->StrokeAndFillPath();  //StrokeAndFillPath 填充路径层    pDC->SelectObject(pOldBrush);    NewBrush.DeleteObject();

 

 

 

3,给定7个控制点p0(-350,-100)、p1(-250,100)、p2(0,130)、p3(50,-50)、p5(350,-20),p6(250,130)。使用黑色画笔绘制控制多边形,使用蓝色画笔绘制两段Bezier样条。要求两段Bezier样条光滑连接,也就是说p4控制点与p2、p3控制点共线。设p4点的x坐标为90,请根据直线方程计算p4点的y坐标并绘制光滑拼接的两段Bezier样条。

CRect rect;  //定义矩形    GetClientRect(&rect);  //获得客户区矩形    pDC->SetMapMode(MM_ANISOTROPIC);  //设置映射模式    pDC->SetWindowExt(rect.Width(),rect.Height());  //设置窗口    pDC->SetViewportExt(rect.Width(),-rect.Height());  //设置视区:x轴水平向右为正,y轴垂直向上为正    pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);  //设置客户区中心为坐标系原点    rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);  //客户区矩形校正    CPoint p[7];      p[0]=CPoint(-350,-100);p[1]=CPoint(-250,100);    p[2]=CPoint(0,130);p[3]=CPoint(50,-50);    double k=(p[3].y-p[2].y)/(p[3].x-p[2].x);    double x=90,y=k*(x-p[3].x)+p[3].y;    p[4]=CPoint(Round(x),Round(y));p[5]=CPoint(350,-20);p[6]=CPoint(250,130);    for(int i=0;i<7;i++)    {        if(0==i)            pDC->MoveTo(p[i]);        else            pDC->LineTo(p[i]);        pDC->Ellipse(p[i].x-5,p[i].y-5,p[i].x+5,p[i].y+5);  //黑色实心圆绘制控制点    }    CPen NewPen,*pOldPen;    NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255));  //蓝色画笔绘制样条    pOldPen=pDC->SelectObject(&NewPen);    pDC->PolyBezier(p,7);  //绘制Bezier样条    pDC->SelectObject(pOldPen);

 

 

 

 

4,绘制两个扇形构成扇子形状,并使用资源文件里的位图画刷填充扇子内部。

在Resource View 画板里选中Test resources,右击,在弹出的菜单里选择引入...,

注意:图片后缀名必须是.bmp

 

效果如下:

 

CRect rect;  //定义矩形    GetClientRect(&rect);  //获得客户区矩形    pDC->SetMapMode(MM_ANISOTROPIC);  //设置映射模式    pDC->SetWindowExt(rect.Width(),rect.Height());  //设置窗口    pDC->SetViewportExt(rect.Width(),-rect.Height());  //设置视区:x轴水平向右为正,y轴垂直向上为正    pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);  //设置客户区中心为坐标系原点    rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);  //客户区矩形校正    CBitmap NewBitmap;    NewBitmap.LoadBitmap(IDB_BITMAP1);    CBrush NewBrush,*pOldBrush;    NewBrush.CreatePatternBrush(&NewBitmap);  //新建模式画刷,图片作为模式刷    pOldBrush=pDC->SelectObject(&NewBrush);    CPen *pOldPen;    pOldPen=(CPen*)pDC->SelectStockObject(NULL_PEN);    CPoint ld,rt,sp,eq;    ld=CPoint(-400,-600),rt=CPoint(400,200);  //外接矩形的左下角点ld、右上角点rt    sp=CPoint(400,0),eq=CPoint(-400,0);  //椭圆弧的起点sp和终点eq    pDC->Pie(CRect(ld,rt),sp,eq);    pDC->SelectObject(pOldBrush);    NewBitmap.DeleteObject();    ld=CPoint(-80,-280),rt=CPoint(80,-120);    sp=CPoint(400,0),eq=CPoint(-400,0);    pDC->Pie(CRect(ld,rt),sp,eq);  //使用默认画刷填充    pDC->SelectObject(pOldPen);

 

 

转载于:https://www.cnblogs.com/OctoptusLian/p/6659566.html

你可能感兴趣的文章
60.Median of Two Sorted Arrays(两个排序数组的中位数)
查看>>
(转)SVN命令详解
查看>>
BZOJ 2731: [HNOI2012]三角形覆盖问题
查看>>
selenium原理和尝试
查看>>
poj 3181 Dollar Dayz
查看>>
dijstra+输出路径总结
查看>>
android中怎么让 button组件居中显示
查看>>
httprunner -- 问题
查看>>
CF 305C ——Ivan and Powers of Two——————【数学】
查看>>
js script放在head和body里面的区别
查看>>
深入理解计算机系统(5.1)------优化程序性能
查看>>
对Git一点点小认识
查看>>
Objective C静态代码扫描和代码质量管理 OClint + SonarQube
查看>>
iPad弹出框
查看>>
Scrum实施日记 - QA很累
查看>>
AC日记——[中山市选2009]谁能赢呢? bzoj 2463
查看>>
python并发编程之协程
查看>>
维吉尼亚密码
查看>>
ubuntu 下使用virtaulbox 以及一些问题
查看>>
laravel 增删改查 数据库设置 路由设置
查看>>