




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象程序设计实验报告实验名称 Windows编程 专业班级 数学与应用数学1201班学 号 1304120306姓 名 谢 伟指导老师 朱世华目 录1前言2 Windows编程概要 2.1实验要求 2.2主要仪器设备 2.3实验内容与简3 Windows编程 3.1使用MFC编写Windows程序 3.2处理菜单和工具栏 3.3在窗口中绘图 3.4创建文档和改进视图 3.5使用对话框和控件4实验总结与心得体会5参考文献1前言充分理解C+之后,就可以着手开发Windows基本类(Microsoft Foundation Classes ,MFC)分装了Windows API,提供了全面而易于使用的功能,从而能够使用本地C+开发高性能的Windows应用程序。本实验侧重于Windows编程,详细的呈现了如何使用MFC提供的构建GUI的功能编写本地C+Windows应用程序以及如何在C+/CLI Windows应用程序中使用.NET Framework。主要包括创建并使用通过控件来构建应用程序的图形用户界面,处理因用户与程序的交互作用而产生的事件。2 Windows编程概要2.1实验要求通过创建超过2000行的代码的大型可运行的应用程序,使用MFC来开发本地Windows应用程序,在试验中应该涵盖使用MFC提供的一系列的用户界面功能,使用C+/CLI编写Windows程序,相应的开发一个与本地C+应用程序具有相似用户界面特性的Windows Forms应用程序2.2主要仪器与设备Visual C+20102.3实验内容与简介使用MFC编写Windows程序,使用Application Wizard为MFC程序生成代码,以及代码中包含的功能,构建一个初步的Sketcher程序,我们通过逐渐的添加功能和代码,拓展Sketcher程序,最终得到一个相当大的、可以实际应用的Windows程序,该程序几乎包含了所有基本的用户界面编程技术。3 Windows编程3.1使用MFC编写Windows程序3.1.1 MFC文档/视图的概念文档模板对象创建文档对象和框架窗口对象,而文档视图是由框架窗口对象创建的,为所有的MFC编程所必须的应用程序对象创建文档模板对象本身,他们之间的相互关系如下图示应用程序和MFC,它包含四个基类,他们几乎出现在所有的基于MFC的Windows应用程序中应用程序类CMyApp框架窗口类CMyWnd视图类CMyView,该类定义如何在CMyWnd对象创建窗口的工作区中显示CMyDoc对象包含的数据文档类CMyDoc,该类定义包含应用程序数据的文档下图示4个基本基类3.1.2创建MFC应用程序创建MFC应用程序的过程就像创建控制台程序一样简单:在此过程中仅仅多出了很少的几个选项。首先要通过选择File|New|Project菜单创建一个新的项目,或者使用快捷键Ctrl+Shift+N创建,在随后出现的New Project对话框中,选择MFC作为项目类型,并选择MFC Application作为要使用的模板,还要输入项目名称Sketcher,当单击New Project对话框窗口中的OK按钮之后,将看到MFC Application对话框,这里可以选择提供应用程序使用的选项,现在把该项目创建为MDI应用程序,对于Application组的选项:保留默认选项Multiple documents ,但不选择Tabbed documents选项Project style选择MFC standard选项,Visual style and colors选择Windows Native/Default选项保持Use Unicode libraries选项在Application Wizard对话框中的Document Template Properties选项组下面: 把文件的拓展名指定为ske. 在Generated Classes选项默认设置的情况下,更改其设置,以便使SketcherView类的基类是CView。 运行程序: 3.2处理菜单和工具栏这一部分主要是通过添加菜单项,来处理需要绘制的元素类型和选择绘图的颜色。在Sketcher程序中添加菜单的步骤是:a. 定义要出现在主菜单栏上和每个菜单中的菜单项b. 决定应用程序中哪些类应当处理每个菜单项的消息c. 在菜单消息的类中添加消息处理函数d. 在类中添加函数,以更新菜单的外观,显示当前的有效选择e. 添加工具栏按钮以及每个菜单项的工具提示3.2.1菜单的元素创建和编辑菜单选项选择Resource View窗格,单击空心符号展开菜单资源,现在来修改具有标示符IDR_SketcherTYPE的菜单,双击IDR_SketcherTYPE出现图示Editor窗格窗体:a.在菜单栏中添加菜单项单击菜单栏中标有Type Here的菜单框,输入第一个菜单项E&lement,这将把l选作快捷键字母,输入名称后,右击新菜单项,并从弹出菜单中选择属性菜单项,显示它的属性,图示: b.在Element菜单中添加菜单项 在Element弹出式菜单中单击第一个项,然后输入标题Line,并按下Enter键,右击选择属性菜单项,此处ID不需要修改,由于这个菜单是弹出菜单的第一部分,因此Pooup属性应该设置为True,同时建议输入Drawing Lines作为Prompt属性的值,图示: c.完成菜单 创建需要的其它Element弹出式菜单项:Rectangle、Circle和Curve。接受这些菜单项的默认ID,Prompt属性值分分别设置为Rectangle、Circle和Curve。在菜单栏上还需要一个Color菜单,它具有弹出式菜单项Black、Red、Green和Blue,使用默认ID,把Prompt属性值作为每个菜单项状态栏提示符添加进来,把Color拖到紧挨Element右边,图示: 3.2.2为菜单添加消息处理程序 现在为Black菜单项创建一个事件处理程序,右击这个选项,在弹出式菜单中选择Add Event Handler菜单项,图示: 单击Event Handler Wizard对话框中的类名CSketcherDoc,使他突出显示,然后单击Command消息类型,再单击Add and Edit按钮,现在按照完全相同的方法给其他的颜色菜单ID和所有的Element菜单ID添加COMMAND,消息处理程序。 编写消息函数的代码:1. 添加存储颜色和元素模式的成员在Class View选项卡中右击类名CSketcherDoc,然后从出现的弹出式菜单中选择Add|Add Aariable菜单项,出现对话框向导:单击Finish按钮完成,同样的方式添加变量m_Color,二者的区别主要在于后者需要在Variable type:框中输入COLORREF。2. 初始化新的类数据成员右击Solution Explorer选项卡中的Header Files文件夹,然后从弹出式菜单中选择Add|Add New Item菜单项,创建一个新文件,选择新文件类型(.h),然后输入头文件名SketcherConstants,单击Add按钮,在Editor窗口中输入如下所示的常量定义:#pragma once#include SketcherConstants.henum ElementTypeLINE,RECTANGLE,CIRCLE,CURVE,TEXT;const COLORREF BLACK=RGB(0,0,0);const COLORREF RED=RGB(255,0,0);const COLORREF GREEN=RGB(0,255,0);const COLORREF BLUE=RGB(0,0,255);const COLORREF SELECT_COLOR=RGB(255,0,180);在CSketcherDoc类的构造函数中添加如下代码:CSketcherDoc:CSketcherDoc():m_Element(LINE),m_Color(BLACK)/ TODO: 在此添加一次性构造代码现在为菜单的创建的处理函数添加代码:void CSketcherDoc:OnElementLine()/ TODO: 在此添加命令处理程序代码m_Element=LINE;void CSketcherDoc:OnColorBlack()/ TODO: 在此添加命令处理程序代码m_Color=BLACK;其他的可以类似添加。3. 运行拓展后的程序4. 添加更新用户界面的消息处理程序右击Color菜单的Black选项,从弹出式菜单中选择Add Event Handler菜单项,然后把CSketcherDoc选作类,把UPDATE_COMMAND_UI选作消息类型,单击Add and Edit按钮。在Class View选项卡中选择OnUpdateColorBlack()处理程序后完成更新处理程序的编写void CSketcherDoc:OnUpdateColorBlack(CCmdUI *pCmdUI)/ TODO: 在此添加命令更新用户界面处理程序代码pCmdUI-SetCheck(m_Color=BLACK);void CSketcherDoc:OnUpdateElementLine(CCmdUI *pCmdUI)/ TODO: 在此添加命令更新用户界面处理程序代码pCmdUI-SetCheck(m_Element=LINE);其它菜单项的更新处理函数的添加和编写可类比进行。运行程序: 3.2.3添加工具栏按钮 单击Resource View选项卡,看到两个工具栏,右击IDR_MAINFRAME_256,并从弹出菜单中选择Open菜单项,则会显示编辑器窗口,第一个图标表示Line,其他的类比创建,还有Color菜单项中的弹出式菜单按钮,右击工具栏中的新按钮,并从弹出式菜单中选择属性菜单项,单击ID属性,单击下拉箭头,从列表框中选择ID_ELEMENT_LINE。其它菜单类似处理。现在需要对IDR_MAINRARM工具栏重复整个过程。 运行程序: 3.3在窗口中绘图 3.3.1对鼠标进行编程 1.鼠标发出的消息 在Class View窗格中右击类名CSketcherView,然后选择属性菜单项,然后单击消息按钮,则出现一个消息ID列表,他们的前缀是WM_。对WM_LBUTTONUP的消息选择OnLButtonUp。对消息WM_LBUTTON和WM_MOUSEMOVE消息重复这个过程。 2.使用鼠标绘图 现在对CSketcherView类添加变量CPoint,并在该构造函数的初始化列表中将这个变量的初始值设置为0,而且在相应的函数中把这个初始值修改为CPoint(0,0): CSketcherView:CSketcherView():m_FirstPoint(CPoint(0,0)/ TODO: 在此处添加构造代码 3.3.2定义元素的类 在Class View窗格中右击Sketcher,选择Add|Class菜单项创建新的CElement类,从安装列表模板中选择MFC,然后在中心窗格中选择MFC Class选项,单击Add按钮,弹出如下对话框: 单击Finish按钮。 使用相同的过程添加其他的元素类,但应该把类类别选作C+,对于Cline类,Class Wizard窗口应该如下: 对CTrangle、CCircle和CCurve进行相同的操作。 在SketcherView.cpp文件中添加#include “Element.h”指令。1. CElement类:把CElement的定义修改为:class CElement : public CObjectpublic:virtual CElement();virtual void Draw(CDC* pDC)virtual void Move(const CSize& aSize)CRect GetBoundRect() const;protected:int m_PenWidth;COLORREF m_Color;protected:CElement();2. Cline类修改Cline类的定义:class CLine :public CElementpublic:virtual CLine(void);virtual void Draw(CDC* pDC);CLine(const CPoint& start,const CPoint& end,COLORREF aColor,int PenWidth);protected:CPoint m_StartPoint;CPoint m_EndPoint;CLine(void);接下来添加Cline类的构造函数。并且对CRectangle、CCircle和CCurve类同样进行修改定义,添加构造类函数。 3.3.3完成鼠标消息处理程序 编写OnMouseMove()处理程序。创建元素,把CreateElement()函数作为protect成员添加到CSketcherView类的Operations部分中。在.cpp中添加函数的完整定义。编写WM_LBUTTONUP消息完成创建元素的过程。运行程序:3.4创建文档和改进视图 3.4.1创建草图类文档 对草图使用list容器,在CSketcherDoc类的定义中进行的操作如下: #pragma once#include sketcherconstants.h#include #include Element.h#include atltypes.h public: unsigned int GetElementType() const / Get the element type return m_Element; COLORREF GetElementColor() const / Get the element color return m_Color; void AddElement(CElement* pElement) m_ElementList.push_back(pElement); protected:/ current drawing colorCOLORREF m_Color;ElementType m_Element;std:list m_ElementList; 现在实现文档类的析构函数和绘制文档函数,在程序中获得工作文档需要的最后一件事是在CSketcherView类的OnButtonUp()处理程序中添加代码,从而在文档中添加元素,运行程序: 3.4.2改进视图 更新多个视图,只需从CSketcherView类的OnButtonUp()函数调用UpdateAllViews()即可,这时打开CSketcherView类的属性窗口,单击属性窗口中的Overrides按钮,在重写函数列表中单击OnUpdate,从下拉列表中添加该函数。在Editor窗格中添加重写函数的代码: void CSketcherView:OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)/ TODO: 在此添加专用代码和/或调用基类if(pHint)InvalidateRect(static_cast(pHint)-GetBoundRect());elseInvalidateRect(nullptr); /invalidate the client area 滚动视图,首先把SketcherView类的基类从CView修改为CScrollView,该类的.cpp文件开始的也需要修改基类。通过CSketcherView的重写函数添加OnInitialUpdate()重写函数并定义,相应的修改OnButtonUp()、OnMouseMove()和OnUpdate()函数。 3.4.3删除和移动形状、实现上下文菜单 在资源视图的窗格中,右击Menu文件夹选择Insert Menu项,创建一个新菜单,将其ID修改为IDR_LEEMENT_MENU。在菜单栏上创建新的菜单项element,在元素的弹出式菜单中添加Move和Delete,保持默认ID不变: Save该菜单,创建一个新的菜单,其ID为IDR_NOELEMENT_MENU,标题为noelement,下拉式菜单和主菜单栏上的Element和Color上的菜单项相同,中间添加分隔符,可以通过Copy和Paste快捷实现。 现在关联菜单和类,选择CSketcherApp类,打开PreLoadState()成员函数的定义添加相应的代码。 然后在OnContextMenu()处理程序中添加下面的代码: void CSketcherView:OnContextMenu(CWnd* pWnd, CPoint point)#ifndef SHARED_HANDLERS/theApp.GetContextMenuManager()-ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);if(m_pSelected)theApp.GetContextMenuManager()-ShowPopupMenu(IDR_ELEMENT_MENU,point.x,point.y,this);elsetheApp.GetContextMenuManager()-ShowPopupMenu(IDR_NOELEMENT_MENU,point.x,point.y,this);#endif 标识选定的元素,为了跟踪元素位于哪个光标下面,可以在OnMouseMove()函数中添加代码,为了实现代码,在CSketcherView文档类中创建FindElement()函数,并实现它。 突出显示元素,主要通过修改元素的Draw()函数来完成这个任务,以Cline成员为例,其他的成员函数做类似的修改,所要修改的地方包括修改基类CElement的定义,修改Cline的定义,最后修改元素的Draw()函数,同时,还要在CSketcherConstants.h文件中添加SELECT_COLOR的定义: #pragma once#include SketcherConstants.henum ElementTypeLINE,RECTANGLE,CIRCLE;const COLORREF BLACK=RGB(0,0,0);const COLORREF RED=RGB(255,0,0);const COLORREF GREEN=RGB(0,255,0);const COLORREF BLUE=RGB(0,0,255);const COLORREF SELECT_COLOR=RGB(255,0,180); 绘制突出显示的元素,位置是在视图类的OnDraw()函数中。 处理菜单消息,为添加的Move和Delete菜单项的处理程序添加代码,首先处理Delete菜单的代码: void CSketcherView:OnElementDelete()/ TODO: 在此添加命令处理程序代码if(m_pSelected) CSketcherDoc* pDoc=GetDocument();/get the document pointerpDoc-DeleteElement(m_pSelected);/delete the elementpDoc-UpdateAllViews(nullptr);/redraw all the viewm_pSelected=nullptr;/reset selected element ptr 在CSketcgerDoc类中把DeleteElement()声明为public成员,并在SketcherDoc,cpp中实现该函数。 移动元素: 首先在视图类projected部分添加3个新成员,而且还要在视图类的构造函数中初始化。接下来修改WM_MOUSEMOVE处理程序,在这里调用了MoveElement()函数,所以在视图类中的protected成员中添加该函数的声明语句 void CSketcherView:MoveElement(CClientDC& aDC,const CPoint& point)CRect oldRect=m_pSelected-GetBoundRect();aDC.LPtoDP(oldRect);m_pSelected-Move(distance);InvalidateRect(&oldRect);UpdateWindow();m_pSelected-Draw(&aDC,m_pSelected); 在基类CElement中添加虚成员函数Move(),从CElement派生类中添加public成员Move()函数的声明,接下来在.cpp文件中添加Cline类Move()函数的实现: void CLine:Move(const CSize& aSize)m_StartPoint+=aSize; /Move the start pointm_EndPoint+=aSize; /and the end pointm_EnclosingRect+=aSize; /move the enclosing rectangle 类比添加移动CRectangle、CCircle和CCurve对象的Move()函数。接着对OnLButtonDown()函数修改突出显示。 接着在视图类添加WM_ONRBUTTONDOWN函数,目的是为了把元素移回原来的位置,代码如下: void CSketcherView:OnRButtonDown(UINT nFlags, CPoint point)/ TODO: 在此添加消息处理程序代码和/或调用默认值if(m_MoveMode)/in moving mode,so drop element back in original positionCClientDC aDC(this);OnPrepareDC(&aDC); /get origin adjustedMoveElement(aDC,m_FirstPos); /move element to original positionm_pSelected=nullptr; /De-select elementGetDocument()-UpdateAllViews(nullptr); /redraw all the view 3.4.4处理屏蔽的元素 给IDR_ELEMENT_MENU资源中element下拉菜单添加分隔符和一个菜单项: 在视图类的属性窗口中选择Events工具栏按钮双击ID_ELEMEMNT_SENDTOBACK,然后选择COMMAND和右列中的OnElementSendtoback,并编写处理程序。给CSketcherDoc类定义一个返回值为void,形参为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 鱼我所鱼也课件
- 魅力昆虫课件
- 济南市2024-2025学年七年级上学期语文月考模拟试卷
- 济南市2025-2026学年八年级上学期语文期中模拟试卷
- 高速铁路运行管理课件
- 高速收费站安全知识培训课件
- 工程造价咨询及财务审计项目服务方案
- 电脑课件保存至U盘无法打开问题
- 2025年公路水运工程施工企业安全生产管理人员考试题库
- 设备检测技术服务合同
- 2025年全国企业员工全面质量管理知识竞赛题及参考答案
- 2025四川省公安厅招聘辅警(448人)笔试参考题库附答案解析
- 2025秋苏教版(2024)小学科学二年级上册(全册)课时练习及答案(附目录)
- 2025年中学生守则及中学生日常行为规范
- 巡察整改工作课件模板
- 2025年城镇燃气条例竞赛题库
- GB/T 22030-2025车用乙醇汽油调合组分油
- 展厅预算装修方案(3篇)
- 肺癌的护理新进展
- 2025年煤炭矿山职业技能鉴定考试-综采考试历年参考题库含答案解析(5套100道单选题合辑)
- 供电公司保密培训课件
评论
0/150
提交评论