MFC绘图.docx
- 文档编号:6525755
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:24
- 大小:379.21KB
MFC绘图.docx
《MFC绘图.docx》由会员分享,可在线阅读,更多相关《MFC绘图.docx(24页珍藏版)》请在冰豆网上搜索。
MFC绘图
源码
一、课程设计目的-------------------------------------3
二、课程设计内容与实现的功能-------------------------3
三、系统分析与设计-----------------------------------3
1、系统分析----------------------------------------------------------3
2、系统设计----------------------------------------------------------4
四、系统测试与调试分析-------------------------------8
1、系统测试-----------------------------------------------------------8
2、调试分析-----------------------------------------------------------9
五、用户手册-----------------------------------------10
六、程序清单-----------------------------------------11
七、体会与自我评价-----------------------------------19
八、参考文献-----------------------------------------19
九、课程设计评价-------------------------------------20
一、课程设计目的
进行C++面向对象程序设计课程设计主要是在学习C++这门面向对象语言的基础上,在完成C++面向对象程序设计各部分实验的基础上,通过自学MFC,掌握一种可视化编程的方法,并通过实践加深对可视化编程与C++面向对象程序设计语言特点的认识与理解。
同时,可以提高运用C++编程语言解决实际问题的能力;锻炼实际的编程能力、创新能力及团队组织、协作开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力
选作这个二维图形的设计题目,主要是基于了解在电脑上的画图软件的功能是如何实现的,以及在MFC平台是怎么实现功能调用的,实现图形的绘制,从而可以进一步的了解到c++是如何面向对象的程序设计,以及在我们平常使用的一些软件的一些功能实现的算法。
在一些基本的菜单如:
文件菜单、编辑菜单、工具菜单、还有窗口菜单都是如何实现的。
熟练掌握类的继承、多态和构造函数,以及在VC++6.0的软件的一些扩展功能。
了解编程的实际用处,增加对编程更深入的了解,对自己所学的知识更加深入的学习与掌握。
利用VisualC++设计二维平面图形:
可通过菜单或者工具栏按钮,选择绘画工具,画不同的平面图形(直线、圆弧、矩形、圆角矩形、圆、椭圆等);可通过颜色对话框选择不同的颜色,使所画的图形具有不同颜色;可保存文档所画的图形,并能打开该图形。
二、课程设计内容与实现的功能
可通过菜单或者工具栏按钮,选择绘画工具,画不同的平面图形(直线、圆弧、矩形、圆角矩形、椭圆等);可通过颜色对话框选择不同的颜色,使所画的图形具有不同颜色;可保存文档所画的图形,并能打开该图形。
三、系统分析与设计
1、系统分析
通过本次实验主要实现一些画图的基本功能,本程序可以通过菜单栏或工具栏进行图形的绘制,本程序可以绘制直线、圆弧、矩形、圆角矩形、圆、椭圆等。
图像的颜色可以通过编辑框选择,也可以自定义颜色。
笔画的线性有实线型、虚线型、点画线,也可以自己设定并且设定笔画的宽度(当然必须要大于0),在对话框可以显示你选择的线性。
在完成后可以将自己的作品保存起来,并且能够打开。
为了达到以上所叙述的优点及功能,我使用VC开发平台,MFC框架实现一个画图程序,尽可能多的实现Windows自带的画图功能,并扩展其功能。
并且优化界面,绘图方便。
(1)消息:
菜单命令相应消息,左键按下相应,左键弹起消息相应。
(2)行为。
当收到菜单命令响应时执行相关的函数操作。
当左键按下时,将鼠标的坐标记录下来,当左键弹开时,根据选择执行相关的操作(画出相关的图形)。
(3)表示。
在文件菜单里可以保存和和打开所画的图片。
在绘图菜单里可选择相应的图形,在设置菜单里可选择相应的线型,线宽。
在颜色按钮里可选择相应的颜色。
2、系统设计:
概要设计:
确立如图的系统。
当选择绘图类型时记录所选的类型。
当选择颜色时,记录所选的颜色,当选择线型时再记录所选的线型。
然后当单击时,记录鼠标的坐标,当鼠标弹起时就根据相应的选择画出相应的图形。
详细设计:
首先,新建-个单文档类型地MFCAppWizard(exe)工程,工程取名为:
Graphic。
为此程序添加-个子菜单,菜单名称为"绘图",并为其添加六个菜单项,分别用来控制不同图形地绘制。
当用户选择其中地-个菜单项后,程序将按照当前地选择进行相应图形地绘制。
添加菜单项地ID及名称如表所示。
然后分别为这四个菜单项添加命令响应,本程序让视类(CGraphicView)对这些菜单命令进行响应。
实现画矩形、画椭圆和直线,是通过绘图命令的简单的平面几何体,所以画矩形调用CDC对象Rectangle()函数,画椭圆调用CDC对象Ellipse()函数等。
2.1、模块设计:
2.2、数据结构说明:
classCGraphicView:
publicCview//视图类
{
protected:
//createfromserializationonly
CGraphicView();
DECLARE_DYNCREATE(CGraphicView)
//Attributes
public:
CGraphicDoc*GetDocument();
//Operations
public:
//Overrides
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CGraphicView)
public:
virtualvoidOnDraw(CDC*pDC);//overriddentodrawthisview
virtualBOOLPreCreateWindow(CREATESTRUCT&cs);
protected:
virtualBOOLOnPreparePrinting(CPrintInfo*pInfo);
virtualvoidOnBeginPrinting(CDC*pDC,CPrintInfo*pInfo);
virtualvoidOnEndPrinting(CDC*pDC,CPrintInfo*pInfo);
//}}AFX_VIRTUAL
//Implementation
public:
virtual~CGraphicView();
#ifdef_DEBUG
virtualvoidAssertValid()const;
virtualvoidDump(CDumpContext&dc)const;
#endif
protected:
//Generatedmessagemapfunctions
protected:
//{{AFX_MSG(CGraphicView)
afx_msgvoidOnDot();//点消息函数
afx_msgvoidOnLine();//线的消息函数
afx_msgvoidOnRectangle();//矩形的消息函数
afx_msgvoidOnEllipse();//椭圆的消息函数
afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);//左键按下消息函数
afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);左键弹起消息函数
afx_msgvoidOnSetting();//设置消息函数
afx_msgvoidOnColor();//颜色消息函数
afx_msgvoidOnFont();.//字体消息函数
afx_msgBOOLOnEraseBkgnd(CDC*pDC);
afx_msgvoidOnArc();//圆弧消息函数
afx_msgvoidOnRoundrect();//圆角矩形消息函数
afx_msgvoidOnFileSave();//文件保存消息函数
afx_msgvoidOnFileOpen();//文件打开消息函数
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
//BOOLm_bDrawButton;
//BOOLm_bDraw;//自定义画笔判断
CMetaFileDCm_dcMetaFile;//是否用画笔
CStringm_strFontName;//前一种字形
CFontm_font;//记录字形
COLORREFm_clr;//记录颜色
intm_nLineStyle;//线型
UINTm_nLineWidth;//记录线宽
CPointm_ptOrigin;//记录前一鼠标位置
UINTm_nDrawType;//记录所画形状
};
classCSettingDlg:
publicCDialog
{
//Construction
public:
intm_DoubleLine;
COLORREFm_clr;
CSettingDlg(CWnd*pParent=NULL);//standardconstructor
//DialogData
//{{AFX_DATA(CSettingDlg)
enum{IDD=IDD_DLG_SETTING};
CButtonSTm_btnST;
CSXBtnm_btnCancel;
CTestBtnm_btnTest;
UINTm_nLineWidth;//记录线宽
intm_nLineStyle;//记录线型
//}}AFX_DATA
//Overrides
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CSettingDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//Generatedmessagemapfunctions
//{{AFX_MSG(CSettingDlg)
afx_msgvoidOnChangeLineWidth();
afx_msgvoidOnRadio1();//实线型
afx_msgvoidOnRadio2();//虚线型
afx_msgvoidOnRadio3();//点线型
afx_msgvoidOnPaint();
afx_msgHBRUSHOnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor);//颜色选择函数
virtualBOOLOnInitDialog();
afx_msgvoidOnRadio4();//双线型
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
CFontm_font;
CBrushm_brush;
};
2.3、算法流程图:
四、系统测试与调试分析
1、系统测试
●测试方法:
黑盒
●测试技术:
单元测试
●测试数据:
输入颜色,线型
●测试报告:
画出相应的图形
测试说明
测试名称
二维平面图形设计程序(输入你设计的软件名)
测试目的
验证系统对于系统登录的处理流程
测试技术
单元测试
测试方法
黑盒测试法
测试用例
测试内容
绘图功能—线的设置
测试步骤
按照系统默认的形式
改变颜色
改变线宽
测试数据
线为红色
改为黑色
改为5
预期结果
画黑色细线
画黑色细线
画黑色粗线
测试结果
与预期相符
与预期相符
与预期相符
2、调试分析:
添加新线型,双线性。
因为系统没有双线型,因此要自己设计。
解决方法,在选择此线型时再自定义各个图形的画法。
本程序实现的功能非常简单。
没有实现铅笔的功能,铅笔的画法非常简单,但在其保存时遇到了问题,所以没有实现。
此外还可以加上图元的移动与删除的功能,移动的过程应该是不断的擦除原来的图形再画新图的过程。
也可以加上橡皮擦功能,我设想应该是用背景色填充来实现。
目前的程序利用图元的串行化只能将图片保存为BMP格式,也只能打开BMP格式的文件,以后可以扩充让其实现能打开和保存多种格式的文件。
图形的复制、剪切、粘贴等基本功能也没有实现。
所画图形的种类也比较少,图形的绘制过程不是很友好。
程序中未实现鼠标右键和快捷键的功能,也有待实现。
还有很多很多的地方需要扩充或修改。
五、用户手册
1、使用平台:
操作系统MicrosoftWindows
2、直接点击应用程序Graphic.exe即可。
3、当点击设置时,会弹出设置对话框。
选择相应的图形。
4、当点击颜色对话框时。
弹出颜色对话框,选择颜色。
5.绘制各种图形。
六、程序清单
关键源程序:
CgraphicView类
voidCGraphicView:
:
OnDot()
{
//TODO:
Addyourcommandhandlercodehere
m_nDrawType=1;//为所绘图形做标记,下同
}
voidCGraphicView:
:
OnLine()
{
//TODO:
Addyourcommandhandlercodehere
m_nDrawType=2;
}
voidCGraphicView:
:
OnRectangle()
{
//TODO:
Addyourcommandhandlercodehere
m_nDrawType=3;
}
voidCGraphicView:
:
OnEllipse()
{
//TODO:
Addyourcommandhandlercodehere
m_nDrawType=4;
}
voidCGraphicView:
:
OnArc()
{
//TODO:
Addyourcommandhandlercodehere
m_nDrawType=5;
}
voidCGraphicView:
:
OnRoundrect()
{
//TODO:
Addyourcommandhandlercodehere
m_nDrawType=6;
}
voidCGraphicView:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
m_ptOrigin=point;//记录鼠标左键按下起始位置
CView:
:
OnLButtonDown(nFlags,point);
}
voidCGraphicView:
:
OnLButtonUp(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CClientDCdc(this);
CPenpen(m_nLineStyle,m_nLineWidth,m_clr);
CPenpenm(0,m_nLineWidth*2,m_clr);//粗线画笔
CPenpenl(0,m_nLineWidth,m_clr);//细线画笔
dc.SelectObject(&pen);//主窗口显示
m_dcMetaFile.SelectObject(&pen);//保存文件,以m_dcMetaFile为开头的为保存文件
CBrush*pBrush=CBrush:
:
FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
dc.SelectObject(pBrush);
m_dcMetaFile.SelectObject(pBrush);
switch(m_nDrawType)
{
case1:
dc.SetPixel(point,m_clr);
m_dcMetaFile.SetPixel(point,m_clr);
break;
case2:
if(m_nLineStyle==3)//绘制双线型图形,下同
{
dc.SelectObject(&penl);
dc.MoveTo(m_ptOrigin.x,m_ptOrigin.y);
dc.LineTo(point.x,point.y);
m_dcMetaFile.SelectObject(&penl);
m_dcMetaFile.MoveTo(m_ptOrigin.x,m_ptOrigin.y);
m_dcMetaFile.LineTo(point.x,point.y);
dc.SelectObject(&penm);
m_dcMetaFile.SelectObject(&penm);
dc.MoveTo(m_ptOrigin.x,m_ptOrigin.y+3*m_nLineWidth);
dc.LineTo(point.x,point.y+3*m_nLineWidth);
m_dcMetaFile.MoveTo(m_ptOrigin.x,m_ptOrigin.y+3*m_nLineWidth);
m_dcMetaFile.LineTo(point.x,point.y+3*m_nLineWidth);
}
else
{dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
m_dcMetaFile.MoveTo(m_ptOrigin);
m_dcMetaFile.LineTo(point);}
break;
case3:
if(m_nLineStyle==3)
{
dc.SelectObject(&penl);
m_dcMetaFile.SelectObject(&penl);
dc.Rectangle(CRect(m_ptOrigin,point));
m_dcMetaFile.Rectangle(CRect(m_ptOrigin,point));
dc.SelectObject(&penm);
m_dcMetaFile.SelectObject(&penm);
dc.Rectangle(CRect(m_ptOrigin.x-3*m_nLineWidth,m_ptOrigin.y-3*m_nLineWidth,point.x+3*m_nLineWidth,point.y+3*m_nLineWidth));
m_dcMetaFile.Rectangle(CRect(m_ptOrigin.x-3*m_nLineWidth,m_ptOrigin.y-3*m_nLineWidth,point.x+3*m_nLineWidth,point.y+3*m_nLineWidth));
}
else
{
dc.Rectangle(CRect(m_ptOrigin,point));
m_dcMetaFile.Rectangle(CRect(m_ptOrigin,point));}
break;
case4:
if(m_nLineStyle==3)
{dc.SelectObject(&penl);
m_dcMetaFile.SelectObject(&penl);
dc.Ellipse(CRect(m_ptOrigin,point));
m_dcMetaFile.Ellipse(CRect(m_ptOrigin,point));
dc.SelectObject(&penm);
m_dcMetaFile.SelectObject(&penm);
dc.Ellipse(CRect(m_ptOrigin.x-3*m_nLineWidth,m_ptOrigin.y-3*m_nLineWidth,point.x+3*m_nLineWidth,point.y+3*m_nLineWidth));
m_dcMetaFile.Ellipse(CRect(m_ptOrigin.x-3*m_nLineWidth,m_ptOrigin.y-3*m_nLineWidth,point.x+3*m_nLineWidth,point.y+3*m_nLineWidth));
}
else
{
dc.Ellipse(CRect(m_ptOrigin,point));
m_dcMetaFile.Ellipse(CRect(m_ptOrigin,point));}
break;
case5:
if(m_nLineStyle==3)
{dc.SelectObject(&penl);
m_dcMetaFile.SelectObject(&penl);
dc.Arc(CRect(m_ptOrigin,point),m_ptOrigin,point);
m_dcMetaFile.Arc(CRect(m_ptOrigin,point),m_ptOrigin,point);
dc.SelectObject(&penm);
m_dcMetaFile.SelectObject(&penm);
dc.Arc(CRect(m_ptOrigin.x-3*m_nLineWidth,m_ptOrigin.y-3*m_nLineWidth,point.x+3*m_nLineWidth,point.y+3*m_nLineWidth),m_ptOrigin,point);
m_dcMetaFile.Arc(CRect(m_ptOrigin.x-3*m_nLineWidth,m_ptOrigin.y-3*m_nLineWidth,point.x+3*m_nLineWidth,point.y+3*m_nLineWidth)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 绘图
![提示](https://static.bdocx.com/images/bang_tan.gif)