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()/,rect.Height()/); //设置客户区中心为坐标系原点
rect.OffsetRect(-rect.Width()/,-rect.Height()/); //客户区矩形校正 CPen penBlue(PS_SOLID,,RGB(,,)); //定义5个像素宽的蓝色画笔
CPen *pOldPen=pDC->SelectObject(&penBlue);
CBrush brushRed(RGB(,,)); //定义红色画刷
CBrush *pOldBrush=pDC->SelectObject(&brushRed);
pDC->SetPolyFillMode(WINDING); //设置填充模式
int r=; //正五边形外接圆半径
CPoint p[]; //定义正五边形顶点数组
double Beta=*PI/; //定义每个顶点的圆心角β
double Alpha=PI/; //定义初始角α
for(int i=;i<;i++)
{
p[i].x=Round(r*cos(i*Beta+Alpha));
p[i].y=Round(r*sin(i*Beta+Alpha));
}
CPoint v[];
v[]=p[];v[]=p[];v[]=p[];v[]=p[];v[]=p[]; //转储顶点
pDC->Polygon(v,); //绘制五角星
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()/,rect.Height()/); //设置客户区中心为坐标系原点
rect.OffsetRect(-rect.Width()/,-rect.Height()/); //客户区矩形校正 CPoint p[]; //定义顶点数组
p[]=CPoint(-,);p[]=CPoint(-,);
p[]=CPoint(-,);p[]=CPoint(-,-);
p[]=CPoint(-,-);p[]=CPoint(-,-);p[]=CPoint(-,);
CBrush NewBrush;
NewBrush.CreateSolidBrush(RGB(,,));
CBrush *pOldBrush=pDC->SelectObject(&NewBrush);
pDC->BeginPath();
pDC->MoveTo(p[]); //绘制左侧多边形
for(int i=;i<;i++)
pDC->LineTo(p[i]);
pDC->LineTo(p[]);
pDC->EndPath();
pDC->FillPath();
p[]=CPoint(,);p[]=CPoint(,);
p[]=CPoint(,);p[]=CPoint(,-);
p[]=CPoint(,-);p[]=CPoint(,-);p[]=CPoint(,);
pDC->BeginPath();
pDC->MoveTo(p[]);
for(i=;i<;i++) //绘制右侧多边形
pDC->LineTo(p[i]);
pDC->LineTo(p[]);
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()/,rect.Height()/); //设置客户区中心为坐标系原点
rect.OffsetRect(-rect.Width()/,-rect.Height()/); //客户区矩形校正 CPoint p[];
p[]=CPoint(-,-);p[]=CPoint(-,);
p[]=CPoint(,);p[]=CPoint(,-);
double k=(p[].y-p[].y)/(p[].x-p[].x);
double x=,y=k*(x-p[].x)+p[].y;
p[]=CPoint(Round(x),Round(y));p[]=CPoint(,-);p[]=CPoint(,);
for(int i=;i<;i++)
{
if(==i)
pDC->MoveTo(p[i]);
else
pDC->LineTo(p[i]);
pDC->Ellipse(p[i].x-,p[i].y-,p[i].x+,p[i].y+); //黑色实心圆绘制控制点
}
CPen NewPen,*pOldPen;
NewPen.CreatePen(PS_SOLID,,RGB(,,)); //蓝色画笔绘制样条
pOldPen=pDC->SelectObject(&NewPen);
pDC->PolyBezier(p,); //绘制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()/,rect.Height()/); //设置客户区中心为坐标系原点
rect.OffsetRect(-rect.Width()/,-rect.Height()/); //客户区矩形校正 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(-,-),rt=CPoint(,); //外接矩形的左下角点ld、右上角点rt
sp=CPoint(,),eq=CPoint(-,); //椭圆弧的起点sp和终点eq
pDC->Pie(CRect(ld,rt),sp,eq);
pDC->SelectObject(pOldBrush);
NewBitmap.DeleteObject();
ld=CPoint(-,-),rt=CPoint(,-);
sp=CPoint(,),eq=CPoint(-,);
pDC->Pie(CRect(ld,rt),sp,eq); //使用默认画刷填充
pDC->SelectObject(pOldPen);

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

  1. MFC绘图小实验(1)

    这学期开了一门计算机图形学的课程,感觉蛮有趣的,所以想把书上的那些样例程序都实现一遍,了解基本的绘图原理和要点. 1,使用用户自定义的映射模式,设置窗口大小和视区相等的二维坐标系.视区中x轴水平向右为 ...

  2. MFC绘图小实验(3)

    1,使用默认的文本背景模式,在点(-200,20)处输出黄底红字“Computer Graphics Based on VC++”;在(50,20)处输出黄底红字“BoChuang Research ...

  3. PBR综合小实验视频-狮子XL

    这个是上学时候录的一个策略路由小实验

  4. HTML5自学笔记[ 13 ]canvas绘图小实例之方块移动

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  5. HTML5自学笔记[ 12 ]canvas绘图小示例之鼠标画线

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  6. ubuntu下格式化内存当硬盘使的小实验

    内存虚拟硬盘(ramdisk)是指通过软件技术,将物理内存进行分割,将一部分内存通过虚拟技术转变为硬盘以较大幅度提升计算机数据读取速度和保护硬盘. 在ubuntu下的dev下有ram相关的文件,这些文 ...

  7. MongoDB 主从复制小实验

    MongoDB 主从复制小实验 操作环境描述:WIN8  64位操作系统,内装虚拟机为CentOS 5.5 32位系统. 操作描述:跟其他关系型数据库类似,在主库进行数据操作,将数据同步到从节点,从节 ...

  8. PS小实验-去除水印

    PS小实验-去除水印 水印是一些品牌商覆盖在图片或视频上的一个商标logo或小文本,比如大家最讨厌的百度logo,作者本人也是比较讨厌水印的,让好端端的一张图片变得美中不足. 个人觉得用photosh ...

  9. 1.4 Crack小实验

    0_day 第一章 基础知识 1.4 Crack小实验 <0day_2th>王清 著 电子书 下载链接:https://pan.baidu.com/s/11TgibQSC3-kYwCInm ...

