C++课设:简单画图程序

  • 格式:doc
  • 大小:214.50 KB
  • 文档页数:29

下载文档原格式

  / 29
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简单画图程序

1.基本功能描述

本次课程设计的任务是利用计算机和VC开发环境编写一个简单画图程序,该程序的设计指标(即主要功能)有:①用鼠标拖动绘制圆、椭圆、矩形,线等基本图形;②能控制画笔的线宽和颜色;③能对图形进行颜色填充;④在鼠标移动的过程中能实时显示当前绘制的图形。

除了以上几点功能,我有另外添加了工具栏、铅笔、橡皮等功能来使程序更方便地让用户使用,简化了人机交互的过程。

2.设计思路

首先是界面的问题,既然课设的题目是简单画图,那在建立工程的时候就要选择文档结构而不是以前做的基于对话框。可选择单文档结构或多文档结构,但想到画图界面一般只有一个,从简洁的角度考虑,选择单文档结构。而且用户界面在设计的时候要尽可能简单美观,一目了然,对相应功能有图标提示,使用户方便使用。

然后便是画图功能的具体实现。分析课设要求,可以发现功能一要求的的椭圆、矩形、直线可以分别通过Ellipse();、Rectangle();、MoveTo();、LineTo();这四个函数来实现。功能二控制画笔线宽和颜色可以给二者分别关联参数,通过改变线宽参数值来控制线宽,通过调用通用对话框改变颜色参数值来控制颜色。功能三对图形进行颜色填充虽以前未接触过,但查阅资料后发现可以调用ExtFloodFill();并合理设定参数值来实现。功能四的实时显示功能可以通过调用MouseMove();函数来实现。

这些功能需要建立菜单资源来表示各个功能选项,并建立相应的消息响应函数来进行实现。另外,画图程序主要是通过鼠标来进行操作,所以要对鼠标消息的响应及处理函数多下功夫来思考和编写。

至于额外添加的功能,工具栏通过添加工具栏资源和关联相应菜单中画图功能ID实现;铅笔、橡皮的功能则是利用MouseMove();函数,在其中做了一些改动来实现。

2.1.程序流程图:

开始

3.软件设计

3.1.设计步骤

1)打开VS2010,选择新建项目,选中MFC应用程序,标题为CWN_Graphic;

2)选择单文档结构,其他为默认值,点击完成。

3.2 .界面设计

3.2.1.添加菜单

1)选择资源视图,鼠标右键,添加,资源;

2)在资源视图中打开添加的菜单资源,将各个功能的名称添加进去并合理安排,并设

置好相应的ID,如图2:

图2 编辑菜单及相应ID

3.2.2 .添加工具栏

1)在资源视图下右键选择添加资源,ToolBar;

2)打开新建的工具栏,在上面添加各个小按钮,按钮图像自行画出;

3)将每个按钮的ID与菜单项一一对应起来,如图3:

图3 工具栏样式及ID

3.3.关键功能实现

1)打开类向导;

2)为各个菜单项添加消息函数,如图4:

图4 添加消息函数

相关ID、关联变量及响应函数如表1:

表1 相关功能ID 及所关联变量

3)按照所需在CWN_GraphicView.h中添加变量并在CWN_GraphicView.cpp中对变量初始化:

UINT m_nDrawType = 0;//绘画类型初始为0

CPoint m_ptOldOrigin = 0;//坐标点初始为(0,0)

CPoint m_ptNewOrigin = 0;

UINT m_nLineWidth = 0;//线宽初始为0

UINT m_EraserWidth = 1;//橡皮初始大小为1

INT m_nLineStyle = 0;//线宽初始为0

BOOL m_Pen = FALSE;//画笔功能未被选中

BOOL m_Eraser = FALSE;//橡皮功能未被选中

BOOL m_LButtonDown = FALSE;//鼠标左键未按下

BOOL m_Fill = FALSE;//填充功能未被选中

COLORREF m_clr = RGB(0,0,0);//颜色初始值为黑色

4)在各响应函数中添加相应代码,例如:

/**********左键按下************/

/*该函数实现了再鼠标左键按下时确定按下点的坐标、将左键被按下置为1和判断是否填充选项被选中,若选中则进行填充,未选中则无操作*/

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

{

m_ptNewOrigin=point; //将当前点坐标传给变量

m_ptOldOrigin=point;

m_LButtonDown=TRUE; //左键按下赋值1

if(m_Fill==TRUE) //填充功能

{

CClientDC dc(this);

HBRUSH hBrush=CreateSolidBrush(m_clr); //选择画刷

dc.SelectObject(hBrush);

dc.ExtFloodFill (m_ptNewOrigin.x,m_ptNewOrigin.y,RGB(0,0,0),0);

//该函数将使用当前刷子填充显示表面区域

}

CView::OnLButtonDown(nFlags,point);

}

/***********左键松开************/

/*该函数通过在鼠标左键松开时,将松开点坐标传给PC,并由之前选择的绘画类型来判断要进行的绘画操作*/

void CCWN_GraphicView::OnLButtonUp(UINT nFlags , CPoint point)

{

m_LButtonDown=FALSE; //左键松开赋值0

CClientDC dc(this);

CPen pen(m_nLineStyle,m_nLineWidth,m_clr); //创建画笔画刷

dc.SelectObject (&pen); //选择画笔

CBrush*pBrush=CBrush::FromHandle

((HBRUSH)GetStockObject(NULL_BRUSH));

dc.SelectObject (pBrush); //选择画刷

m_ptNewOrigin=point; //左键松开的坐标点送给m_ptNewOrigin

switch(m_nDrawType)

{

case 1:/*******画点*******/

dc.SetPixel(point,m_clr);

break;

case 2:/*******画线*********/

dc.MoveTo (m_ptOldOrigin);

dc.LineTo (m_ptNewOrigin);

break;

case 3:/**********画矩形**********/

dc.Rectangle (CRect(m_ptOldOrigin,m_ptNewOrigin));

break;

case 4:/*********画椭圆**********/