简单画图程序设计

面向对象程序设计

课程设计报告

设计题目: 简单画图程序的设计

学院: 专业: 学号:

姓名: 信息工程学院 计算机科学与技术(交通)

指导教师:

2015 年 1 月 4 日

目录

1. 设计目的和内容­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­1

1.1. 设计目的­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­1

1.2. 设计内容­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­1

2. 基本功能­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­1

2.1. 图形样式­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­1

2.2. 颜色样式­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­2

2.3. 画笔样式­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­2

2.4. 线型选择­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­3

3. 设计思路­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­3

4. 软件设计­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­5

4.1. 设计步骤­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­5

4.2. 界面设计­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­8

4.3. 关键功能的实现­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­9

5. 心得体会­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­11

6. 参考文献­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­11

7. 附录­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­11

7.1. 调试报告­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­11

7.2. 调试结果­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­12

7.3. 关键源代码­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­12

1. 设计目的和内容

1.1. 设计目的

1、 学习Visual C++的MFC 开发程序的步骤

2、 综合运用所学的类、继承和多态的知识

3、 进一步掌握程序调试的方法

1.2. 设计内容

1、 利用MFC 的向导,创建基于单文档的应用程序

2、 编程实现,绘制线、圆、矩形的功能

3、 能够设定当前要画的图形样式(最少为以上3种)和图形颜色(最少能够设为以下

4种颜色:黑、红、绿、蓝)

4、 当窗口重绘后,还能保持原来的图形

5、 选做1:能够选中某些已绘制的图形,并删除之

6、 选做2:能够保存已绘制的图形,下次打开时恢复原状

2. 基本功能

2.1. 图形样式

在菜单栏的设置里面有图形样式的选择,可以点击选中也可以在工具栏里点击图形的图标,能够实现绘制点、直线、矩形和椭圆的功能。

第1页

2.2. 颜色样式

在菜单栏的设置里面有颜色样式的选择,可以点击选中也可以在工具栏里点击颜色的图标,除了能够实现红、绿、蓝、黄、黑的普通选择,同时还加入了一个颜色板,点击更多(…) 可以在调色板上选择任意的颜色。

菜单和工具栏选色:

调色板选色:

2.3. 画笔样式

在菜单栏的设置里面有画笔样式的选择,可以点击选中即改变画笔的线宽,也可以在工具栏里点击表示画笔宽度的快捷按钮,线宽有从标准、一般、略粗和更粗的选择。

第2页

2.4. 线型样式

在菜单栏的设置里面有关于线型的选择,可以点击菜单栏的选项也可以在工具栏里找到表示线型的三个按钮,点击即可修改所选的线型。

3. 设计思路

1、 根据需要用到的变量设定变量并进行初始化

2、 选择相应的图形、颜色、画笔、线型之后就响应相应的消息,给需要的变量赋上相

应类型的值

3、 鼠标按下响应函数OnLBottonDown(),捕捉当前位置得到坐标起点,鼠标弹起响应

函数OnLBottonUp()得到另一个坐标则可以进行图形绘制

第3页

4、 选择其他属性即可进行绘制不同颜色、线宽、线型的图形

5、 流程图如下:

第4页

4. 软件设计

4.1. 设计步骤

1、 创建一个MFC AppWizard工程命名为”ZYFdraw ”,建立一个单文档,系统会自动生

第5页

成相应的类。

第6页

2、 编辑菜单,在菜单里面增加对应的菜单项并设定对应的ID ,需要改变属性只要点击菜单

项就可以。

3、 在相应的消息函数添加代码,实现功能

第7页

4.2. 界面设计

在菜单里面增加绘图按钮,包括“图形样式”、“颜色样式”、“画笔样式”和“线型样式”四个子按钮;在工具栏里面添加相应的快捷按钮,更方便于绘图时候的操作。

添加工具栏的项目:

第8页

4.3. 关键功能的实现

当鼠标点击菜单栏或者工具栏响应的图形和属性按钮时,即可改变所要画的图形以及画笔的属性。

4.3.1. 绘图:左键点击工具栏的四个绘图按钮的任意一个可以选择自己需要的图形(点、直

线、矩形、椭圆),如下图所示:

第9页

4.3.2. 颜色:左键点击工具栏的四个颜色按钮可以选择颜色(红色、绿色、蓝色、黄色)还

