MFC绘图版 软件说明书.docx
《MFC绘图版 软件说明书.docx》由会员分享,可在线阅读,更多相关《MFC绘图版 软件说明书.docx(35页珍藏版)》请在冰豆网上搜索。
MFC绘图版软件说明书
广西工学院计算机工程系
《Windows程序设计》
课程设计说明书
课题名称:
学生姓名:
学号:
班级:
指导教师:
完成日期:
年月日
目录
1.问题陈述及其软件功能概述.............................................P
2.总体设计………………………………………………….P
3.详细设计和部分程序代码………………………...……..P
4.运行结果及分析………………………………………….P
5.总结……………………………………………………….P
1.问题陈述及其软件功能概述
1.1问题陈述
本次课程设计,我所选择的题目是<多功能绘图软件>。
面临以下主要几个问题:
1)如何用鼠标进行画图?
2)如何绘制一下几种图形,线,带箭头的线,任意线,圆,椭圆,矩形?
3)如何在内存中保存以上几种图形?
4)如何将图形保存到文件中去?
5)如何从文件中读取以前画过的图形?
面临以下几个次要的问题:
1)如何选择绘画的类型?
2)如何改变画笔的颜色和宽度和形状?
3)如何实现图形的橡皮条功能?
4)如何实现图形中的透明画刷功能?
5)如何实现图形的重绘?
6)如何实现画图工具栏?
7)如何实现状态栏鼠标坐标显示和当前时间显示?
8)如何打开txt文档以及如何改变显示文本的字体?
9)如何打开bmp文件?
10)如何打开wav文件?
1.2软件功能概述
软件主要有以下几个主要功能
1)用鼠标可以绘制图形,包括一下几种:
直线,带箭头的线,任意线,圆形,椭圆,矩形。
2)可以对画笔进行设置:
画笔的颜色,画笔的线宽,画笔的形状。
3)可以保存所有的图形到内存中,所有图形绘制后,拉动窗口发生重绘不改变。
4)可以将所有绘制的图形保存到文件中,并且可以读取。
5)可以“新建”空白绘图文档。
6)可以查看最近打开的文档。
7)可以打印用户绘制好后的图形,打印预览你绘制的图形。
8)可以完成一部分的“撤消”功能,(注:
任意曲线的图形绘制撤消不能实现)
9)可以完成图形“清空”功能。
有以下几个次要功能
1)有个软件启动画面。
2)有个绘图工具栏。
3)在状态栏可以显示鼠标的坐标和当前的时间。
4)可以打开txt文本文件,并且修改字体。
5)可以打开bmp图像文件,并且显示图像。
6)可以打开wav音频文件,并且播放音乐。
2.总体设计
本程序用的MFC中的单文档文档/视图类结构。
在视图类中完成图形的绘制,显示,重绘,清空,撤消,设置画笔,设置字体,打开txt,wav,bmp文件。
在文档类保存了,绘制图形的各种数据,所有图形的点的坐标,画笔的信息。
3.详细设计
设计了保存图形的类
classCGraph:
publicCObject//派生于CObject
{//将CGraph串行话需要5个步骤
//1.要派生于CObject类
//2.重新写voidSerialize(CArchive&ar)
//3.正在头文件定义宏定义DECLARE_SERIAL(CGraphPoint)
//4.无参数的构造函数CGraph();
//5.在实现文件cpp中使用宏定义DECLARE_SERIAL(CGraph,CObject,1/*类的版本号*/)
DECLARE_SERIAL(CGraph)//文档串行化的宏定义DECLARE_SERIAL(CGraph)
public:
voidSerialize(CArchive&ar);//重新写Serialize函数
voidDraw(CDC*pDC);//绘图的方法
UINTm_DrawIndex;//绘图的类型
CPointm_FirstPoint;//起始坐标
CPointm_SecondPoint;//结束坐标
COLORREFm_color;//颜色
UINTm_nLineWidth;//线宽í
intm_nLineStyle;//线形
CGraph();
CGraph(UINTDrawIndex,CPointFirstPoint,CPointSecondPoint,COLORREFcolor,UINTLineWidth,intLineStyle);//4个参数构造函数
virtual~CGraph();
};
实现文件
IMPLEMENT_SERIAL(CGraph,CObject,1)
//文档串行化的宏定义DECLARE_SERIAL(CGraph)
CGraph:
:
CGraph()
{
}
CGraph:
:
CGraph(UINTDrawIndex,CPointFirstPoint,CPointSecondPoint,COLORREFcolor,UINTLineWidth,intLineStyle)
{//5¸ö²ÎÊýµÄ¹¹Ô캯Êý
this->m_DrawIndex=DrawIndex;
this->m_FirstPoint=FirstPoint;
this->m_SecondPoint=SecondPoint;
this->m_color=color;
this->m_nLineStyle=LineStyle;
this->m_nLineWidth=LineWidth;
}
CGraph:
:
~CGraph()
{
}
voidCGraph:
:
Draw(CDC*pDC)
{//CGraphµÄ»æ»·½·¨¸ù¾Ým_DrawIndexµÄ²»Í¬µ÷Óò»Í¬µÄ»·¨
CPenhpen(m_nLineStyle,m_nLineWidth,m_color);
CBrush*pBrush=CBrush:
:
FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush*pOldBrush=pDC->SelectObject(pBrush);
switch(m_DrawIndex)
{
case1:
pDC->SelectObject(&hpen);
pDC->MoveTo(m_FirstPoint);
pDC->LineTo(m_SecondPoint);
break;
case2:
break;
case3:
{
floatflRlt;
flRlt=(float)((m_FirstPoint.x-m_SecondPoint.x)*(m_FirstPoint.x-m_SecondPoint.x)+(m_FirstPoint.y-m_SecondPoint.y)*(m_FirstPoint.y-m_SecondPoint.y));
flRlt=sqrt(flRlt);
if(flRlt==0)
return;
floatflLength=15;
floatflAngle=100;//ÉèÖÃÓÐÏò¼ýÍ·µÄ½Ç¶È
floattmpX=(float)(m_SecondPoint.x)+((float)(m_FirstPoint.x)-(float)(m_SecondPoint.x))*flLength/flRlt;
floattmpY=(float)(m_SecondPoint.y)+((float)(m_FirstPoint.y)-(float)(m_SecondPoint.y))*flLength/flRlt;
floatfl1X=(tmpX-(float)(m_SecondPoint.x))*cos(-flAngle/2)-(tmpY-(float)(m_SecondPoint.y))*sin(-flAngle/2)+(float)(m_SecondPoint.x);
floatfl1Y=(tmpY-(float)(m_SecondPoint.y))*cos(-flAngle/2)+(tmpX-(float)(m_SecondPoint.x))*sin(-flAngle/2)+(float)(m_SecondPoint.y);
floatfl2X=(tmpX-(float)(m_SecondPoint.x))*cos(flAngle/2)-(tmpY-(float)(m_SecondPoint.y))*sin(flAngle/2)+(float)(m_SecondPoint.x);
floatfl2Y=(tmpY-(float)(m_SecondPoint.y))*cos(flAngle/2)+(tmpX-(float)(m_SecondPoint.x))*sin(flAngle/2)+(float)(m_SecondPoint.y);
pDC->SelectObject(&hpen);
pDC->MoveTo(m_FirstPoint);
pDC->LineTo(m_SecondPoint);
pDC->MoveTo(m_SecondPoint.x,m_SecondPoint.y);
pDC->LineTo(fl1X,fl1Y);
pDC->MoveTo(m_SecondPoint.x,m_SecondPoint.y);
pDC->LineTo(fl2X,fl2Y);
pDC->MoveTo(fl1X,fl1Y);
pDC->LineTo(fl2X,fl2Y);
}
break;
case4:
{
pDC->SelectObject(&hpen);
pDC->Ellipse(CRect(m_FirstPoint,m_SecondPoint));
pDC->SelectObject(pOldBrush);
}
break;
case5:
{
pDC->SelectObject(&hpen);
pDC->Ellipse(CRect(m_FirstPoint,m_SecondPoint));
pDC->SelectObject(pOldBrush);
}
break;
case6:
{
pDC->SelectObject(&hpen);
pDC->Rectangle(CRect(m_FirstPoint,m_SecondPoint));
pDC->SelectObject(pOldBrush);
}
break;
}
}
voidCGraph:
:
Serialize(CArchive&ar)
{//ÓÃCArchive½øÐÐÎļþ²Ù×÷
//>>µÄ˳ÐòºÍ<<µÄ˳ÐòÒªÏàͬ
if(ar.IsStoring())
{
ar<}
else
{
ar>>m_DrawIndex>>m_FirstPoint>>m_SecondPoint>>m_color>>m_nLineWidth>>m_nLineStyle;;
}
}
任意曲线类
classCStroke:
publicCObject//ÈÎÒâÇúÏßµÄÀà
{
public:
CStroke(UINTnPenWidth,COLORREFcolor);
protected:
CStroke();
DECLARE_SERIAL(CStroke)
//Attributes
protected:
UINTm_nPenWidth;//onepenwidthappliestoentirestroke
COLORREFm_color;//颜色
public:
CArraym_pointArray;//seriesofconnectedpoints
//Operations
public:
BOOLDrawStroke(CDC*pDC);
public:
virtualvoidSerialize(CArchive&ar);
};
实现文件CStroke.cpp
IMPLEMENT_SERIAL(CStroke,CObject,2)
CStroke:
:
CStroke()
{
//Thisemptyconstructorshouldbeusedbyserializationonly
}
CStroke:
:
CStroke(UINTnPenWidth,COLORREFcolor)
{
m_nPenWidth=nPenWidth;
m_color=color;
}
voidCStroke:
:
Serialize(CArchive&ar)
{
if(ar.IsStoring())
{
ar<<(WORD)m_nPenWidth<m_pointArray.Serialize(ar);
}
else
{
WORDw;
ar>>w>>m_color;
m_nPenWidth=w;
m_pointArray.Serialize(ar);
}
}
BOOLCStroke:
:
DrawStroke(CDC*pDC)
{
CPenpenStroke;
if(!
penStroke.CreatePen(PS_SOLID,m_nPenWidth,m_color))
returnFALSE;
CPen*pOldPen=pDC->SelectObject(&penStroke);
pDC->MoveTo(m_pointArray[0]);
for(inti=1;i{
pDC->LineTo(m_pointArray[i]);
}
pDC->SelectObject(pOldPen);
returnTRUE;
}
线形状和线宽设置对话框类
classCSettingDlg:
publicCDialog
{
public:
CSettingDlg(CWnd*pParent=NULL);
//{{AFX_DATA(CSettingDlg)
enum{IDD=IDD_DIALOG1};
UINTm_nLineWidth;//线宽
intm_nLineStyle;//线形状
COLORREFm_color;//线的颜色
//}}AFX_DATA
//Overrides
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CSettingDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
protected:
//Generatedmessagemapfunctions
//{{AFX_MSG(CSettingDlg)
afx_msgvoidOnPaint();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
实现文件CSettingDlg.cpp
CSettingDlg:
:
CSettingDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CSettingDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CSettingDlg)
m_nLineWidth=0;
m_nLineStyle=-1;
//}}AFX_DATA_INIT
}
voidCSettingDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSettingDlg)
DDX_Text(pDX,IDC_EDIT2,m_nLineWidth);
DDX_Radio(pDX,IDC_RADIO1,m_nLineStyle);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSettingDlg,CDialog)
//{{AFX_MSG_MAP(CSettingDlg)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//CSettingDlgmessagehandlers
voidCSettingDlg:
:
OnPaint()
{//这里添加了代码用于对话框的示例显示
CPaintDCdc(this);//devicecontextforpainting
//TODO:
Addyourmessagehandlercodehere
UpdateData();
CPenpen(m_nLineStyle,m_nLineWidth,m_color);//定义画笔
dc.SelectObject(&pen);
CRectrect;//定义矩形区域
GetDlgItem(IDC_STATIC1)->GetWindowRect(&rect);//得到示例静态空间的矩形区域
ScreenToClient(&rect);///坐标转换
dc.MoveTo(rect.left+20,rect.top+rect.Height()/2);
dc.LineTo(rect.right-20,rect.top+rect.Height()/2);
//DonotcallCDialog:
:
OnPaint()forpaintingmessages
}
在CMainFrame中添加的代码
添加成员变量CToolBarm_newToolBar一个新的绘图工具栏
在CMainFrame中的OnCreat()函数中添加的代码:
CSplashWnd:
:
ShowSplashScreen(this);//启动画面
Sleep(1000);//程序暂停
//------------------新建画图工具栏-----------------------------------//
if(!
m_newToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|
CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||
!
m_newToolBar.LoadToolBar(IDR_DRAW_TOOLBAR))
{
TRACE0("Failedtocreatetoolbar\n");
return-1;//failtocreate
}
m_newToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_newToolBar);
在CMFCDoc中添加的代码
CMFCDoc.h中
public:
virtual~CMFCDoc();
CPenm_penCur;//pencreatedaccordingto
CTypedPtrListm_strokeList;
UINTm_nPenWidth;//currentuser-selectedpenwidth
COLORREFm_color;//颜色«
CPen*GetCurrentPen();
CStroke*NewStroke();
voidInitDocument();//初始化任意曲线的画笔
voidDeleteContents();//删除任意曲线
BOOLOnOpenDocument(LPCTSTRlpszPathName);
CMFCDoc.cpp中
CStroke*CMFCDoc:
:
NewStroke()
{//н¨newStrokeº¯Êý
POSITIONpos=GetFirstViewPosition();
CMFCView*pView=(CMFCView*)GetNextView(pos);
//获取视类的指针
//获取视类的画笔宽度和颜色
m_nPenWidth=pView->m_nLineWidth;
m_color=pView->m_color;
CStroke*pStrokeItem=newCStroke(m_nPenWidth,m_color);
m_strokeList.AddTail(pStrokeItem);
SetModifiedFlag();//Markthedocumentashavingbeenmodified,for
//purposesofconfirmingFileClose.
returnpStrokeItem;
}
BOOLCMFCDoc:
:
OnNewDocument()
{/新建空白文档
if(!
CDocument:
:
OnNewDocument())
returnFALSE;
//TODO:
addreinitializationcodehere
//(SDIdocumentswillreusethisdocument)
/新建空白文档就是把当前的数据全部删除掉
POSITIONpos=GetFirstViewPosition();
CMFCView*pView=(CMFCView*)GetNextView(pos);
intmax=pView->m_graph.GetSize();
for(inti=0;i{
pView->m_graph.RemoveAt(max-i-1);
}
returnTRUE;
}
///////////