一、MoveTo()函数和LineTo()函数

本文实例均于 ***View().cpp文件中的OnDraw()函数中实现。

两函数在上上节C++/MFC工程[2]——自定义平面直角坐标系中已经有所应用。

MoveTo()函数只设置起点,不画线。

LineTo()函数进行画线,画线结束后,起点变为LineTo()函数中的参数点,即本次画线的终点(以下实例中会体现,便于加深理解)

//绘制起点为P0(10,10)、终点为P1(100,20)的直线CDC* pDC = GetDC();//一:定义两点P0,P1,传参画线
CPoint P0,P1;
P0=(10,10);
P1=(100,20);
pDC->MoveTo(P0);
pDC->LineTo(P1);//二、直接传参横纵坐标
pDC->MoveTo(10,10);
pDC->LineTo(100,20);

二、画笔CPen类和画刷CBrush类

CPen和CBrush类都属于GDI工具类。CPen默认为1像素宽的黑色实线,CBrush默认为填充白色。二者在使用前要先选入设备上下文;使用后要恢复设备上下文

1、创建画笔函数

CreatePen(int PenStyle, int PenWidth, PenColor),参数含义依次为:画笔样式、画笔宽度、画笔颜色。

画笔样式包括实线、虚线、点划线等,感兴趣的同学可自行搜索学习。

画笔颜色的表示方法有两种,详见C++/MFC第一篇(三、颜色表示的简单介绍)。

2、创建画刷函数

CreateSolidBrush(BrushColor),参数含义为:画刷颜色。

3、选入设备上下文

① 画笔

OldPen = pDC->SelectObject(&NewPen);

OldPen为原画笔指针,NewPen为新创建的画笔。

② 画刷

OldBrush = pDC->SelectObject(&NewBrush);

OldBrush为原画刷指针,NewBrush为新创建的画刷。

4、恢复设备上下文

① 画笔

pDC->SelectObject(OldPen);

pDC为CDC类指针,OldPen为原画笔指针。

② 画刷

pDC->SelectObject(OldBrush);

pDC为CDC类指针,OldBrush为原画刷指针。

三、实例

1、绘制三角形

//自定义坐标系下实现
//绘制顶点为p0,P1,P2的三角形
CPoint P0(-200, -100), P1(200, -100), P2(0, 200);
pDC->MoveTo(P0);
pDC->LineTo(P1);
pDC->LineTo(P2);
pDC->LineTo(P0);

运行结果如下:

注:自定义坐标系请于C++/MFC工程[2]——自定义平面直角坐标系 中查看。

2、根据要求绘制直线

要求:从P0到P1绘制1像素宽的绿色实线,从P1到P2绘制3像素宽的蓝色实线。

//自定义坐标系下实现
CPoint P0(-100, -100), P1(30, 20), P2(100, 150);
CPen greenPen, bluePen, * pOldPen; //OldPen用来保存原指针
greenPen.CreatePen(0, 1, RGB(0, 255, 0));//创建画笔,(样式,宽度,颜色)
pOldPen = pDC->SelectObject(&greenPen);//选入上下文
pDC->MoveTo(P0);
pDC->LineTo(P1);//当前位置保持在P1位置
pDC->SelectObject(pOldPen);//恢复上下文
bluePen.CreatePen(0, 3, RGB(0, 0, 255));//创建画笔,(样式,宽度,颜色)
pOldPen = pDC->SelectObject(&bluePen);//选入上下文
pDC->LineTo(P2);
pDC->SelectObject(pOldPen);//恢复上下文

运行结果如下:

注:LineTo 只保留起点颜色,不保留终点颜色,故P1点是蓝色的 。

3、绘制“金刚石”图案

金刚石——各顶点为某个圆上的等分点,各点之间均相连。

    //自定义坐标系下实现int r = 200, n = 12;//半径为200,等分为12份CPoint P[12];double Theta = 2 * PI / n;//等分角的角度for (int i = 0; i < n; i++){P[i].x = ROUND(r * cos(i * Theta));//计算坐标,宏ROUND将结果转换为整型变量P[i].y = ROUND(r * sin(i * Theta));}for (int i = 0; i <= n - 2; i++){for (int j = i + 1; j <= n - 1; j++)//连接各个点,避免线段的重复绘制{pDC->MoveTo(P[i]);pDC->LineTo(P[j]);}}

注:ROUND宏定义为:#define ROUND(d) int(floor(d) + 0.5)

运行结果如下:

本例中将圆进行了12等分,修改n值与数组P大小,还可以得到如下结果:

    

如上,分别为十等分、十五等分的结果,具有对称美。不难发现,随着n值的增大,图形会更加趋向于圆。