可以在菜单栏的绘图的颜色样式里面点击更多出现调色板选择更多的颜色,如下图所示:

4.3.3. 笔宽:左键点击菜单栏的画笔样式或工具栏以下四个按钮即可改变画笔的宽度,如下

图所示:

第10页

4.3.4. 线型:左键点击菜单栏的线型样式或在工具栏点击以下三个按钮可以选择实线、虚线

和点线的线型,如下图所示:

5. 心得体会

这次课程设计我成功的完成了。通过本次的课程设计,我学会了运用鼠标点击完成绘制点、直线、矩形和椭圆的绘图功能。编写一个简单的绘图程序,完成了绘图时图形、颜色、画笔宽度以及线型的选择。

基于这次的课设,对菜单界面的建立,消息响应函数处理,创建句柄都比较熟悉了,但是难的地方在于代码的编写。在这次的课设中由于要绘制图形,所以比较关键的是坐标(m_point,point)两个起点和终点的。因此,我设立了消息响应函数OnLButtonDown()以及OnLButtonUp()还获取鼠标的当前坐标和终点坐标。绘制图形也是在OnLButtonUp() 的函数里面实现的。为了实现图形的重绘,定义了一个Cdraw 的类,在里面重新定义了变量用于保存已绘的图形,其中还是使用了MFC 系统自带的一个CPtrArray 动态数组。在OnLButtonUp()里面绘制图形,通过自定义的类Cdraw 与动态数组CPtrArray 在OnDraw()里面实现重绘,这样使得整个程序的结构较为清楚和简便。 通过这次的课设让我明白了即使一个小小的绘图程序都是如此复杂,更何况是电脑里面的成千上万的程序呢,自己知道的东西还是太少了,以后要加强学习。

6. 参考文献

【1】孙鑫 VC++深入详解(修订版)电子工业出版社 2012年 【2】梁普选 Visual C++程序设计与实践清华大学出版 2005年

【3】严华峰 VISUAL C++课程设计案例精编(第二版)中国水利水电出版社 2004年 【4】魏亮、李春葆等 Visual C++程序设计例学与实践清华大学出版社 2006年

7. 附录

7.1. 调试报告

开始时没有创建Cdraw 类来保存已经绘制的图形,所以每次在绘好图形以后拉动

窗口,图形被刷新就消失了。

在创建了Cdraw 类后我们通过系统自带的动态数组保存已绘的图形,在在OnDraw()里面调用以保存的图形,则在拖动窗口时图形不消失。

第11页

7.2. 调试结果

1、 编译运行后的窗口如下:

2、 改变绘图的画笔粗细,颜色、形状得到的窗口如下:

7.3. 关键源代码

1、在CZYFdrawVIEW 类的头文件中加入私有成员变量: private: int m_lstyle; int m_pwidth; CPtrArray m_cptArray;

第12页

COLORREF m_color; CPoint m_point;

U INT m_type;

2、其中各个成员变量的代码实现如下: void CZYFdrawView::OnDdot() //点 { // TODO: Add your command handler code here m_type=1; }

void CZYFdrawView::OnDline() //直线 { // TODO: Add your command handler code here m_type=2; }

void CZYFdrawView::OnDrectangle() //矩形 { // TODO: Add your command handler code here m_type=3; }

void CZYFdrawView::OnDellipse() //椭圆 { // TODO: Add your command handler code here m_type=4; }

//颜色

void CZYFdrawView::OnCred() //红色 { // TODO: Add your command handler code here m_color=RGB(255,0,0); }

第13页

void CZYFdrawView::OnCgreen() //绿色 { // TODO: Add your command handler code here m_color=RGB(0,255,0); }

void CZYFdrawView::OnCblue() //蓝色 { // TODO: Add your command handler code here m_color=RGB(0,0,255); }

void CZYFdrawView::OnCyellow() //黄色 { // TODO: Add your command handler code here m_color=RGB(255,255,0); }

void CZYFdrawView::OnCmore() //更多 { // TODO: Add your command handler code here CColorDialog dlg; dlg.m_cc.Flags|=CC_RGBINIT|CC_FULLOPEN;// 弹出对话框 dlg.m_cc.rgbResult=m_color;//记录颜色 if(IDOK==dlg.DoModal()) { m_color=dlg.m_cc.rgbResult; } }

//笔宽

void CZYFdrawView::OnCpslim() //标准 { // TODO: Add your command handler code here m_pwidth=2; }