随机推荐

  1. PC-Lint概念与基本操作

    1.   PC-Lint工具介绍 PC-Lint for C/C++是由Gimpel软件公司于1985年开发的代码静态分析工具,它能有效地发现程序语法错误.潜在的错误隐患.不合理的编程习惯等. C语言 ...

  2. win10+VS2015+boost_1.60.0

    安装boost库的初衷boost库是一个C++'准'标准库,对于一个C++程序员来说,了解强大的boost库是很有必要的.当然,在学习使用这样一个强大的库之前,首先要学会安装.本文讲述了boost_1 ...

  3. 采用alluxio提升MR job和Spark job性能的注意点

    1. 介绍 2. 实验说明 2.1 实验环境 2.2 实验方法 2.3 实验负载 3. MapReduce on alluxio 3.1 读取10G文件(1G split) 3.2 读取20G文件(1 ...

  4. Python爬取猫眼top100排行榜数据【含多线程】

    # -*- coding: utf-8 -*- import requests from multiprocessing import Pool from requests.exceptions im ...

  5. 邮箱登录form表单样例

    index.html <!doctype html> <html lang="en"> <head> <meta charset=&quo ...

  6. Airlaunch 快捷设置代码分享

    Airlaunch 快捷设置代码分享设置:prefs:root=SETTING蜂窝网络:prefs:root=MOBILE_DATA_SETTINGS_IDWIFI:prefs:root=WIFI定位 ...

  7. Windows下MFC程序利用LockCop解决死锁

    死锁现象:在训练的时候,点击“终止”按钮时不时会发生死锁. 检测工具:LockCop.TRACE宏.::GetCurrentThreadID函数. 检测手段: 总结起来就是—— 第一步:用LockCo ...

  8. 设计模式之工厂方法模式(代码用Objective-C展示)

    前面一篇展示了一个简单工厂模式,这一篇主要是对比,工厂方法模式比简单工厂模式好在哪里?为什么要用这个模式?这个模式的精髓在哪里? 就以计算器为例,结果图如下: 加减乘除运算都是继承自基类运算类,然后工 ...

  9. poj1753(位运算压缩状态+bfs)

    题意:有个4*4的棋盘,上面摆着黑棋和白旗,b代表黑棋,w代表白棋,现在有一种操作,如果你想要改变某一个棋子的颜色,那么它周围(前后左右)棋子的颜色都会被改变(白变成黑,黑变成白),问你将所有棋子变成 ...

  10. WebApi增删改查Demo

    1.新建webapi项目 2.配置WebApiConfig public const string DEFAULT_ROUTE_NAME = "MyDefaultRoute"; p ...