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函数中即可):

cpp 复制代码
   //如程序中已有"设置自定义坐标系"代码,请注释掉
	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);
	}

运行效果:

相关推荐
arriettyandray19 小时前
MFC/C++学习系列之简单记录4——错误解决与错误提示
mfc
sam-zy19 小时前
MFC用List Control 和Picture控件实现界面切换效果
c++·mfc
arriettyandray20 小时前
MFC/C++学习系列之简单记录6
mfc
arriettyandray1 天前
MFC/C++学习系列之简单记录——序列化机制
mfc
金士顿1 天前
MFC 文档模板 每个文档模板需要实例化吧
c++·mfc
arriettyandray2 天前
MFC/C++学习系列之简单记录7
mfc
arriettyandray2 天前
MFC/C++学习系列之简单记录11——树控件的使用
mfc
arriettyandray2 天前
MFC/C++学习系列之简单记录12——文件操作
mfc
XZHOUMIN2 天前
【MFC】如何修改多文档视图的标签
c++·mfc
2402_857583492 天前
科技赋能医疗挂号:SSM 医院预约挂号系统的 Vue 卓越设计与达成
vue.js·科技·mfc