void CZYFdrawView::OnCpmiddle() //中等

第14页

// TODO: Add your command handler code here m_pwidth=4; }

void CZYFdrawView::OnCpbig() //粗 { // TODO: Add your command handler code here m_pwidth=8; }

void CZYFdrawView::OnCpmore() //更粗 { // TODO: Add your command handler code here m_pwidth=10; }

//线型

void CZYFdrawView::OnLstyle() //实线 { // TODO: Add your command handler code here m_lstyle=0; }

void CZYFdrawView::OnLstyledash() //虚线 { // TODO: Add your command handler code here m_lstyle=1; }

void CZYFdrawView::OnLstyledot() //点线 { // TODO: Add your command handler code here m_lstyle=2; }

3、在OnLButtonDown()中实现记录起点:

void CZYFdrawView::OnLButtonDown(UINT nFlags, CPoint point)

第15页

// TODO: Add your message handler code here and/or call default m_point=point; CView::OnLButtonDown(nFlags, point); }

4、在OnLButtonUp()中实现绘画图形功能的代码如下:

void CZYFdrawView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CClientDC dc(this); CPen pen(m_lstyle,m_pwidth,m_color); dc.SelectObject(&pen);

//空白画刷使图形不覆盖 CBrush* pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); dc.SelectObject(pBrush); switch(m_type) { case 1: dc.SetPixel(point,m_color); break; case 2: dc.MoveTo(m_point); dc.LineTo(point); break; case 3: dc.Rectangle(CRect(m_point,point)); break; case 4: dc.Ellipse(CRect(m_point,point)); break; } dc.SelectObject(pBrush); dc.SelectObject(&pen); Cdraw *pdraw=new Cdraw(m_type,m_color,m_pwidth,m_lstyle,m_point,point); m_cptArray.Add(pdraw); CView::OnLButtonUp(nFlags, point); }

5、在OnDraw()中实现图形重绘之前要自己重新定义一个新的类”Cdraw ”, 并在类中保存需要保存的变量代码如下:

第16页

Cdraw 类

变量全部设为共有类型的: class Cdraw {

public: int m_lstyle; int m_pwidth; UINT m_type; COLORREF m_color; CPoint m_point; CPoint m_ptEnd; Cdraw(); Cdraw(UINT m_type,COLORREF m_color,int m_pwidth,int m_lstyle,CPoint m_point,CPoint m_ptend); virtual ~Cdraw(); private: };

Cdraw::Cdraw(UINT m_type,COLORREF m_color,int m_pwidth,int m_lstyle,CPoint m_point,CPoint m_ptEnd) { this->m_type=m_type; this->m_color=m_color; this->m_pwidth=m_pwidth; this->m_lstyle=m_lstyle; this->m_point=m_point; this->m_ptEnd=m_ptEnd; }

6、实现图形重绘:

void CZYFdrawView::OnDraw(CDC* pDC) { CZYFdrawDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CBrush* pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); pDC->SelectObject(pBrush); for(int i=0;i

pen(((Cdraw*)m_cptArray.GetAt(i))->m_lstyle,((Cdraw*)m_cptArray.GetAt(i))->m_pwidth,((Cdraw*)m_cptArray.GetAt(i))->m_color);

第17页

CPen* pOldPen=pDC->SelectObject(&pen);

switch(((Cdraw*)m_cptArray.GetAt(i))->m_type)

{

case 1:

pDC->SetPixel(((Cdraw*)m_cptArray.GetAt(i))->m_ptEnd,((Cdraw*)m_cptArray.GetAt(i))->m_color);

break;

case 2:

pDC->MoveTo(((Cdraw*)m_cptArray.GetAt(i))->m_point);

pDC->LineTo(((Cdraw*)m_cptArray.GetAt(i))->m_ptEnd);

break;

case 3:

pDC->Rectangle(CRect(((Cdraw*)m_cptArray.GetAt(i))->m_point,((Cdraw*)m_cptArray.GetAt(i))->m_ptEnd));

break;

case 4:

pDC->Ellipse(CRect(((Cdraw*)m_cptArray.GetAt(i))->m_point,((Cdraw*)m_cptArray.GetAt(i))->m_ptEnd));

break;

}

pDC->SelectObject(pOldPen);

}

}

第18页


© 2024 实用范文网 | 联系我们: webmaster# 6400.net.cn