C++/MFC工程[4]——绘制直线段相关推荐

  1. YDOOK: ANSYS Electronic Desktop Maxwell 19 教程2:绘制基本2D图形对象 绘制直线段

    使用 ANSYS Electronic Desktop Maxwell 19 绘制基本2D图形对象 绘制直线段 主面板滑动选择 将滚轮放在主面板的右侧进行滑动的时候,主面板的内容将会发生改变. 1. ...

  2. Wu反走样算法绘制直线段

    Wu反走样算法 原理:在我看来,Wu反走样算法是在Bresenham算法基础上改进了一番,它给最靠近理想直线/曲线的两个点以不同的亮度值,以达到模糊锯齿的效果.因为人眼看到的是线附近亮度的平均值. M ...

  3. 安装VS2019、MFC,并创建MFC工程文件,查看工程信息

    安装VS2019.MFC.创建第一个MFC文件 1.安装VS2019 vs2019已经在4月2日正式发布,vs2019和vs2017一样强大,项目兼容,不用互相删除,而且C/C++,Python,F# ...

  4. C++/MFC工程[3]——像素点的绘制

    一.使用GDI对象绘图时遵循的三个步骤 1.绘图开始前,创建一个新的GDI对象,并选入当前设备上下文中,同时保持指向原GDI对象的指针: 2.使用新的GDI对象绘图: 3.绘图结束后,使用已保存的原G ...

  5. VS如何新建一个基于对话框的MFC工程并添加按钮

    学习MFC的初学者,入门的步骤很重要,新建一个基于对话框的MFC应用程序,并通过拖拉按钮等,初步搭建自己的MFC工程. 工具/原料 笔记本电脑 VS2010 方法/步骤 打开VS2010,并新建MFC ...

  6. 【OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 )

    文章目录 一.设置线宽度 二.绘制单条线段 GL_LINES 三.绘制多条线段 GL_LINES 四.绘制依次连接的点组成的线 GL_LINE_STRIP 五.绘制圈 GL_LINE_LOOP ( 偶 ...

  7. 非MFC工程中使用MFC库

    需求说明 C++工程的类型有很多,从VS(或VC)可以看到常见的有:Win32 Console Application.MFC Application.Win32 Project等.在创建MFC工程时 ...

  8. mfc工程中添加com接口支持

    在普通的mfc工程中常常需要添加com接口支持.最典型的应用就是使用 com中的连接点机制时,需要在客户端实现事件接受器.简单说来,就是要实现在com服务器端声明的事件接口.这个接口由server端暴 ...

  9. MFC工程按USB插口显示所有USB设备及插口(包括安卓)

    最近写资料用到按照USB顺序显示所有的USB设备(设备不用按照插入顺序,只需要插入对应USB插口即可),搜了很多资料没有找到想要的实现方式,便自己动手写了一些库文件(结合USB View以及Windo ...

最新文章

  1. 在react hook里使用mobx(配置mobx依赖)
  2. RHEL6.1 安装 Oracle10gr2 (图文、解析)
  3. ios 内存深度优化_iOS 25个性能优化/内存优化常用方法
  4. Mysql知识总结(二)
  5. Amber Group与1Token达成合作,引入CAM系统加码机构级财务方案
  6. Exception in thread main java.lang.NoClassDef...
  7. 李华上大学了吗?(I)
  8. Excel-财务函数1
  9. 美学心得(第二百二十五集)罗国正
  10. ape是什么格式?ape怎么转mp3?
  11. IDM下载浮动条使用详解
  12. 台湾地区HITCON队长发威夺冠,XCTF联赛西安站国际赛顺利落幕
  13. 微信营销如何做对o2o商业模式心灰意冷了吗?O2O到底要怎么做?
  14. AE学习日记之MapControl与PageLayoutControl图层变化同步
  15. HiveSQL分位数函数percentile()使用详解+实例代码
  16. java常用加密算法
  17. 计算机基础知识英文,计算机基础知识英文版-基础并不好,在电脑上学英语,什么软件最好用? 爱问知识人...
  18. Leetcode LCP 17. 速算机器人
  19. 编译PX4时,报错error ‘i‘ does not name a type __ULong i[2];解决方法
  20. BugKu——你必须让他停下

热门文章

  1. 南卡和FIIL蓝牙耳机哪个更好?国产蓝牙耳机南卡和FIIL评测
  2. UVA-508 莫尔斯电码 题解答案代码 算法竞赛入门经典第二版
  3. 智睿学校网站管理系统VER1.5.7破解版
  4. 雷军提议把人工智能当国家战略:要有制度保障
  5. 无法连接iPhone手机开的热点怎么办?
  6. python endswith函数_Python endswith() 方法
  7. 仓储业务外包可以帮助企业解决哪些问题?
  8. DevExpress 控件翻译成简体中文(图)
  9. VB.NET中DateAndTime模块学习
  10. SW3518全协议OPPO闪充、支持QC-A+C-PD 口任意口快充输出车充IC