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);
}
运行效果: