基于MFC的简单画图程序实验Word文件下载.docx
《基于MFC的简单画图程序实验Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于MFC的简单画图程序实验Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
3)鼠标的按下响应函数OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数OnMouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),确定终点坐标,刷新,得到绘制图形。
4)选择图形或其它属性,可进行下一次绘制。
图1程序流程图
3软件设计
3.1设计步骤
1)创建单文档
创建一个MFCAppWizard[exe]工程,命名为“yinshuyan”,如图2所示,并创建单文档,如图3所示。
创建成功后,系统自动生成相应的类,如图4所示。
图2创建工程
图3创建单文档
图4生成类
2)编辑菜单
添加需要的菜单项,如图5所示(可以通过拖动调整菜单的顺序);
并在菜单的属性中设定好所对应的ID,如图6所示,各项菜单对应的ID如表1所示(其中线宽菜单为弹出菜单,只需在菜单项目属性中的弹出选项前打勾即可,分隔线亦只需在菜单项目属性中选中分隔符(Separator)选项即可)。
图5添加菜单项
图6设置菜单ID
表1菜单项对应ID
菜单名
ID
直线
ID_LINE
线宽1
ID_W1
矩形
ID_RECT
线宽2
ID_W2
椭圆
ID_ELLIPSE
线宽3
ID_W3
颜色
ID_COLOR
线宽4
ID_W4
填充色
ID_FILLCOLOR
线宽5
ID_W5
建立类向导,在视图类CyinshuyanView(通过菜单View->
ClassWizard,或者快捷键Ctrl+w打开)中,对各菜单项添加对应的COMMAND消息处理函数,部分菜单项还添加对应的UPDATE_COMMAND_UI消息函数,如图7所示。
图7建立类向导【注意:
此图有误,Classname的下拉框中,
应选择“CyinshuyanView”而非此图显示的“CMainFrame”】
上述操作完成后,可以发现在ClassCMainFrame中自动增加了类似OnLine()之类的许多函数,并且在源文件MainFrm.cpp中,自动添加了相应的消息映射。
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND(ID_LINE,OnLine)
……
END_MESSAGE_MAP()
3)创建工具栏
在插入处选择资源(菜单Insert->
Resource,或者快捷键Ctrl+R),新建工具栏,如图8所示;
图8新建工具栏
在工具栏上添加相应的按钮,在属性处更改其ID,如图9所示。
图9编辑工具栏
4)在相应消息函数处添加代码,实现其功能
建立类向导,在视图类CyinshuyanView中,添加WM_PAINT消息,以及WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE消息,并在其中添加相应的代码,如图10所示。
图10添加WM_PAINT消息
3.2界面设计
各控件名称,类型,属性及相关变量如表2所示。
表2界面控件表
控件名称
控件类型
属性
相关变量
绘图
下拉式菜单
无
直线
菜单项
工具栏按钮
intshape
菜单项
线宽
弹出式菜单
intw
颜色(线色)
COLORREFm_nColor
COLORREFm_fColor
3.3关键源代码
1)在“MainFrm.h”中,在classCMainFrame:
publicCFrameWnd里的protected下定义:
CToolBarm_drawToolBar;
//工具栏
2)在“MainFrm.cpp”中,在CMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)里添加以下代码:
if(!
m_drawToolBar.Create(this)||
!
m_drawToolBar.LoadToolBar(IDR_DRAW))
{TRACE0("
Failedtocreatestatusbar\n"
);
return-1;
}
3)在“YinshuyanView.h”中,在classCYinshuyanView:
publicCView里的public下定义相关变量:
COLORREFm_nColor;
COLORREFm_fColor;
CPointcpoint;
CPointopoint;
BOOLm_Down;
intw;
intshape;
4)在“YinshuyanView.cpp”中,添加如下函数及代码:
CYinshuyanView:
CYinshuyanView()
{w=1;
//初始线宽默认为1
shape=0;
}
voidCYinshuyanView:
OnW1()
{
w=1;
//令线宽为1
}
voidCYinshuyanView:
OnW2()
w=2;
//令线宽为2
voidCYinshuyan:
OnW3()
w=3;
//令线宽为3
OnW4()
w=4;
//令线宽为4
OnW5()
w=5;
//令线宽为5
OnUpdateW1(CCmdUI*pCmdUI)
pCmdUI->
SetRadio(w==1);
//当线宽为1时,此选项前标有圆点
OnUpdateW2(CCmdUI*pCmdUI)
SetRadio(w==2);
//当线宽为2时,此选项前标有圆点
OnUpdateW3(CCmdUI*pCmdUI)
SetRadio(w==3);
//当线宽为3时,此选项前标有圆点
OnUpdateW4(CCmdUI*pCmdUI)
SetRadio(w==4);
OnUpdateW5(CCmdUI*pCmdUI)
SetRadio(w==5);
OnLine()
shape=1;
//选择直线,则令shape为1
OnRect()
shape=2;
//选择矩形,则令shape为2
OnEllipse()
shape=3;
//选择椭圆,则令shape为3
OnUpdateLine(CCmdUI*pCmdUI)
SetCheck(shape==1);
//shape为1时,直线选项前打上勾
OnUpdateRect(CCmdUI*pCmdUI)
SetCheck(shape==2);
//shape为2时,矩形选项前打上勾
OnUpdateEllipse(CCmdUI*pCmdUI)
SetCheck(shape==3);
//shape为3时,椭圆选项前打上勾
OnColor()
CColorDialogColor;
//创建颜色对话框
if(Color.DoModal()==IDOK)//如果用户点击OK按钮
m_nColor=Color.GetColor();
//更改颜色,把颜色赋到m_nColor
OnFillColor()
CColorDialogFillColor;
if(FillColor.DoModal()==IDOK)//如果用户点击OK按钮
m_fColor=FillColor.GetColor();
//更改颜色,把颜色赋到m_fColor
OnPaint()
CPaintDCdc(this);
//devicecontextforpainting
CPenpen;
//定义画笔
CBrushbrush;
//定义画刷
pen.CreatePen(PS_SOLID,w,m_nColor);
//创建画笔
brush.CreateSolidBrush(m_fColor);
//创建画刷
dc.SelectObject(&
pen);
//获取画笔
brush);
//获取画刷
if(shape==1)
{dc.MoveTo(opoint.x,opoint.y);
dc.LineTo(cpoint.x,cpoint.y);
}//绘制直线,从opoint到cpoint连线
if(shape==2