MFC绘图小实验(1)
1,使用用户自定义的映射模式,设置窗口大小和视区相等的二维坐标系。视区中x轴水平向右为正,y轴垂直向上为正,原点位于屏幕客户区中心。
void CTestoneView::OnDraw(CDC* pDC)
{CTestoneDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCRect 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); //客户区矩形校正}
2,在屏幕上使用SetPixelV()函数将crColor参数设置为随机颜色,用像素点在x轴负向画出对角点为(-150,-50)和(-50,50)的正方形。然后使用GetPixel()函数依次读出该正方形内各像素点的颜色,在x轴正向的对称位置上重新绘制该正方形。
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); //客户区矩形校正srand((unsigned)time(NULL)); //使用系统时间初始化随机种子,使得每次产生不同的随机数COLORRET crColor; //声明一个COLORRET变量crColor,用于存放像素点的颜色值int x,y; //声明像素点位置坐标/* 用随机颜色在x轴负向绘制对角点为(-150,-50)和(-50,50)的正方形*/for(y=-50;y<50;y++)for(x=-150;x<-50;x++)pDC->SetPixelV(x,y,RGB(rand()%255,rand()%255,rand()%255)); //产生0~255的随机数/* 读取正方形内每个像素点的颜色crColor,并在x轴正向的对称位置上绘制该正方形*/for(y=-50;y<50;y++)for(x=-150;x<-50;x++){crColor=pDC->GetPixel(x,y);pDC->SetPixelV(-x,y,crColor);}
3,从起点P0(-100,-50)到终点P1(100,50)绘制一段1像素宽的蓝色直线。
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 p0(-100,-50),p1(100,50); //定义直线段的起点坐标和终点坐标CPen NewPen,*pOldPen; //定义一个CPen类的画笔对象NewPen和一个画笔对象指针pOldPenNewPen.CreatePen(PS_SOLID,1,RGB(0,0,255)); //调用Cpen类的CreatePen()成员函数,创建一个像素宽的蓝色实线画笔pOldPen=pDC->SelectObject(&NewPen); //调用CDC类的SelectObject()成员函数将新画笔选入设备上下文,同时用pOldPen指针保存原画笔指针pDC->MoveTo(p0); //将当前位置移动到直线段起点p0pDC->LineTo(p1); //从起点绘制直线段到终点p1pDC->SelectObject(pOldPen); //在新画笔使用完毕后,调用CDC类的SelectObject()成员函数,用pOldPen指针保存的原画笔将设备上下文恢复原状
4,将客户区矩形上下文边界各收缩100个像素绘制重叠的方角矩形和圆角矩形。矩形边框为1像素宽的蓝色边界线。方角矩形内部使用默认画刷填充,圆角矩形内部填空红色,圆角取为(200,200)。
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); //客户区矩形校正rect.DeflateRect(100,100); //将矩形两个方向都缩小100个像素CPen NewPen,*pOldPen; //定义一个CPen类的画刷对象NewPen和一个画刷对象指针pOldPenNewPen.CreatePen(PS_SOLID,1,RGB(0,0,255)); //创建一个1像素宽的蓝色实线画笔pOldPen=pDC->SelectObject(&NewPen); //将新画笔选入设备上下文,同时用pOldPen指针保存原画笔指针pDC->Rectangle(rect); //绘制方角矩形CBrush NewBrush,*pOldBrush; //定义一个CBrush类的画刷对象NewBrush和一个画刷对象指针pOldBrushNewBrush.CreateSolidBrush(RGB(255,0,0)); //创建一个红色画刷pOldBrush=pDC->SelectObject(&NewBrush); //将新画刷选入设备上下文,同时用pOldBrush指针保存原画刷指针pDC->RoundRect(rect,CPoint(200,200)); //绘制圆角矩形/*将设备上下文恢复原状*/pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush);
5,以(-250,50)为左下角点,以(250,150)为右上角点绘制矩形,使用红色HS_BDIANGONAL阴影模式填充。以(-250,-150)为左下角点,以(250,-50)为右上角点绘制矩形,使用红色填充
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); //客户区矩形校正rect.OffsetRect(rect.Width()/2,-rect.Height()/2);/*定义两个矩形*/CRect rect1(CPoint(-250,50),CPoint(250,150));CRect rect2(CPoint(-250,-150),CPoint(250,-50));CBrush Brush(HS_BDIAGONAL,RGB(255,0,0)); //构造红色阴影画刷,也可以用CratHatchBrush()函数来定义pDC->FillRect(&rect1,&Brush); //使用阴影画刷填充rect1pDC->FillSolidRect(&rect2,RGB(255,0,0)); //使用红色填充rect2
6,将客户区矩形左右边界各收缩100个像素,分别绘制矩形、矩形内切圆和矩形内切椭圆。绘制过程按圆、椭圆和矩形顺序完成。设定圆、椭圆和矩形的边界线为1像素宽黑色实线,内部全部使用透明画刷填充。
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); //客户区矩形校正rect.DeflateRect(100,100);CBrush *pOldBrush;pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH); //为设备上下文选入透明画刷int r=rect.Height()/2; //根据矩形rect的高度定义圆的半径CRect rect1(CPoint(-r,-r),CPoint(r,r)); //定义圆的外接矩形pDC->Ellipse(rect1); //绘制圆pDC->Ellipse(rect); //绘制椭圆pDC->Rectangle(rect); //绘制外接矩形pDC->SelectObject(pOldBrush); //将设备上下文恢复原状
注:1,由于SelectStockObject()函数的返回类型是CGdiObject*,而pOldBrush的类型是CBrush*,需要进行强制类型转换。
2,如果不适用透明画刷,按照先画圆,后画椭圆、矩形的顺序绘制,因为图形使用默认的白色画刷填充,绘制结果只有矩形,圆和椭圆会被遮挡。
7,在客户区内从12点到3点逆时针绘制黑色点划线椭圆弧,从12点到3点顺时针绘制蓝色实线椭圆弧。
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 Twelve(0,rect.Height()/2),Three(rect.Width()/2,0); //定义12点和3点的位置CPen penBlack,penBlue,*pOldPen;penBlue.CreatePen(PS_SOLID,1,RGB(0,0,255)); //蓝色实线画笔penBlack.CreatePen(PS_DASHDOT,1,RGB(0,0,0)); //黑色点划线画笔/*从12点到3点顺时针绘制蓝色实线椭圆弧*/pDC->SetArcDirection(AD_CLOCKWISE); //顺时针绘制12点到3点pOldPen=pDC->SelectObject(&penBlue);pDC->Arc(rect,Twelve,Three);/*从12点到3点逆时针绘制黑色点划线椭圆弧*/pDC->SetArcDirection(AD_COUNTERCLOCKWISE); //逆时针绘制12点到3点pOldPen=pDC->SelectObject(&penBlack);pDC->Arc(rect,Twelve,Three);pDC->SelectObject(pOldPen);
作者:Zoctopus·Lian
出处:http://www.cnblogs.com/OctoptusLian/
MFC绘图小实验(1)相关推荐
- 计算机图形学实验一 《MFC绘图基础》
计算机图形学实验一 <MFC绘图基础> 视频讲解:无没啥讲的,有一些东西在实验二视频提了一下 一.MFC介绍 1.基本介绍: MFC是微软公司提供的一个类库,以C++类的形式封装了Wind ...
- MFC绘图工具High-speed Charting Control(VS2019)
MFC绘图工具High-speed Charting Control(VS2019) 前言 一.High-speed Charting Control 1.1 下载 1.2 添加到项目中 二.绘图测试 ...
- 【花雕小实验01】使用万用表测量OPT101模拟光照传感器模块
早上起来,尝试使用万用表来测量OPT101模拟光照传感器模块,这里调到直流电压20V档,模块供电5V, 正常室内光线时,测得电压为0.26V,凌晨光线很弱 用手指挡住光线,电压降为0.07V 使用台灯 ...
- CMS垃圾收集器小实验之CMSInitiatingOccupancyFraction参数
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 背景 测试CMSInitiatingOccupancyFracti ...
- 秒懂JVM的三大参数类型,就靠这十个小实验了
来源 | 悟空聊架构(ID:PassJava666) 本实验的目的是讲解 JVM 的三大参数类型.在JVM调优中用到的最多的 XX 参数,而如何去查看和设置 JVM 的 XX 参数也是调优的基本功,本 ...
- 小实验:用创建进程()打开计算器,然后关闭进程句柄。再用打开进程(进程ID),使用两次,得到两个进程句柄。实验目的:这两个进程句柄都能控制这个进程吗?通过该试验加深对句柄的理解!!...
小实验:用创建进程()打开计算器,然后关闭进程句柄.再用打开进程(进程ID),使用两次,得到两个进程句柄.实验目的:这两个进程句柄都能控制这个进程吗? .版本 2 .程序集 窗口程序集1 .子程序 _ ...
- 【 FPGA 】超声波测距小实验(一)
超声波测距原理: 超声波测距原理是在超声波发射装置发出超声波,它的根据是接收器接到超声波时的时间差,与雷达测距原理相似. 超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播 ...
- 【 FPGA 】按键消抖与LED灯流动小实验
记录一个小实验吧,实验的目的是仅仅是塞塞牙缝而已,没其他意思,很简单. 功能:拨码开关控制led灯工作与否,拨码开关为on,led灯工作,否则不工作:导航按键up和down,也就是独立按键而已,控制l ...
- [na]出口选路pbr小实验视频
什么是策略路由? 一般都是部署在出口路由器,用于路径强制分发的, 优先级高于路由表. 策略路由小实验视频 这个是读书时候录的一个策略路由小实验 转载于:https://www.cnblogs.com/ ...
最新文章
- React 源码剖析系列 - 解密 setState
- 陌屿授权系统V2.0全解
- Serverless 实战 —— 基于 Serverless 的 VuePress 极简静态网站
- 小程序分类左右内容联动
- mybatis源码学习(二):SQL的执行过程
- linux命令行 teamview,linux centos 命令行 安装 teamviewer 启动 停止
- 深度学习(5)之---目标检测综述:R-CNN、mask-RCNN、YOLO、SSD原理详解
- 移动端隐藏手机虚拟键盘
- FATAL Exited too quickly (process log may have details)
- HDU 5651 xiaoxin juju needs help 组合数
- 世纪互联的那些人、那些年、那些事
- matlab判断星期几的语句,计算某一天是星期几的matlab程序
- 推荐算法:为什么浏览器总是知道我喜欢的内容?
- Android图形系统之HWComposer
- C/C++语言重要语法之输入输出
- linux下kegg注释软件,工具篇丨GO和KEGG富集不到通路?快试试这个超赞的功能分析工具吧...
- 8.ffplayer 原理、架构及代码分析——包队列 pktqueue
- 倒计时工具类:PYContDownManager
- 前端渲染HTML与后端渲染HTML的区别?
- 使用python自动寻找抖音上漂亮的小姐姐,再也不愁没有小姐姐看