内容发布更新时间 : 2024/11/5 20:31:34星期一 下面是文章的全部内容请认真阅读。
任务二开发一个画图程序
1
(1)软件目标:绘制点、直线、矩形、圆、椭圆,并能进行线宽设置。并设置显示学生信息菜单。
(2)软件设计
A.开发环境
基于VC++6.0的Microsoft Foundation Classes(即MFC)开发。MFC以类的形式封装了windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。在开发过程中运用到了windows的内建控件和组件的封装类。该程序运用了MFC中一个单文档工程进行实现。 B.基本操作流程
打开VC++6.0后点击MFCappwizard(exe),选择单文档创建工程。
打开resource工作空间,在menu中双击
架,设置菜单。菜单设置如下图:
打开主框
首先对菜单项“点”,进行响应。过程如下:
在菜单项“点”上右键,弹出右键菜单,选择“建立类向导”,在Object IDD中选择菜单项“点”的ID,即IDD_DIAN,在Class name中选择
,在Message中选择command后单击add function添加消
息响应函数,并选择edit code进行编辑。如下图所示:
6
为了能区分用户所要绘图的类型,在CHuangweiliang_2View类中添加成员变量m_nDrawType,并在构造函数中初始化:如下图所示
所以IDD_DIAN的消息响应COMMAND函数编写如下
对变量m_nDrawType进行赋值使得,m_nDrawType=1
当用户单击了“点”菜单项后,进入绘图状态,当用户在绘图区按下鼠标左键时画出一个点,所以需要对用户单击鼠标左键是箭头所在的位置坐标,所以又在CHuangweiliang_2View类中添加成员变量
的位置。构造函数中对m_ptOrigin进行初始化,其过程如下图
用来记录初始点
7
其中m_ptOrigin的变量类型为CString。
用void CHuangweiliang_2View::OnLButtonDown(UINT nFlags, CPoint point)函数对按下鼠标左键进行响应,同把得到的点的坐标信息保存在参变量point中,在函数体中把point的值赋给m_ptOrigin,以便绘图函数调用。实现过程如下
有了初始点后便可以画点了。
当松开鼠标左键时,表示用户已经确定了所要画点的位置,在CHuangweiliang_2View类添加成员函数用来响应用户松开左键。
在CHuangweiliang_2View类添加为
在该成员函数中用CClientDC 声明dc(this);,并调用CClientDC 中的SetPixel()成员函数,进行绘图。
使用条件语句对用户所绘画点的类型进行判断,当用户需要画点时m_nDrawType=1,所以用swtich case1 语句进行响应,如下图所示
用得到的初始点传给SetPixel()函数,进行画点,过程如下
8
函数中用RGB()函数制定点的颜色。画点完成。 当用户单击了“直线”菜单项时m_nDrawType的值更改,使得m_nDrawType=2。 由于画直线需要两个点,所以需要对松开鼠标左键的响应函数的到终点的坐标进行获取,终点坐标被保存在参数point中,所以可以直接调用。
绘画直线是需要调用CClientDC中的成员函数MoveTo()和LineTo()。起点的坐标值传递给MoveTo(),终点的坐标值传递给LineTo(),实现如下图
当用户需要绘画矩形时m_nDrawType=3,需要绘画圆时m_nDrawType=4,需要绘画椭圆时m_nDrawType=5,根据m_nDrawType的值switch语句进入不同的分支,调用CClientDC的成员函数。
当绘画矩形时,调用函数Rectangle(),参数为起点m_ptOrigin和终点point 当绘画圆时,调用函数Ellipse(),参数为起点X坐标m_ptOrigin.x,起点Y坐标m_ptOrigin.y,终点X坐标m_ptOrigin.x+100,终点Y坐标m_ptOrigin.y+100,此因为调用Ellipse()函数,为保证所画为原型,给定100的终点偏移量。
当需要绘画椭圆时调用函数Ellipse(),参数为起点m_ptOrigin,终点point。 其具体实现过程如下:
所绘画结果如图所示
9
从结果中可以看到,新画的会把原先画的进行覆盖,这是因为系统确实的画刷进行内部填充。现为改善这一缺点,重新设置画刷,添加代码如下
重新绘图结果
10