MFC绘图小实验(2)

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<math.h>
#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);

时间: 2024-10-12 16:34:16

MFC绘图小实验(2)的相关文章

MFC绘图小实验(1)

1,使用用户自定义的映射模式,设置窗口大小和视区相等的二维坐标系.视区中x轴水平向右为正,y轴垂直向上为正,原点位于屏幕客户区中心. void CTestoneView::OnDraw(CDC* pDC) { CTestoneDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CRect rect; //定义矩形 GetClientRect(&rect); //获得客

DCDC纹波小实验

关于使用示波器测试纹波的注意事项 使用示波器的AC耦合方式测量 由于示波器的头套容易引人噪声,因此在测试前必需把探头的头套去掉 因为电源的高频噪声很容易通过小电感就可以滤掉,因此更关心的是中低频的噪声.测试时将示波器的带宽限制调到尽可能的低(20MHz),避免从表笔引入噪声(我之前就吃过这方面的亏) DCDC后端接LDO AMS1117-5V的Datasheet上要求的最低压差(VIN-VOUT)为1.1V到1.25V,这就要求输入要大于5V+1.1V=6.1V,如果输入不满足这个条件会怎么样呢

初识句柄操作(控制台窗口小实验)

今日学习了控制台使用句柄操作的方法. 我们都知道,使用iostream也可以向屏幕中输出语句. 但它们只能实现基本的输入输出 操作,对于控制台窗口界面的控制却无能为力,而且不能与stdio.h和conio.h友好相处,因为iostream和它们是C++两套不同的输入. 因此,我们需要句柄类来帮助我们完成这个操作. 下面直接上练习小代码,为贪食蛇清屏的小片段. 经一番查找,习得基本用法. 1 void clrscr(void) { 2 //控制台窗口信息类型 存有缓冲区大小 当前光标位置 窗口显示

留言本小实验

实验目的: 利用PHP实现发布留言,并存在txt文本文件中,还可以从文本文件中读取留言,并显示在网页上. 实验代码: 先要用个表单提交留言,写一个简单的html如下: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 2 <html xmlns="http://www

ES6小实验-let和const(2)

继续小实验,上次写到块级作用域,那么为什么需要块级作用域呢?书中给了两个场景: 1.没有块级作用域,内层变量可能会覆盖外层变量.举例: var tmp = new Date() function f() { console.log(tmp) if(false) { var tmp = "hello world" } } f();//undefined 内层的tmp变量把外层的tmp变量覆盖,所以输出结果为undefined 2.用来计数的循环变量泄露为全局变量,举例: var s =

关于java中equals与==的区别的小实验

java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的是二者是都为同一对象,是一种操作符. 做了几个小实验比较结果. 实验一: String str1="ab": String str2="ab": System.out.println(s1==s2)://trueSystem.out.println(str1.equals(str2));//true 这里的str1与str2都指向了常量池中的同一对象,所以S

【MFC】MFC绘图不闪烁——双缓冲技术

MFC绘图不闪烁——双缓冲技术[转] 2010-04-30 09:33:33|  分类: VC|举报|字号 订阅 [转自:http://blog.163.com/[email protected]/blog/static/49846449201033093333394/] 在VC/MFC用CDC绘图时,频繁的刷新,屏幕会出现闪烁的现象,CPU时间占用率相当高,绘图效率极低,很容易出现程序崩溃. 所谓双缓冲技术,下面是百度百科的解释: 我们看电视时,看到的屏幕称为OSD层,也就是说,只有在OSD层

ES6小实验-字符串的扩展

ES6里面的对字符串的扩展实际上就是增加了一些方法,使对字符串的操作更加完善,下面做几个小实验来验证下: includes(): 返回布尔值,表示是否找到了参数字符串,支持第二的参数,表示开始的位置 'use strict'; var s = 'Hello world!'; console.log(s.includes('Hello'));//true startsWith(): 返回布尔值,表示参数字符串是否在源字符串的头部,支持第二的参数,表示开始的位置 'use strict'; var

QT 与MFC绘图技术比较

在工控监测领域,经常需要动态绘制曲线,观察曲线的变化趋势,绘制波形图,绘制频谱等.在前面4讲中介绍了MFC经常用的TeeChart控件和Hight-Speed Chart Ctrl,这两个都是MFC绘图控件的经典(另外,在Qt中还有QwtPlot和QCustomPlot两大神器).许多人问如何绘制动态变化的曲线,为此专门写下这篇文章. C++ GUI 绘图控件目录 MFC(VC) VS2010 使用TeeChart绘图控件 - 之一 - 控件和类的导入 VS2010 使用TeeChart绘图控件