当前位置: 首页 > article >正文

MFC图形函数学习03——画直线段函数

       MFC中画直线段需要两个函数的配合,一个函数负责设定画线起点,另一个函数负责将线段从起点画到终点。
一、介绍这两个画线函数
 (1)设定画线起点函数MoveTo()
       原型:CPoint MoveTo(int x,int y);
       参数:窗口上的坐标点(x,y),画线起始位置
       返回值:返回移动前的、以CPoint类对象表示的位置,从这个对象中能够取出(x,y)坐标。
  (2)画线段函数LineTo()
       原型:BOOL LineTo(int x.int y);
       参数:窗口上的坐标点(x,y),画线终止位置
       返回值:画线成功返回非0数,不成功返回0。
  (3)说明
       a.这两个函数是CDC类的成员函数,使用时需要CDC类对象或指针调用。MFC中的函数,全局函数少,大多数是属于某个类的成员函数,这一点需要记住。
       b.关于MoveTo函数的返回值类型CPoint,它是一个类,这个类与POINT结构体类似,其属性可以表示某点的坐标,用它的对象做参数,可以代替(x,y)这种写法。CPoint类还有其它属性和成员函数。
       c.如果我们不设置画线起点,直接使用LineTo画线,则画线的起点是上次画线的终点。如是第一次画线,则从(0,0)开始。
       d.如不进行其它设置,直接使用上面的函数画线,画出线的颜色、线型、线宽等都是按照缺省值进行的。如不使用缺省值画线,需要进行下面这些设置。
二、设置画线线型、线宽、颜色的步骤
  (1)调用创建画笔函数
        原型:BOOL CreatePen(int nPenStyle,int nWidth,COLORREF color);
        参数:nPenStyle画笔样式、nWidth画笔宽度都是int类型;color是颜色COLORREF类型
       关于画笔样式取值:这里介绍三个,PS_SOLID(值=0)代表实线;PS_DASH(值=1)代表虚线;PS_NULL(值=5)代表无形线。
       关于画笔宽度取值:需要几个像素宽就写几个像素;关于颜色,有一个专门的类型是COLORREF,为其对象赋值可以使用RGB()函数,这个函数有三个参数,分别代表红(r)、绿(g)、蓝(b)三个原色分量,每个值的范围均是0~255,通过三个值的不同组合,可以形成各种颜色。
       说明:
         a.函数CreatePen是CPen类的成员函数,使用这个函数需要CPen类对象或指针调用。CPen类的基类是CGdiObject,它也是众多绘图工具的基类,以后慢慢接触。
         b.虚线的宽度只有1,再往大了选就变成实线了。
   (2)将创建的画笔选入CDC的函数
       原型:CPen* SelectObject(CPen* pPen);
       参数:pPen是将要被选入的画笔对象指针。
       返回值:返回值是CPen类型的指针,选入成功返回被替换画笔的指针;失败返回NULL。
       说明:
         a.函数SelectObject()是CDC类的成员函数,需要CDC类对象或指针调用,如此,也才能将创建的画笔选入CDC之中。
         b.这个函数的返回值是必须接收的,自己创建的画笔使用完毕,应将原来缺省的画笔予以恢复;而这个返回值正是原来的缺省画笔,接收后保存起来,恢复时重新选入即可。
         c.注意,函数选入画笔时是使用指针类型,如果我们声明的画笔不是指针,要对其取址后传入。
三、举一个画直线的例子。这个例子使用设备坐标系,即绘图原点(0,0)在窗口左上角,从原点向窗口底边不同位置使用不同线型、线宽、颜色均匀画30条线。
   代码及注释如下(如要运行程序将其考入OnDraw函数中即可):

   //如程序中已有“设置自定义坐标系”代码,请注释掉
	srand(time(0)); //随机数种子,为使用time函数在头文件部分要将<time.h>包含
	for (int i = 0; i < 30; i++) //用循环控制画线条数
	{
		//随机颜色的设置()
		int r = rand() % (255 + 1);//生成0-255之间的随机数
		int g = rand() % (255 + 1);
		int b = rand() % (255 + 1);
		COLORREF color = RGB(r,g,b);//生成颜色
		//获得窗口数据
		CRect rect;
		GetClientRect(rect); 
		int dis = rect.Width() / 30; //画线终点在窗口底部x方向的间隔
		int height = rect.Height(); //画线终点在y方向的位置(设备坐标系y朝下)
		//定义线型、线宽
		int style, width;
		if (i == int(i / 2) * 2)
		{
			style = PS_SOLID; //画线条数为双数时用实线
			width = 3;//画线条数为双数时线宽3个像素
		}
		else
		{
			style = PS_DASH; //画线条数为单数时用虚线
			width = 1;//画线条数为双数时线宽1个像素
		}
		//创建画笔
		CPen myPen; //声明画笔对象
		myPen.CreatePen(style, width, color);//调用画笔成员函数创建画笔
		//选入画笔并保存缺省画笔
		CPen* oldPen = pDC->SelectObject(&myPen); //返回值为缺省指针
		//画线
		pDC->MoveTo(0, 0),
		pDC->LineTo(20 + i * dis, height);
                //恢复缺省画笔
                pDC->SelectObject(oldPen);
	}

运行效果:


http://www.kler.cn/a/376577.html

相关文章:

  • docker-高级(待补图)
  • 带你了解 Spring Cloud Config
  • Android启动流程_Init阶段
  • 「Math」高等数学知识点大纲(占位待处理)
  • linux-UART
  • 【1】Elasticsearch 30分钟快速入门
  • 【系统架构】如何演变系统架构:从单体到微服务
  • 前端好用的网站分享——CSS(持续更新中)
  • Three.js 开源项目及入门教程分享
  • 【MySql】-0.1、Unbunt20.04二进制方式安装Mysql5.7和8.0
  • Python中os.mkdir() 和 os.makedirs()有什么不同
  • 3DDFA-V3——基于人脸分割几何信息指导下的三维人脸重建
  • WebSocket详解:从前端到后端的全栈理解
  • 【android12】【AHandler】【4.AHandler原理篇ALooper类方法全解】
  • 基于openEuler22.03的rpcapd抓包机安装
  • 如何为STM32的ADC外设编写中断服务程序
  • Linux权限管理和文件属性
  • Docker:技术架构的演进之路
  • 安卓应用自动化测试工具Appium实操分享
  • 【数据结构-邻项消除】力扣1003. 检查替换后的词是否有效
  • 笔记本电脑死机恢复按什么键恢复 电脑死机的解决方法
  • Python 淘宝数据挖掘与词云图制作全攻略
  • Redis特性和应用场景以及安装
  • 私有化视频平台EasyCVR海康大华宇视视频平台视频诊断技术是如何实时监测视频质量的?
  • 在 Windows 系统上设置 MySQL8.0以支持远程连接
  • ES(ElaticSearch)详解(含工作原理、基本知识、常见问题和优化方法)