📄 10.1 简单绘图.txt
字号:
10.1 简单绘图
首先,新建一个单文档类型的 MFC AppWizard (e xe )工程,工程取名为 : Graphic。此程序将实
现简单的绘图功能,包括点、直线和椭圆的绘制。为了实现这些功能,首先为此程序添加一个子菜
单,菜单名称为"绘图",并为其添加四个菜单项,分别用来控制不同图形的绘制。当用户选择其中
的一个菜单项后,程序将按照当前的选择进行相应图形的绘制。添加的四个菜单项的 ID及名称如表
10.1所示。
然后分别为这四个菜单项添加命令响应,本程序让视类( CGraphicView )对这些菜单命令进行响应,
这四个响应函数的名称分别如表 10.1所示。
表 10.1添加的菜单项
菜单项 ID
菜单项命令响应函数
菜单项名称
IDM_DOT
点
OnDot
画点
IDM_LINE
OnLine
直线
IDM_RECTANGLE
OnRectangle
矩形
IDM_ELLIPSE
OnEllipse
椭圆
在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使
用。因此,在 CGraphicView类中添加一个私有变量用来保存用户的选择,该变量的定义如下所述 :
private:
u int m_nDrawTyle;
因此可以利用switch/case语句,来分别完成相应图形的绘制:
·如果要设置一个点,需要用到函数: SetPixel.这也是CDC类的一个成员方法,该函数有两种声明
形式,其中一种如下所示:
、
COLORREF SetPixel(POINT point , COLORREF crColor) ;
该函数是在指定的点设置一个像素。其中第一个参数 (point )就是指定的点,第二个参数 (cR:olor)
就是指定的颜色。在程序中设定的颜色在系统颜色表中可能不存在,但系统会选择一种和这个颜色
最接近的颜色。
本例把点设置为红色。
例:
dc.SetPisel(point,RGB(255,0,0));
·
当用户选择直线时,这时就需要绘制直线,首先调用MoveTo函数移动到原点,然后调用LineTo函数
绘制到终点。
dc.MoveTo(m_nOrigin);
dc.LineTo(point);
·
绘制矩形时可以使用Rectangle函数,该函数有一种声明形式如下所示:
BOOL Rectangle(LPCRECT lpRect) ;
该函数有一个指向CRect对象的参数,而后者可以利用两个点来构造。在这里,需要注意一点,该函
数需要的是指向CRect对象的指针,而上述代码中传递的却是CRect对象(如例 10-4所示代码的第 15
行),但程序编译时却能成功通过,运行时也不会报错,这是为什么呢?我们知道C系列的语言都是强
类型语言,如果类型不匹配的话,需;军进行强制
类型转换。但这里为什么没有进行这样的强制类型转换程序也可以成功通过编辑呢?实际'
上, CRect类提供了这样一个成员函数:重载LPCRECT操作符,其作用是将Rect转换为 LPCRECT类型。
因此,当在程序中给Rectangle函数的参数赋值时,如果发现该参数是一个CRect对象,它就会隐式
地调用LPCRECT操作符,将CRect类型的对象转换为 LPCRECT类型。因此,在给函数传递参数时,如
果我们看到传递的数值类型和所需要的类型不匹配,但编译和运行都正确的情况时,就要想想这其
中的缘由了。当然,有些情况下可能是这些类型之间本来就可以互相转换,例如short类型和int类
型。但是如果参数是对象类型的话,就要考虑了,它选择的是对象的构造方法进行的隐式转换,还
是有其他重载的操作符。像这些知识细节,即类型转换原理上的东西,如果读者能够熟练掌握的话,
当遇到这些情况时,自然就能够想到它采用的是什么样的类型转换。当然在我们思考完之后,应该
到MSDN中进行验证。
dc.Rectangle(CRect(m_nOrigin,point));
.
·当用户选择椭圆菜单项时,调用Ellipse函数绘制一个椭圆。
dc.Ellipse(CRect(m_nOrigin,point);
Build井运行Graphic程序,选择【点】菜单项,然后在窗口中任意单击鼠标左键,可以发现在窗口
中绘制了一些红色的点:选择【直线】菜单项,然后在程序窗口中按下鼠标左键井拖动,当松开鼠标
左键时,就会在窗口中绘制一条从鼠标左键按下点到松开点的直线:选择【矩形】菜单项,然后在程
序窗口中按下鼠标左键并拖动,当松开阔标左键时,就会在程序窗口中绘制一个矩形:选择【椭圆】
菜单项,然后在程序窗口中按下鼠标左键并拖动,当松开鼠标左键时,就会在程序窗口中绘制一个
椭圆。另外,前面的内容已经讲过, DC中有一个默认的白色画刷,在绘制图形时会使用这个默认画
刷填充其内部,因此在绘制时,如果存在重叠部分,那么先前绘制的图形会被后来绘制的图形所覆
盖。程序运
部添加如例 10-7所示代码中加灰显示的代码。 例 10-7
#include "GraphicDoC .h"
#include "GraphicView.h"
#include .SettingDlg.h"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -