实验1、MFC绘制函数
实验目的:利用MFC的绘制函数,实现利用鼠标左键的抬起和落下、绘制线段、矩形和圆形,并修改画笔颜色粗细,以及给矩形、圆形进行颜色填充。
1、绘制直线
① 在【解决方案资源管理器】中,点击【头文件】中的testView.h;
在testView.h头文件中定义绘制的起点P0和终点P1;
编写代码:
CPoint P0, P1;
② 点击【项目】中的【类向导】;
(VC6.0的类向导在【查看】的【查看类向导】中)
在类向导中,【类名】选择CtestView,在【消息】中找到WM_LBUTTONDOWN和WM_LBUTTONUP,点击【添加处理程序】,添加处理程序后函数名变成OnLButtonDown和OnLButtonUp,然后点击【编辑代码】
③ 把鼠标左键按下时的点,赋值给P0;
编写代码:
P0 = point;
- 把鼠标左键弹起时的点赋值给P1;
- 利用MoveTo()和LineTo()绘制直线:因为OnLButtonUp中没有pDC调用这两个函数,所以首先定义一个pDC,通过GetDC()给它赋值;这样就可以调用MoveTo()和LineTo()这两个函数来画线了。
- 最后用ReleaseDC()来释放pDC。
编写代码:
P1 = point;
CDC* pDC = GetDC();
pDC->MoveTo(P0);
pDC->LineTo(P1);
ReleaseDC(pDC);
这样就可以直接运行了,快捷键是Ctrl+F5,可以在窗口中拖动鼠标绘制直线了。
2、修改画笔颜色
接下来是对画笔进行应用:
- 1、在OnLButtonUp中创建画笔,命名为NewPen;
- 2、用CreatePen()设置画笔的属性,分别是:画笔的线型是实线PS_SOLID、画笔宽度为3、颜色为RGB值红色;
- 3、用SelectObject()将画笔选入了设备描述表;
- 4、最后用DeleteObject()删除画笔NewPen。
编写代码:
CPen NewPen, * pOldPen;
NewPen.CreatePen(PS_SOLID,3,RGB(255,0,0));
pOldPen = pDC->SelectObject(&NewPen);
NewPen.DeleteObject();
【SelectObject()】
把一个对象(位图、画笔、画刷等)选入指定的设备描述表。新的对象代替同一类型的老对象。
这样修改之后,重新运行,会发现线条的颜色变成了红色,另外线条的宽度也变宽了。
3、绘制矩形
还可以在该代码的基础上继续做更改:
既然可以通过P0、P1两个点绘制直线,那么同样的,P0、P1两个点也可以作为矩形的对角点、来绘制矩形。
- 1、在OnLButtonUp中将MoveTo()和LineTo()绘制直线的代码注释掉;
- 2、用Rectangle()绘制矩形。
编写代码:
//将之前绘制直线的代码注释掉
/*pDC->MoveTo(P0);
pDC->LineTo(P1);*/
pDC->Rectangle(CRect(P0,P1));
运行后,就可以在窗口绘制矩形了(此时后绘制的矩形会覆盖、遮住先绘制的矩阵)
4、绘制椭圆
同样的思路,P0、P1这两个点也可以作为椭圆外接矩形的对角点:
椭圆外接矩形:包围椭圆的最小矩形
直接将Rectangle()改成Ellipse()就可以了。
编写代码:
pDC->Ellipse(CRect(P0, P1));
这样就可以运行、绘制椭圆了(同样上面的椭圆会把下面的椭圆遮住,说明矩形和椭圆都是能够填充的,而且默认的填充色是白色)
5、填充颜色
用画刷能够填充封闭物体,这里使用画刷来填充椭圆:
- 1、新建画刷,命名为NewBrush;
- 2、用CreateSolidBrush()设置画刷属性,颜色为绿色;
- 3、用SelectObject()将画刷选入设备描述表后,再绘制椭圆进行填充,所以需要写在Ellipse()前面;
- 4、最后用DeleteObject()删除画刷NewBrush。
编写代码:
CBrush NewBrush, * pOldBrush;
NewBrush.CreateSolidBrush(RGB(0, 128, 0));
pOldBrush = pDC->SelectObject(&NewBrush);
NewBrush.DeleteObject();
运行后发现椭圆被填充为绿色了,说明椭圆是能够被填充的;
另外椭圆的边界为红色、内部为绿色,说明画刷和画笔是互不影响的。