MFC绘图文档格式.docx
- 文档编号:19539522
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:24
- 大小:379.21KB
MFC绘图文档格式.docx
《MFC绘图文档格式.docx》由会员分享,可在线阅读,更多相关《MFC绘图文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
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
//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
virtual~CGraphicView();
#ifdef_DEBUG
virtualvoidAssertValid()const;
virtualvoidDump(CDumpContext&
dc)const;
#endif
//Generatedmessagemapfunctions
//{{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
intm_DoubleLine;
CSettingDlg(CWnd*pParent=NULL);
//standardconstructor
//DialogData
//{{AFX_DATA(CSettingDlg)
enum{IDD=IDD_DLG_SETTING};
CButtonSTm_btnST;
CSXBtnm_btnCancel;
CTestBtnm_btnTest;
//记录线宽
intm_nLineStyle;
//记录线型
//}}AFX_DATA
//{{AFX_VIRTUAL(CSettingDlg)
virtualvoidDoDataExchange(CDataExchange*pDX);
//DDX/DDVsupport
//Generatedmessagemapfunctions
//{{AFX_MSG(CSettingDlg)
afx_msgvoidOnChangeLineWidth();
afx_msgvoidOnRadio1();
//实线型
afx_msgvoidOnRadio2();
//虚线型
afx_msgvoidOnRadio3();
//点线型
afx_msgvoidOnPaint();
afx_msgHBRUSHOnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor);
//颜色选择函数
virtualBOOLOnInitDialog();
afx_msgvoidOnRadio4();
//双线型
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;
//为所绘图形做标记,下同
}
OnLine()
m_nDrawType=2;
OnRectangle()
m_nDrawType=3;
OnEllipse()
m_nDrawType=4;
OnArc()
m_nDrawType=5;
OnRoundrect()
m_nDrawType=6;
OnLButtonDown(UINTnFlags,CPointpoint)
Addyourmessagehandlercodehereand/orcalldefault
m_ptOrigin=point;
//记录鼠标左键按下起始位置
CView:
OnLButtonDown(nFlags,point);
OnLButtonUp(UINTnFlags,CPointpoint)
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(&
//保存文件,以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)//绘制双线型图形,下同
{
penl);
dc.MoveTo(m_ptOrigin.x,m_ptOrigin.y);
dc.LineTo(point.x,point.y);
m_dcMetaFile.SelectObject(&
m_dcMetaFile.MoveTo(m_ptOrigin.x,m_ptOrigin.y);
m_dcMetaFile.LineTo(point.x,point.y);
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);
case3:
if(m_nLineStyle==3)
dc.SelectObject(&
m_dcMetaFile.SelectObject(&
dc.Rectangle(CRect(m_ptOrigin,point));
m_dcMetaFile.Rectangle(CRect(m_ptOrigin,point));
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));
dc.Rectangle(CRect(m_ptOrigin,point));
m_dcMetaFile.Rectangle(CRect(m_ptOrigin,point));
case4:
if(m_nLineStyle==3)
{dc.SelectObject(&
dc.Ellipse(CRect(m_ptOrigin,point));
m_dcMetaFile.Ellipse(CRect(m_ptOrigin,point));
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));
case5:
dc.Arc(CRect(m_ptOrigin,point),m_ptOrigin,point);
m_dcMetaFile.Arc(CRect(m_ptOrigin,point),m_ptOrigin,point);
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 绘图