《2022年完整word版,C++实验报告》由会员分享,可在线阅读,更多相关《2022年完整word版,C++实验报告(12页珍藏版)》请在金锄头文库上搜索。
1、VC+ 程序设计实验报告一、实验目的掌握 MFC 编程二、实验内容用 MFC 向导创建单文档应用程序,一个简单的画图程序。使用 C语言实现使用 VC 6.0 集成开发环境开发使用 MFC 应用程序开发框架三、实验步骤基本功能描述 1. 打开 exe 文件, 在绘图下拉菜单中可分别设置绘制的图形形状,如直线、曲线、矩形及椭圆,线宽选项,有1-6 可供选择,线型选项有实线、虚线、点线和点段线供设置, 还可以设置线色以及填充色, 通过弹出的颜色对话框选择需要的颜色,如果不选择线宽、线色以及填充色,则按默认的画笔,画刷来绘制选择的图形。 2. 选择好图形后, 通过鼠标可以绘制出相应的直线,矩形或椭圆,
2、 鼠标的按下确定图形的起点, 鼠标的拖动则确定了图形的终点,即通过鼠标的拖动来决定图形的大小,当鼠标弹起,此图形则绘制完毕。设计思路1. 对需要用到的变量进行初始化。2. 选择相应的图形之后就响应相应的消息处理函数,给 shape赋对应的值。选择不同的线宽,线色与填充色,即可改变画笔或画刷的属性。3. 鼠标的按下响应函数OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数OnMouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),确定终点坐标,刷新,得到绘制图形。4. 选择图形或其它属性,可进行下一次绘制。软件设计A 设计步骤 1.创建单文档
3、创建一个 MFC AppWizardexe工程,命名为“ Draw ” ,如图 1 所示,并创建单文档,如图 2 所示。创建成功后,系统自动生成相应的类,如图3 所示。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 12 页图 1 创建工程图 2 创建单文档精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 12 页图 3 生成类2. 编辑菜单添加需要的菜单项,如图4 所示;并在菜单的属性中设定好所对应的ID,如图 5 所示,各项菜单对应的ID 如表 1 所示(其中线宽菜单为弹出菜单
4、,只需在菜单项目属性中的弹出选项前打勾即可,分隔线亦只需在菜单项目属性中选中分隔符选项即可)。图 4 添加菜单项精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 12 页图 5 设置菜单 ID 表 1 菜单项对应 ID 建立类向导,在视图类 CDrawView 中, 对各菜单项添加对应的COMMAND消息处理函数,部分菜单项还添加对应的UPDATE_COMMAND_UI消息函数,如图 6 所示。菜单名ID 菜单名ID 菜单名ID 直线ID_LINE 线宽 1 ID_W1 实线ID_SOLID 矩形ID_RECT 线宽 2 ID_W2 虚线
5、ID_DASH 椭圆ID_ELLIPSE 线宽 3 ID_W3 点线ID_DOT 颜色ID_COLOR 线宽 4 ID_W4 点段线ID_DASHDOT 填充色ID_FILLCOLOR 线宽 5 ID_W5 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 12 页图 6 建立类向导3. 在相应消息函数处添加代码,实现其功能建立类向导,在视图类CDrawView 中,添加 WM_PAINT 消息,以及WM_LBUTTONDOWN 、WM_LBUTTONUP 、WM_MOUSEMOVE 消息,并在其中添加相应的代码。B 关键功能实现 1.选
6、择要绘制的图形在直线、矩形以及椭圆的消息处理函数里为shape 分别赋值为1,2,3 ,在OnPaint()函数里添加 3 个 if语句的代码来这实现这三个图形的绘制:当选择画直线时, shape =1,则执行绘制直线代码,当选择画矩形时,shape =2, 则执行绘制矩形的代码,当性选择画椭圆时, shape =3, 则执行绘制椭圆的代码。2. 改变线宽在 OnPaint()创建的画笔中, pen.CreatePen(penstyle,w, m_nColor),线宽处用w 表示,则改变w 的值即改变了画笔的粗细。选择菜单绘图线宽选择划线宽度值,此时所选的线宽值就赋给线宽变量w。若不选择线宽值
7、,则w=1(即默认线宽值为 1)。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 12 页3. 改变线型在 OnPaint()创建的画笔中, pen.CreatePen(penstyle,w, m_nColor),线型处用penstyle表示,则改变 penstyle的值即改变了画笔的类型。选择菜单绘图线型选择线型,此时所选的线型就赋给线型变量penstyle。若不选择线型值,则penstyle=ID_SOLID(即默认线型为实线 )。4. 改变线色在 OnPaint()创建的画笔中, pen.CreatePen(penstyle,w,
8、 m_nColor),线的颜色处用 m_nColor 表示,则改变m_nColor 即改变了画笔的颜色。选择菜单绘图颜色,会弹出通过 WM_COLORREF 从系统中引入的颜色选择对话框,选择颜色后,点击确定则相应颜色值就赋给变量m_nColor,此时画笔的颜色就会发上变化。若不选择颜色,则默认(线)颜色为黑色。4. 改变填充色在 OnPaint()创建的画刷中, brush.CreateSolidBrush(m_fColor),颜色就是用m_fColor 表示的,改变 m_fColor 即改变了画刷的颜色。 选择菜单绘图填充色,会弹出通过 WM_COLORREF 从系统中引入的颜色选择对话框
9、,选择颜色后,点击确定则相应颜色值就赋给变量m_fColor,此时画刷的颜色就会发上变化。若不选择颜色,则默认填充色为黑色。5. 绘制图形鼠标 左 键 按下 ,则 捕获 鼠标 此 时 的位 置坐标 为 画图 的 起点 ,此 时 在OnLButtonDown()函数里,将捕获的坐标值赋给定义作为起点的变量opoint;按下鼠标左键拖动鼠标时,捕捉鼠标当前位置坐标值为终点坐标值,此时在OnMouseMove()函数里,把捕获的坐标值赋给定义作为终点的变量cpoint,OnPaint()中绘图的代码中的坐标都得到了,进行绘图;鼠标左键弹起时,此时绘图结束,鼠标弹起时所在位置就是画图的最终终点位置,画
10、图结束后,刷新窗口,以便重新画图,此时执行的是OnLButtonUp()函数。四、 结果及源代码4.1 运行结果1. 点击链接,编译,运行后的窗口如图7 所示。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 12 页图 7 运行结果4.2 程序代码1. 在视图类构造函数中对各定义变量初始化CDrawView:CDrawView() w=1;/ 初始状态时线宽shape=1;/初始状态时形状m_nColor=RGB(0,0,0);/ 初始状态时线色m_fColor=RGB(0,0,0);/ 初始状态时填充色penstyle=PS_SOLI
11、D;/ 初始化线型为实线 2. 形状函数void CDrawView:OnLine() shape=1; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 12 页 void CDrawView:OnRect() shape=2; void CDrawView:OnEllipse() shape=3; 3. 线宽改变函数void CDrawView:OnW1() w=1; void CDrawView:OnW2() w=2; void CDrawView:OnW3() w=3; void CDrawView:OnW4() w=4; voi
12、d CDrawView:OnW5() w=5; void CDrawView:OnW6() w=6; 4. 线型选择函数void CDrawView:OnSolid() penstyle=PS_SOLID; void CDrawView:OnDash() penstyle=PS_DASH; void CDrawView:OnDot() 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 12 页 penstyle=PS_DOT; void CDrawView:OnDashdot() penstyle=PS_DASHDOT; 5. 颜色选择函
13、数void CDrawView:OnColor() CColorDialog Color;/ 创建颜色对话框if(Color.DoModal()=IDOK)/如果用户点击OK 按钮 m_nColor=Color.GetColor();/ 更改颜色 ,把颜色赋到m_nColor 6. 填充色选择函数void CDrawView:OnFullcolor() CColorDialog FullColor;/创建颜色对话框if(FullColor.DoModal()=IDOK)/如果用户点击OK 按钮 m_fColor=FullColor.GetColor();/更改颜色 ,把颜色赋到m_nColor
14、 7. 单击、移动、绘画函数void CDrawView:OnLButtonDown(UINT nFlags, CPoint point) m_Down=TRUE; /鼠标按下SetCapture(); /获取坐标opoint=point; /把鼠标所在坐标赋给起点坐标opoint ReleaseCapture(); /释放坐标CView:OnLButtonDown(nFlags, point); void CDrawView:OnLButtonUp(UINT nFlags, CPoint point) m_Down=FALSE; /鼠标不按下,即弹起Invalidate(0); /刷新CVi
15、ew:OnLButtonUp(nFlags, point); void CDrawView:OnMouseMove(UINT nFlags, CPoint point) if(m_Down) /如果鼠标按下 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 12 页cpoint=point; /把鼠标所在点坐标赋给终点坐标cpoint CClientDC dc(this); if(4=shape)/ 画曲线 CPen pen(PS_SOLID,10,RGB(255,0,0); CPen *oldpen=dc.SelectObject(&p
16、en); dc.MoveTo(opoint); dc.LineTo(cpoint); dc.SelectObject(oldpen); opoint=cpoint; CView:OnMouseMove(nFlags, point); void CDrawView:OnPaint() CPaintDC dc(this); / device context for painting CPen pen; /定义画笔CBrush brush; /定义画刷pen.CreatePen(penstyle,w, m_nColor); /创建画笔brush.CreateSolidBrush(m_fColor);
17、 /创建画刷dc.SelectObject(&pen); /获取画笔dc.SelectObject(&brush); /获取画刷if(1=shape)/ 画直线 dc.MoveTo(opoint.x,opoint.y); dc.LineTo(cpoint.x,cpoint.y); / 绘制直线 ,从 opoint 到 cpoint 连线 if(2=shape)/ 画矩形 dc.Rectangle(opoint.x,opoint.y,cpoint.x,cpoint.y); /绘制矩形 if(3=shape)/ 画椭圆 dc.Ellipse(opoint.x,opoint.y,cpoint.x,c
18、point.y);/绘制椭圆 8. 菜单勾选函数void CDrawView:OnUpdateLine(CCmdUI* pCmdUI) pCmdUI-SetCheck(shape=1); /shape为 1 时,直线选项前打上勾 void CDrawView:OnUpdateRect(CCmdUI* pCmdUI) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 12 页pCmdUI-SetCheck(shape=2); /shape为 2 时,直线选项前打上勾 void CDrawView:OnUpdateEllipse(CCmdU
19、I* pCmdUI) pCmdUI-SetCheck(shape=3); /shape为 3 时,直线选项前打上勾 void CDrawView:OnUpdateW1(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=1); /当线宽为1 时,此选项前标有圆点 void CDrawView:OnUpdateW2(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=2); /当线宽为2 时,此选项前标有圆点 void CDrawView:OnUpdateW3(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=3); /当线宽为3 时,此选项前标
20、有圆点 void CDrawView:OnUpdateW4(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=4); /当线宽为4 时,此选项前标有圆点 void CDrawView:OnUpdateW5(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=5); /当线宽为5 时,此选项前标有圆点 void CDrawView:OnUpdateW6(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=6); /当线宽为6 时,此选项前标有圆点 void CDrawView:OnUpdateSolid(CCmdUI* pCmdUI) pCmdU
21、I-SetRadio(penstyle=PS_SOLID); /当线型为实线时,此选项前标有圆点 void CDrawView:OnUpdateDash(CCmdUI* pCmdUI) pCmdUI-SetRadio(penstyle=PS_DASH); /当线型为虚线时,此选项前标有圆点 void CDrawView:OnUpdateDot(CCmdUI* pCmdUI) pCmdUI-SetRadio(penstyle=PS_DOT); /当线型为点线时,此选项前标有圆点 void CDrawView:OnUpdateDashdot(CCmdUI* pCmdUI) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 12 页pCmdUI-SetRadio(penstyle=PS_DASHDOT); /当线型为点段线时,此选项前标有圆点 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 12 页,共 12 页