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)相关推荐

  1. 计算机图形学实验一 《MFC绘图基础》

    计算机图形学实验一 <MFC绘图基础> 视频讲解:无没啥讲的,有一些东西在实验二视频提了一下 一.MFC介绍 1.基本介绍: MFC是微软公司提供的一个类库,以C++类的形式封装了Wind ...

  2. MFC绘图工具High-speed Charting Control(VS2019)

    MFC绘图工具High-speed Charting Control(VS2019) 前言 一.High-speed Charting Control 1.1 下载 1.2 添加到项目中 二.绘图测试 ...

  3. 【花雕小实验01】使用万用表测量OPT101模拟光照传感器模块

    早上起来,尝试使用万用表来测量OPT101模拟光照传感器模块,这里调到直流电压20V档,模块供电5V, 正常室内光线时,测得电压为0.26V,凌晨光线很弱 用手指挡住光线,电压降为0.07V 使用台灯 ...

  4. CMS垃圾收集器小实验之CMSInitiatingOccupancyFraction参数

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 背景 测试CMSInitiatingOccupancyFracti ...

  5. 秒懂JVM的三大参数类型,就靠这十个小实验了

    来源 | 悟空聊架构(ID:PassJava666) 本实验的目的是讲解 JVM 的三大参数类型.在JVM调优中用到的最多的 XX 参数,而如何去查看和设置 JVM 的 XX 参数也是调优的基本功,本 ...

  6. 小实验:用创建进程()打开计算器,然后关闭进程句柄。再用打开进程(进程ID),使用两次,得到两个进程句柄。实验目的:这两个进程句柄都能控制这个进程吗?通过该试验加深对句柄的理解!!...

    小实验:用创建进程()打开计算器,然后关闭进程句柄.再用打开进程(进程ID),使用两次,得到两个进程句柄.实验目的:这两个进程句柄都能控制这个进程吗? .版本 2 .程序集 窗口程序集1 .子程序 _ ...

  7. 【 FPGA 】超声波测距小实验(一)

    超声波测距原理: 超声波测距原理是在超声波发射装置发出超声波,它的根据是接收器接到超声波时的时间差,与雷达测距原理相似. 超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播 ...

  8. 【 FPGA 】按键消抖与LED灯流动小实验

    记录一个小实验吧,实验的目的是仅仅是塞塞牙缝而已,没其他意思,很简单. 功能:拨码开关控制led灯工作与否,拨码开关为on,led灯工作,否则不工作:导航按键up和down,也就是独立按键而已,控制l ...

  9. [na]出口选路pbr小实验视频

    什么是策略路由? 一般都是部署在出口路由器,用于路径强制分发的, 优先级高于路由表. 策略路由小实验视频 这个是读书时候录的一个策略路由小实验 转载于:https://www.cnblogs.com/ ...

最新文章

  1. React 源码剖析系列 - 解密 setState
  2. 陌屿授权系统V2.0全解
  3. Serverless 实战 —— 基于 Serverless 的 VuePress 极简静态网站
  4. 小程序分类左右内容联动
  5. mybatis源码学习(二):SQL的执行过程
  6. linux命令行 teamview,linux centos 命令行 安装 teamviewer 启动 停止
  7. 深度学习(5)之---目标检测综述:R-CNN、mask-RCNN、YOLO、SSD原理详解
  8. 移动端隐藏手机虚拟键盘
  9. FATAL Exited too quickly (process log may have details)
  10. HDU 5651 xiaoxin juju needs help 组合数
  11. 世纪互联的那些人、那些年、那些事
  12. matlab判断星期几的语句,计算某一天是星期几的matlab程序
  13. 推荐算法:为什么浏览器总是知道我喜欢的内容?
  14. Android图形系统之HWComposer
  15. C/C++语言重要语法之输入输出
  16. linux下kegg注释软件,工具篇丨GO和KEGG富集不到通路?快试试这个超赞的功能分析工具吧...
  17. 8.ffplayer 原理、架构及代码分析——包队列 pktqueue
  18. 倒计时工具类:PYContDownManager
  19. 前端渲染HTML与后端渲染HTML的区别?
  20. 使用python自动寻找抖音上漂亮的小姐姐,再也不愁没有小姐姐看

热门文章

  1. 量子霍尔传感器常见问题的解答
  2. php假期培训机构,西安PHP暑假技术学习
  3. 推荐几个免费好用的搜书网站
  4. weiit连锁门店管理系统+商城系统带您玩转获客
  5. linux下验证码不显示问题解决
  6. mysql常用命令大全(百度文库下载的,备忘一下)
  7. Excel内置插件实现多个同类型文件合并,无需代码
  8. 【程序分享】51汇听刷分程序
  9. 三菱PLC GX3 全ST程序案例,提供项目源码FB源码
  10. 高校什么场景下需要用到大数据实训平台?