为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

第一次作业

2017-11-12 50页 doc 1MB 9阅读

用户头像

is_731942

暂无简介

举报
第一次作业第一次作业 2006.12 1 Visual C++ 6.0开发环境简介 MFC基本编程操作 实验1. VC++6.0基本操作 实验2. 简单图形绘制 实验3. MFC对话框应用程序 实验4. 定时随机数应用 实验5. 对象串行化处理 实验6. 多态类对象的内存映象 实验7. C++文件处理 2 Visual C++ 6.0 Visual Studio 6.0是Microsoft公司推出的一个可视化应用程序集成开发环境(IDE Integrate Develop Environment)。 Visual ...
第一次作业
第一次作业 2006.12 1 Visual C++ 6.0开发环境简介 MFC基本编程操作 实验1. VC++6.0基本操作 实验2. 简单图形绘制 实验3. MFC对话框应用程序 实验4. 定时随机数应用 实验5. 对象串行化处理 实验6. 多态类对象的内存映象 实验7. C++文件处理 2 Visual C++ 6.0 Visual Studio 6.0是Microsoft公司推出的一个可视化应用程序集成开发环境(IDE Integrate Develop Environment)。 Visual Studio IDE不仅支持Visual C++,还支持Visual Basic、Visual J++、Visual InterDev等Microsoft系列开发工具。 Visual Studio包含文本编辑器、资源编辑器、工程编译工具,源代码浏览器、集成调试 工具,以及一套联机文档。使用Visual Studio可以直观方便地完成创建、调试、修改应用程 序等工作。 . Visual C++ (1) 支持面向对象的程序设计 Visual C++支持面向对象程序设计, 可以充分利用面向对象的封装性、多态性,实现 信息隐藏、代码重用、动态绑定等优良程序特性。 (2)支持可视化软件开发 Visual Studio提供的基于图形用户界面(GUI)的各种开发工具,如AppWizard、ClassWizard、WizardBar等,帮助用户生成和维护代码,设计应用程序的用户界面,管理各 种类和对象,从而有效地提高了软件开发的效率。 (3)MFC类库支持 Visual Studio提供的微软基础类库(MFC)包含了用来开发C++和Windows应用程序的一组可重用基础类。 MFC类库已经成为事实上的工业标准类库,得到了众多开发商和软件开发工具的支持。 (4) 应用程序框架支持 基于Windows的用户界面程序设计比较复杂,为方便用户使用Visual C++开发应用程序,MFC封装了Windows的API(应用程序接口)函数等,隐去了创建、维护窗口时的许 多复杂的例行工作,从而大大简化了编程过程。 . Visual Studio Visual Studio提供了一组支持可视化编程实用工具,它们是: Project Manager AppWizard ClassWizard WizardBar Component Gallery 1 Project Manager Visual Studio使用Project Manager来组织项目、元素以及项目信息在屏幕上出现的方式。 通常一个应用程序由多个源代码文件组成。除源代码文件外,应用程序的文件集合中还包含 编译和调试时的参数文件和库文件等。与一个应用程序相关的一组完整的文件集合称作一个 项目(或工程)。 3 每个项目对应一个文件夹,其中包含该项目的所有元素。 一个在VC++IDE中编辑调试的活动项目放在一个工作区(Workshop)中。 一个工作区可以包含: (1) 一个独立的项目; (2) 多个相互独立的项目; (3) 多个相互依赖的项目。 项目管理器Project Manager包含三种视图: Project Manager窗口底部的一组标签,提 供了以不同的角度(视图)查看项目中包 含的工程和联机文档。 (1) FileView(文件视图): 显示所创建的项目中的文件。展开此文件夹可以查看项目中所包含的所有文件。 (2) ClassView(类视图): 显示项目中定义的C++类。展开此文件夹显示工程中所定义的所有类,展开类可查看类 的成员变量和成员函数以及全局变量、函数和类型定义。 4 Project Manager窗口 (3) ResourceView(资源视图): 显示项目中所包含的资源文件。展开此文件夹可显示所有的资源类型。 2.AppWizard() 5 AppWizard是一个C++源代码生成器。它可以产生应用程序的源代码框架。它通过一系列的 对话框提示用户输入对待创建程序的基本支持信息,如:用户程序是对话应用还是单/多文档应用等。 用户通过File/New菜单即可进入AppWizard。 由AppWizard生成的代码构成应用程序的框架,框架为应用程序提供可重用的资源和 代码,避免用户对应用程序共同部分的重复设计。用户所要做的工作只是往框架中添加自己 的处理代码。 3. ClassWizard() ClassWizard是一个交互式工具,用来建立新的类,把控件变量映射为类成员变量,或 者把对消息事件的处理函数映射为类的成员函数。 用户通过View/ClassWizard菜单选项即可进入ClassWizard。 使用ClassWizard,可以从MFC框架基类中派生新类或修改现有的类;可以将成员变量 或成员函数加入到一个类中或修改类中已经存在的成员变量或成员函数。 4. WizardBar() WizardBar用于快速访问一些Visual Studio最常用的功能。 WizardBar工具条由类列表框、过滤器框和成员(Member)框等三个下拉列表框和一个动作 选择控件组成。 类列表框包含了应用程序定义的所有类;当前所选择的类决定可用的过滤器;当前所选 的过滤器决定Member列表中显示的内容。选择Member中的一项,可以跳到相应的成员定 义。 单击WizardBar最右边Action Control 的箭头将弹出一个菜单,用于选择跳到函数定义、 增加消息处理函数等操作。 5. Componet Gallery() Componet Gallery用于保存可以共享和重用的代码。这些代码包括由Visual C++提供的组件和从用户工程中增加到Gallery中的自定义组件。 Visual C++提供了一组应用程序的常用组件,分为两类: Visual Studio Components和Register ActiveX Controls。 其中Visual Studio Components包含了经常使用的一些标准Windows控件,比如:弹出菜单,剪贴板,对话条,带时间显示的定制状态条等。 Register ActiveX controls则用于往程序里添加ActiveX控件。 把组件添到工程文件中的方法: 选择Project/Add to Project/Components and Controls菜单选项。在弹出对话框中,选择 相应的组件,Component Gallery 将自动在用户的工程文件中加入该组件的CPP、H文件以及相关资源,并自动修改用户的源程序代码。 .MFC MFC(Microsoft Foundation Class,微软基础类库)是微软为Windows程序员提供的一个面向对象的Windows编程接口,用以简化Windows编程工作。 用MFC开发的最终应用程序具有标准的、熟悉的Windows界面。事实上,MFC已经成为Windows应用程序界面设计的一个软件标准。 1. MFC 6 类库是可以在应用程序中使用的相互关联的C++类的集合。 类库是可重用的软件资源,可以使用户开发新的应用程序大大简化。类库有些随编译器 提供,有的由第三方软件公司提供,有的则是由用户自己开发的。 MFC为程序员实现了所有应用程序的公共部分,除了包含C++基础类之外,还包含了 WinMain函数(Windows下的主函数)以及其它一些支持菜单、窗口、对话框、设备上下 文等的组件。 MFC的核心是以C++形式封装的Windows API(Application Program Interface,应用程序接口。 MFC可分为基础类、宏和全局函数两个主要部分。 (1)MFC中的基础类 应用程序框架类、应用程序类、命令相关类、文档/视类、线程类、可视对象类、窗口类、 视类、对话框类、属性表、控制类、菜单类、设备描述表、绘画对象类、通用类、文件、诊 断、异常、收集、收集、其它支持类、数据库类等。 (2) 宏和全局函数 若某个函数或变量不是某个类的一个成员,那么它是一个全局函数或变量。 宏和全局函数提供运行时刻对象类型服务、诊断服务、异常处理、CString格式化及信息框显示、消息映射、应用消息和管理、对象连接和嵌入(OLE)服务等。 全局函数以“Afx”为前缀,所有全局变量都是以“afx”为前缀;宏不带何特别前缀,但是 全部大写。 从继承关系来看,可将MFC中的类分成两个大类: 大多数的MFC类是从CObject继承下来的类。 CObject是MFC中定义的所有类的基类。CObject类描述了几乎所有的MFC中其它类的一些公共特性。 另外一些类则不是从CObject类继承下来,它们包括:字符串类CString,日期时间类CTime,矩形类CRect,点CPoint等,用来提供一些程序辅助功能。 2. 应用程序框架指的是为了生成一般的应用程序所必需的各种软组件的集成。一般的类库 只是提供某些特定功能(如图像处理、串行通信)的孤立的类的集合。应用程序框架却定义 了应用程序的结构。它的类既相互独立,又相互依赖,形成一个统一的整体,可以在其基础 上构造大多数应用程序。 一个最小的MFC应用程序所需的框架中包括: 从应用程序类CWinApp中派生而来的CMinMFCApp类; 从框架窗口CFrameWnd类派生而来的CMainWindow类; 并用CMinMFCApp类定义了一个全局对象ThisApp。 在程序运行时,MFC应用程序首先调用由框架提供的标准的WinMain函数。在WinMain函数中,首先初始化由CMinMFCApp定义的惟一的一个实例,然后调用CMinMFCApp继承CWinApp的Run成员函数,进入消息循环。退出时调用CWinApp的ExitInstance函数。 可以看到,应用程序框架不仅提供了构建应用程序所需要的类(CWinApp,CFrameWnd等),还定义了程序的基本执行结构。所有的应用程序都在这个基本结构基础上完成不同的功能。 MFC除了定义程序执行结构之外,还定义了三种基本的主窗口模型:单文档窗口,多文档 窗口和对话框作为主窗口。 7 MFC 利用Visual Studio的可视化编程工具编写程序的基本方法是: 首先利用Visual Studio的可视化编程工具AppWizard生成应用程序框架,然后再往应用程序框架里边填写用户要求解的具体应用问题的代码。 例:用Visual Studio的可视化编程工具编写一个应用程序,要求在应用程序窗口显示 “Hello, World!”字符串。 设计步骤如下: (1) 启动AppWizard 在File菜单下选择 New,弹出New对话框如 图。 选择Projects标签,然后在列表中选择创建MFC AppWizard(exe)程序。 在Project Name编辑框中输入工程文件名Hello。 在Location中指定应用程序创建的位置,缺省情况下AppWizard会自动在当前目录下 以工程文件名为目录名创建一个新目录,在该目录下存放所有该工程的文件。 (2) 选择MFCAppWizard的对话框 AppWizard是一个代码生 成器,它通过一系列提示用户的 对话框来指定将要生成的应用 程序的特性。 MFC AppWizard-Step 1 在Step 1中,可以指定生成框架 的类型,包括 Single Document(单文档应 用程序), Multiple Document(多文档 应用程序), Dialog Based(对话框应用 程序)三种。 还可以从下拉列表框中选择语 言,指定程序资源文件使用的语言类型。 8 MFC AppWizard-Step 2 Step 2的对话框用于指定 数据库选项。 MFC AppWizard支持数据 库并可以生成数据库应用 程序所必需的代码。缺省 值为None,即不使用数据 库特性。 MFC AppWizard-Step 3Step 3用于指定OLE复合文档类型。缺省值为 None,不用OLE特性。 MFC AppWizard-Step 4 Step4指定应用程序的外 观,包括是否使用工具条、 状态栏,是否让文档支持 打印和打印预览功能,是 否使用3D控制外观,以 及是否支持在线帮助等。 9 MFC AppWizard-Step 5 Step5 选项一:是否为生成的源代码添加必要的注释说明。 选项二:选择以动态连接库或静态连接库方式使用MFC类库。 选择使用动态连接库时,所有MFC的类存放在动态连接库中,这样可以使应用程序相对较 小一些,但是发布该应用程序可执行文件时必需提供必要的动态连接库;选择静态连接库时, 应用程序所用到的MFC类都编译进了可执行文件之中,可执行文件比使用DLL方式的要大,但可以单独发行。 一般情况下,对于小的应用程序可以采用静态库方式,对于大的应用程序一般采用动态 连接库方式。 MFC AppWizard-Step 6 Step6让用户选择MFC AppWizard将要创建的类的属性,包括指定存放类的文件名以及这些 类的父类。用户可以修改所创建的类。 新建工程信息框给出待生成程序框架的。确认以后AppWizard将在工程目录C:\ Hello.中生成该工程的全部应用程序框架文件。 框架程序生成后,在项目工作区中将自动打开工程(Hello.dsw)文件。 10 (3) 为应用程序设计代码 要在窗口内显示“Hello,world”,需要手工编辑相应代码。 在类视图(ClassView)中点击CHelloView前面的加号,展开CHelloView树,显示它的类成员函数和数据成员。双击OnDraw成员函数,Visual Studio将打开HelloView.cpp文件并将光标定位在OnDraw成员函数定义的开始处。 在OnDraw函数的 // TODO: add draw code for native data here 处手工加入如下一行代码: pDC->TextOut(100,100,"Hello,World!"); (4) 编译并运行该程序 在Build菜单下有Compile, Build, Rebuild All三个菜单项用于编译程序。其中Compile菜单项用于编译当前打开的活动文档;Build菜单项用于只编译工程中上次修改过的文件, 并链接程序生成可执行文件。如果以前没有作过编译,它会自动调用Rebuild All操作,依次编译资源文件、源程序文件等;Rebuild All菜单项不管文件是否作过修改,都会编译工程 中的所有源文件。 由于编译链接过程中会产生大量的中间文件和目标文件,Visual Studio在Build菜单下提供了Clean菜单项用于清除这些中间文件。用户在完成一个工程后,应及时清理这些中间 文件,否则将浪费大量硬盘空间。 (5) 检查程序运行结果 该程序运行后将弹出应用程序窗口,在应用程序窗口中央显示"Hello,World!"。 AppWizard AppWizard创建的文件包含以下4大类: 工作区文件和项目文件 应用程序源文件和头文件 11 资源文件 预编译头文件 1. Hello.dsw:这是MFC自动生成的工作区文件,它包含当前工作区所包含的项目的信息。 Hello.dsp:这是MFC生成的项目文件,它包含当前项目的设置、所包含的文件等信息。 Hello.clw:这个文件含有被ClassWizard用来编辑现有类或增加新类的信息。ClassWizard还用这个文件来保存创建和编辑消息映射和对话框数据所需的信息,或是创建虚拟成员函数 所需的信息。 Hello.h:这是应用程序的主头文件,它含有所有全局符号和用于包含其它头文件的 #include伪指令 Hello.cpp:这个文件是应用程序的主源文件。它将创建CHelloApp类的一个对象,并重定义InitInstance成员函数。 MainFrm.cpp,MainFrm.h: 这两个文件将从CFrameWnd (SDI选项) 或CMDIFrameWnd (MDI选项)派生CMainFrame类。 如果在AppWizard的Application Options页(MFC AppWizard-Step 4)中选择了对应的可选项的话,CMainFrame类将处理工具条按钮和状态条的创建。MainFrm.cpp文件还含有MFC应用程序提供的默认工具条按钮的对象ID——buttons数组。 3. 项目的头文件及其资源文件: Hello.rc,Resource.h,Hello.rc2。 资源文件含有一般MFC应用程序的默认菜单定义和加速键表、字符串表。它还指定了缺省的About对话框和一个图标文件(Res\Hello. ico)。如果指定了支持工具条,它还将指定工具条位图文件 (Res\Toolbar.bmp)。Hello.rc2用于存放Visual Studio不可直接编辑的资源。 4. Stdafx.cpp,Stdafx.h:这两个文件用于建立一个预编译的头文件Hello.pch和一个预定义的类型文件Stdafx.obj。 由于MFC体系结构非常大,包含许多头文件,如果每次都编译比较费时。因此,系统 把常用的MFC头文件都放在stdafx.h中,如afxwin.h、afxext.h、afxdisp.h、afxcmn.h等,然后让stdafx.cpp包含这个stdafx.h文件。这样,由于编译器可以识别哪些文件已经编译过, 所以stdafx.cpp就只编译一次。采用预编译头文件方法可以加速编译过程。 12 例1:按钮显示的编辑框输出。 1. 使用AppWizard创建一个对话框应用程序Hello1,初始界面如下: 13 2. 定制界面:添加控件、设置标题和属性 控件 ID号 标题 属性 Static Text IDC_STATIC 你的姓名 Static Text IDC_TEXT Edit Box IDC_EDIT1 Align text:Right Button IDC_OK 确定 Button ID_CANCEL 退出 3. 添加成员变量: 选择View/ClassWizard菜单选项进入ClassWizard,打开Member Variables选项卡,添加以下两个成员变量: 控件ID 变量名 变量类型 数值范围 IDC_EDIT1 m_Name CString IDC_TEXT m_Show CString 3. 添加代码: 双击“确定”按钮,打开CHello1Dlg::OnOK()函数,在// TODO: Add extra validation here 后面添加以下代码: void CHello1Dlg::OnOK() { // TODO: Add extra validation here UpdateData(); CString str1="Hello "; CString str2=", Nice to meet you!"; m_Show=str1+m_Name+str2; UpdateData(false); } 说明: UpdateData(true);或UpdateData(); //用控件输入更新数据 UpdateData(false); //将变量的值输出到控件 4. 消息映射: 为上例的对话框应用程序添加标鼠操作代码: 选择View/ClassWizard菜单选项进入ClassWizard,打开Message Mapping选项卡。 14 在Object Ids一栏中选择CHello1Dlg, 在Messages一栏中找到WM_LBUTTONDOWN消息,双击该项,在Member functions一栏中出现消息函数OnLButtonDown: 5. Windows API调用: 双击消息函数,打开对话框的.cpp文件:加入代码——Windows API调用 void CHello1Dlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default MessageBox("Windows API调用"); CDialog::OnLButtonDown(nFlags, point); } 注:这是一个有模式对话框 例2:菜单创建与消息映射。 1. 使用AppWizard创建一个单文档应用程序Menu1,进入资源管理器,打开Menu节点,双击IDR_MAINFRAM菜单资源: 15 2. 双击空白菜单项,在标题处填入“对话框(&D)”。 3. 双击“对话框”菜单项下面的空白菜单项,在标题处填入“响应(&R)Ctrl+R”,在ID处填入IDR_DLG。 4. 添加消息映射: 选择View/ClassWizard菜单选项进入ClassWizard,打开Message Mapping选项卡。 在Class name一栏中选择CMenu1View,在Object Ids一栏中找到IDR_DLG选中,在Messages一栏中选择COMMAND消息,双击该项,出现Add Member Function对话框。单击OK按钮,创建OnDlg函数。 5. 在OnDlg函数中加入代码: void CMenu1View::OnDlg() { // TODO: Add your command handler code here MessageBox(""); } 例3 :简单调色板。 1. 使用AppWizard创建一个对话框应用程序RGB: 16 2. 定制界面:添加控件、设置标题和属性 控件 ID号 标题 属性 Static Text IDC_STATIC 红 Static Text IDC_STATIC 绿 Static Text IDC_STATIC 蓝 IDC_EDIT1 IDC_EDIT1 Align text:Right Button IDC_OK 确定 Button ID_CANCEL 退出 3. 添加成员变量: 选择View/ClassWizard菜单选项进入ClassWizard,打开Member Variables选项卡,添加以下成员变量: 控件ID 变量名 变量类型 数值范围 IDC_EDIT1 m_red int 0-255 IDC_EDIT2 m_green int 0-255 IDC_EDIT3 m_blue int 0-255 IDC_SCROLLBAR1 m_scrollbar1 CScrollBar IDC_SCROLLBAR2 m_scrollbar2 CScrollBar IDC_SCROLLBAR3 m_scrollbar3 CScrollBar 3. 添加代码: (1) 在头文件RGBDlg.h中定义变量: 17 class CRGBDlg : public CDialog { // Construction public: int red; int blue; int green; CRGBDlg(CWnd* pParent = NULL); // standard constructor (2) 在文件RGBDlg.cpp中为刚定义的变量初始化: BOOL CF23Dlg::OnInitDialog() { CDialog::OnInitDialog(); 18 // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here m_scrollbar1.SetScrollRange(0,255); m_scrollbar2.SetScrollRange(0,255); m_scrollbar3.SetScrollRange(0,255); return TRUE; // return TRUE unless you set the focus to a control } (3) 在文件RGBDlg.cpp中为OnPaint()函数添加代码: void CRGBDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CPaintDC dc(this); CRect rect(80,10,240,130); CBrush brush(RGB(0,0,0)); dc.FillRect(&rect,&brush); CDialog::OnPaint(); } } (4) 建立CRGBDlg—WM_HSCROLL—OnHScroll ()消息映射。 (5) 打开CRGBDlg::OnHScroll ()函数,在// TODO: Add your message handler code here and/or 19 call default后面添加以下代码: void CRGBDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default int icur; switch(nSBCode) { case SB_THUMBPOSITION: pScrollBar->SetScrollPos(nPos); break; case SB_LINEDOWN: icur = pScrollBar->GetScrollPos(); icur = icur + 1; if(icur > 255) icur = 255; pScrollBar->SetScrollPos(icur); break; case SB_LINEUP: icur = pScrollBar->GetScrollPos(); icur = icur - 1; if(icur < 0) icur = 0; pScrollBar->SetScrollPos(icur); break; case SB_PAGEDOWN: icur = pScrollBar->GetScrollPos(); icur = icur + 10; if(icur > 255) icur = 255; pScrollBar->SetScrollPos(icur); break; case SB_PAGEUP: icur = pScrollBar->GetScrollPos(); icur = icur - 10; if(icur < 0) icur = 0; pScrollBar->SetScrollPos(icur); break; } if(pScrollBar == &m_scrollbar1) 20 m_red = red = pScrollBar->GetScrollPos(); if(pScrollBar == &m_scrollbar2) m_green = green = pScrollBar->GetScrollPos(); if(pScrollBar == &m_scrollbar3) m_blue = blue = pScrollBar->GetScrollPos(); CBrush brush(RGB(red,green,blue)); CRect rect(80,10,240,130); CClientDC dc(this); dc.FillRect(&rect,&brush); UpdateData(false); CDialog::OnHScroll(nSBCode, nPos, pScrollBar); } 21 1. VC++6.0 (实现HelloWorld程序的以下不同版本) 1. W32 Console Application #include void main() { cout<<"Hello World!"<SetTextColor(RGB(255,0,0)); pDC->SetBkMode(TRANSPARENT); CFont font; font.CreateFont(28,15,0,0,FW_NORMAL,false,false,false,DEFAULT_CHARSET,OUT_DEVICE_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH," "); pDC->SelectObject(&font); pDC->TextOut(100,20,"HelloWorld!"); pDC->SetTextColor(RGB(255,0,255)); pDC->TextOut(160,60,"20041001"); } 24 2. (单文档应用程序上机实现) 1. MFC 创建单文档应用程序的一般步骤: , 利用AppWizard创建应用程序框架 , 在文档内中声明保存文档数据所需要数据对象 , 完成文档类的OnNewDocument函数,初始化新文档 , 完成文档类的Serialize函数,保持和加载文档数据 , 完成视类的OnInitialUpdate函数,初始化显示 , 完成视类的OnDraw函数,显示当前文档内容 , 在视类中加入可以使用户编辑文档数据所需的代码 一个简单的单文档应用程序向导自动建立五个类: 向导自动建立的类 相应源文件 其他源文件 相应头文件 其他头文件 CAboutDlg StdAfx.cpp StdAfx.h CXxxApp Xxx.cpp Xxx.rc Xxx.h Resource.h CXxxView XxxView.cpp XxxView.h CXxxDoc XxxDoc.cpp XxxDoc.h CMainFrame MainFrame.cpp MainFrame.h 25 文档—视结构 MainFrame 框架窗口 视(View) 显示用户程序的数据及 处理用户与文档的交互 文档对象 永久存储 (磁盘文件) 每个类的主要函数: void CAboutDlg::DoDataExchange(CDataExchange* pDX) int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) //创建窗体的工具栏,状态栏等 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) BOOL CXxxApp::InitInstance() void CXxxApp::OnAppAbout() BOOL CXxxDoc::OnNewDocument()//初始化文档字符数据、字体信息等 void CXxxDoc::Serialize(CArchive& ar) BOOL CXxxView::PreCreateWindow(CREATESTRUCT& cs) void CXxxView::OnDraw(CDC* pDC) BOOL CXxxView::OnPreparePrinting(CPrintInfo* pInfo)//弹出打印对话框 void CXxxView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo) void CXxxView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo) CXxxDoc* CXxxView::GetDocument() // non-debug version is inline 2. 建立一个简单的单文档应用程序Xxx1,并修改OnDraw函数: , OnDraw函数 在Xxx1View.cpp中,专门用于输出信息或画图。负责视图显示功能(包括打印、显示、 预览等) 1 void CXxx1View::OnDraw(CDC* pDC) { CXxx1Doc* pDoc = GetDocument(); 26 ASSERT_VALID(pDoc); // TODO: add draw code for native data here pDC->TextOut(50,50,"Hello World!"); pDC->Rectangle(10,10,50,50); } 2 void CDrawView::OnDraw(CDC* pDC) { CDrawDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CPen pen; CBrush brush; pen.CreatePen(PS_SOLID, 3, RGB(250,0,0)); brush.CreateSolidBrush(RGB(0,250,0)); pDC->SelectObject(pen); pDC->SelectObject(brush); pDC->Ellipse(100,200,300,300); DeleteObject(pen); DeleteObject(brush); CString str("Hello World!"); pDC->SetTextColor(RGB(0,0,250)); pDC->TextOut(120,150,str); pDC->SetTextColor(RGB(125,125,125)); double a[]={31.4,888.54}; char ch[10]; CString str1; str1.Format("%f",a[0]); pDC->TextOut(20,40,str1); str1.Format("%f",a[1]); pDC->TextOut(20,60,str1); gcvt(a[1],10,ch); pDC->TextOut(20,100,ch); gcvt(a[0],10,ch); pDC->TextOut(20,120,ch); } 3. GDI 图形设备接口GDI(Graphics Device Interface)是一个系统库,允许对系统的硬件进行独 立于设备的访问。GDI的核心是设备上下文类 设备上下文类DC(Device Contex):设置绘图属性和驱动设备绘图的方法。封装了 Windows API中的画图函数,设备上下文是内存中的一个对象,设备可以是屏幕或打印机。 27 图形对象类:CPen, CBrush, CFont, CBitmap, CPalette CPen: 画笔。实线,虚线,点线,宽度,颜色 CBrush:画刷。填充封闭区域 CFont: 字体。 CBitmap: 位图。 CPalette:。调色板 常见绘图任务: 输出文本,画点,画线,画弧, 封闭图形:Rectangle:矩形,RoundRect:园角矩形 Ellipse: 在矩形内画椭园 Pie: 饼图 Polygon: 封闭多边形 创建和使用GDI对象的方法:第一步创建实例,第二步调用创建方法。第三步调用 SelectObject();GDI对象放入设备上下文中。 图形窗口坐标: (0,0) x方向 y方向 自动生成的OnDraw函数代码: void CFourCircleView::OnDraw(CDC* pDC) { CFourCircleDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here //… } 例:四环图: void CFourCircleView::OnDraw(CDC* pDC) { CFourCircleDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CPen pen; pen.CreatePen(PS_SOLID, 4, RGB(250,0,0)); pDC->SelectObject(pen); 28 pDC->Ellipse(100,200,200,300); pDC->Ellipse(200,200,300,300); pDC->Ellipse(300,200,400,300); pDC->Ellipse(400,200,500,300); DeleteObject(pen); 四环程序代码2://椭园的外接矩形 pDC-> Rectangle(100,200,200,300); //pDC-> Rectangle (200,200,300,300); //pDC-> Rectangle (300,200,400,300); //pDC-> Rectangle (400,200,500,300); (0,0) x方向 (100,200) (500,300) (200,300) y方向 四环程序代码3://重迭 pDC->Ellipse(100,200,200,300); pDC->Ellipse(150,200,250,300); pDC->Ellipse(200,200,300,300); pDC->Ellipse(250,200,350,300); 29 四环程序代码4: pDC->SelectStockObject(NULL_BRUSH); // pDC->Ellipse(100,200,200,300); pDC->Ellipse(150,200,250,300); pDC->Ellipse(200,200,300,300); pDC->Ellipse(250,200,350,300); 请编程画出如下的奥运五环图: 4. 1. 使用AppWixard生成单文档工程Plot 2. 在PlotDoc.h中类 CPlotDoc的定义之前加入类Max的定义: class Max { double x1,x2,x3,x4; double Max2(double,double); public: Max(double,double,double,double); double Max4(); }; 3. 在PlotDoc.cpp的文件尾部加入类Max的实现部分: // CPlotDoc commands double Max::Max2(double a, double b) { if(a>=b) return a; else return b; } Max::Max(double a, double b, double c, double d) { x1=a;x2=b;x3=c;x4=d; } double Max::Max4() 30 { return Max2(Max2(x1,x2),Max2(x3,x4)); } 4. 为CPlotDoc类增加一个公有的void类型的成员函数Find和一个公有int数据成员 数组m_num[5],使用类产生对象并计算它们的最大值,将它们转换成int,存入整 数数组m_num。 void CPlotDoc::Find() { Max a(110.5, 120.8, 110, 68); Max b(130, 256.5, 90, 200); Max c(125, 406.8, 350, 330); Max d(120, 356.8, 300, 280.5); Max e(102, 256.8, 120, 105); m_num[0] = (int) a. Max4(); m_num[1] = (int) b. Max4(); m_num[2] = (int) c. Max4(); m_num[3] = (int) d. Max4(); m_num[4] = (int) e. Max4(); } 5. 为CPlotDoc类的成员函数OnNewDocument增加调用语句准备数据。 BOOL CPlotDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; // TODO: add reinitialization code here // (SDI documents will reuse this document) Find(); // return TRUE; } 6. 在视类中画图写字 void CPlotView::OnDraw(CDC* pDC) { CPlotDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here pDC->SetMapMode(MM_ISOTROPIC); pDC->SetViewportOrg(50,250); pDC->MoveTo(0,0); pDC->LineTo(1100,0); pDC->MoveTo(0,0); pDC->LineTo(0,600); int width = 40; 31 int ch = 'A'; CBrush brush; brush.CreateSolidBrush(RGB(50, 250,0)); pDC->SelectObject(brush); for(int i = 1; i<6; i++, ch++) { pDC->Rectangle(200*i, 0, 200*i+width, pDoc->m_num[i-1]); pDC->TextOut(200*i+10,-10, ch); } CFont font; font.CreateFont(0,0,0,0,800,0,0,0,OEM_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEF AULT_PITCH,""); pDC->SelectObject(&font); pDC->TextOut(200,550, ""); } 7. 运行程序,结果如下: 32 1. 定制界面:添加控件、设置属性 控件 ID号 标题 属性 Group Box IDC_STATIC 计算成绩 Static Text IDC_STATIC 成绩1 Static Text IDC_STATIC 成绩2 Static Text IDC_STATIC 成绩3 Static Text IDC_STATIC 平均分 Edit Box IDC_EDIT1 Align text:Right Edit Box IDC_EDIT2 Align text:Right Edit Box IDC_EDIT3 Align text:Right Edit Box IDC_EDIT4 计算平均分 Align text:Right;Read-only Button IDC_BUTTON1 Button IDC_OK 退出 2. 添加成员变量: (选择View/ClassWizard菜单选项进入ClassWizard,打开Member Variables选项卡) 控件ID 变量名 变量类型 数值范围 IDC_PINJUN m_Sav CString IDC_EDIT1 m_S1 int 0~100 IDC_EDIT2 m_S2 int 0~100 IDC_EDIT3 m_S3 int 0~100 33 3. 添加消息映射(两条消息) (选择View/ClassWizard菜单进入ClassWizard,打开Messages Maps选项卡) 34 4. 添加代码: BOOL CDlgDlg::OnInitDialog() { CDialog::OnInitDialog(); m_Sav="0.00"; m_S1=m_S2=m_S3; UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control 35 } void CDlgDlg::OnButton1() { UpdateData(); double ave=(double)(m_S1+m_S2+m_S3)/3.0; m_Sav.Format("%6.2f",ave); UpdateData(FALSE); } 要求:设计一个对话框应用程序,在对话框模板上添加控件,实现简单计算功能 1. 修改MFC AppWizard自动创建的对话框项目模板。删除模板上自动创建的三个控件。加 入“简单计算器”、“数一”、“数二”、“结果”四个静态文本框。 继续用鼠标从工具箱中向对话框添加3个编辑框和6个按钮控件,更改按钮的标题。 2. 用ClassWizard为编辑框添加变量:m_Num1, m_Num2, m_Num3 3. 用ClassWizard为按钮控件添加消息映射: 4. 在实现文件(cpp文件)中加入单击按钮时的事件响应代码。(双击一个按钮可直接进入 函数编辑) void CJsqDlg::OnButton1() { UpdateData(TRUE); m_Num3=m_Num1+m_Num2; UpdateData(FALSE); } void CJsqDlg::OnButton2() { 36 UpdateData(TRUE); m_Num3=m_Num1-m_Num2; UpdateData(FALSE); } void CJsqDlg::OnButton3() { m_Num1=0; m_Num2=0; m_Num3=0; UpdateData(FALSE); MessageBox(" 20040910"); } void CJsqDlg::OnButton4() { UpdateData(TRUE); m_Num3=m_Num1*m_Num2; UpdateData(FALSE); } void CJsqDlg::OnButton5() { UpdateData(TRUE); if(m_Num2==0) MessageBox("0 20040910"); else m_Num3=m_Num1/m_Num2; UpdateData(FALSE); } void CJsqDlg::OnButton6() { CDialog::OnOK(); } 运行时界面如下: 37 编程提示: 1. 添加变量列表: 变量类型 名称 float m_N1 float m_N2 float m_N3 char fuhao 2. 添加成员变量fuhao的方法: 在WorkSpace中进入ClassView视图, 右键单击CxxxDlg, 在菜单中选择“Add Member Variable…”,然后在弹出的对话框的输入变量类型和名称。 3.添加的代码: void CJsq2Dlg:: OnRadio1Plus() //缺省选择加法 { fuhao='+'; } void CJsq2Dlg::OnRadio2() { fuhao='-'; } 38 void CJsq2Dlg::OnRadio3() { fuhao='*'; } void CJsq2Dlg::OnRadio4() { fuhao='/'; } //计算 void CJsq2Dlg::OnButton1() { UpdateData(TRUE); switch(fuhao) { case '+': m_N3=m_N1+m_N2;break; case '-': m_N3=m_N1-m_N2; break; case '*': m_N3=m_N1*m_N2; break; case '/': if(m_N2 = = 0 ) MessageBox("除数不能为零!"); else { m_N3 = m_N1/m_N2; break; } default: m_N3=m_N1+m_N2; } UpdateData(FALSE); } //清除 void CJsq2Dlg::OnClear() { UpdateData(TRUE); m_N1=0; m_N2=0; m_N3=0; UpdateData(FALSE); } //关闭 void CJsq2Dlg::OnOK() { CDialog::OnOK(); } 39 彩票机界面: 设置进度条变量和7个编辑框变量: 40 添加类成员变量: 41 消息映射: BOOL CLotusDlg::OnInitDialog() { CDialog::OnInitDialog(); „„ // TODO: Add extra initialization here m_x=0; m_pProg.SetRange(0,70); srand((unsigned)time(NULL)); return TRUE; // return TRUE unless you set the focus to a control } // void CLotusDlg::OnButton1() { // TODO: Add your control notification handler code here switch(m_x/10) { case 0: m_N1=rand()%36+1; m_pProg.SetPos(m_x+=10); break; case 1: m_N2=rand()%36+1; m_pProg.SetPos(m_x+=10); break; case 2: m_N3=rand()%36+1; 42 m_pProg.SetPos(m_x+=10); break; case 3: m_N4=rand()%36+1; m_pProg.SetPos(m_x+=10); break; case 4: m_N5=rand()%36+1; m_pProg.SetPos(m_x+=10); break; case 5: m_N6=rand()%36+1; m_pProg.SetPos(m_x+=10); break; case 6: m_N7=rand()%36+1; m_pProg.SetPos(m_x+=10); break; } UpdateData(FALSE); } void CLotusDlg::OnButton2() { // TODO: Add your control notification handler code here m_x=0; m_N1=0; m_N2=0; m_N3=0; m_N4=0; m_N5=0; m_N6=0; m_N7=0; UpdateData(FALSE); m_pProg.SetPos(1); } //, void CLotusDlg::OnButton1() { SetTimer(1,2000,NULL); } void CLotusDlg::OnButton2() { 43 m_x=0; m_N1=0; m_N2=0; m_N3=0; m_N4=0; m_N5=0; m_N6=0; m_N7=0; UpdateData(FALSE); m_pProg.SetPos(0); KillTimer(1); } void CLotusDlg::OnTimer(UINT nIDEvent) { switch(m_x/10) { case 0: m_N1=rand()%36+1; m_pProg.SetPos(m_x+=10); break; case 1: m_N2=rand()%36+1; m_pProg.SetPos(m_x+=10); break; case 2: m_N3=rand()%36+1; m_pProg.SetPos(m_x+=10); break; case 3: m_N4=rand()%36+1; m_pProg.SetPos(m_x+=10); break; case 4: m_N5=rand()%36+1; m_pProg.SetPos(m_x+=10); break; case 5: m_N6=rand()%36+1; m_pProg.SetPos(m_x+=10); break; case 6: m_N7=rand()%36+1; m_pProg.SetPos(m_x+=10); break; 44 } UpdateData(FALSE); CDialog::OnTimer(nIDEvent); } void CLotusDlg::OnOK() { KillTimer(1); CDialog::OnOK(); } 2. 创建一个简单的单文档应用程序Xxx2; [1] 在Xxx2View.h中添加代码如下: public: virtual ~CXxx2View(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: private: int n;// [2] CXxx2View构造函数中初始化变量n CXxx2View::CXxx2View() { // TODO: add construction code here n=0; } [3] Xxx2View.cpp文件中修改OnDraw函数: void CXxx2View::OnDraw(CDC* pDC) { CXxx2Doc* pDoc = GetDocument(); pDC->SetTextColor(RGB(0,0,235)); pDC->SetBkMode(TRANSPARENT); CFont font; font.CreateFont(28,15,0,0,FW_NORMAL,false,false,false,DEFAULT_CHARSET,OUT_ DEVICE_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH," "); pDC->SelectObject(&font); pDC->TextOut(n,100,"Hi! 2003"); n=n+20; RECT r; GetClientRect(&r); if(n>r.right-r.left) 45 n=0; } [4]添加三条消息映射,并加入代码: void CXxx2View::OnLButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default SetTimer(1,500,NULL); CView::OnLButtonDblClk(nFlags, point); } void CXxx2View::OnRButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default KillTimer(1); CView::OnRButtonDblClk(nFlags, point); } void CXxx2View::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default Invalidate(); CView::OnTimer(nIDEvent); } [5]添加菜单控制与代理(菜单启/停、快捷键启/停、鼠标双击启/停、) 在资源Menu中添加启动(IDC_MOVE)和停止(IDC_STOP)两个菜单项及其消息映射。 并修改代码: void CXxx2View::OnLButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CXxx2View::OnMove(); //SetTimer(1,500,NULL); CView::OnLButtonDblClk(nFlags, point); } void CXxx2View::OnRButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default //KillTimer(1); CXxx2View::OnStop(); CView::OnRButtonDblClk(nFlags, point); } void CXxx2View::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default Invalidate(); } void CXxx2View::OnMove() 46 { // TODO: Add your command handler code here SetTimer(1,300,NULL); } void CXxx2View::OnStop() { // TODO: Add your command handler code here KillTimer(1); } 47 5. 1. SerialData应用程序串行化日期结构数据,用对话框修改数据,用编辑/修改菜单打开对 话框。 1. 用AppWizard建立一个普通单文档SerialDate工程 2. 添加一个对话框资源如下: 并为三个编辑框添加变量m_nYear, m_nMonth, m_nDay, 3. 用ClassWizard添加类CDateDialog(其基类为CDialog) 4. 在Doc头文件SerialDateDoc.h中添加下面内容: struct Date { int m_nYear; int m_nMonth; int m_nDay; }; #include "DateDialog.h" class CSerialDateDoc : public CDocument { protected: // create from serialization only CSerialDateDoc(); DECLARE_DYNCREATE(CSerialDateDoc) // Attributes public: Date date; 4. 编辑菜单中添加子菜单项,ID_EDIT_MODIFY,消息映射到SerialDateDoc.cpp文件中的 OnEditModify()函数 48 5. 在SerialDateDoc.cpp中添加代码 CSerialDateDoc::CSerialDateDoc() { date.m_nYear=2002; date.m_nMonth=6; date.m_nDay=1; } void CSerialDateDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { ar<>date.m_nYear >>date.m_nMonth >>date.m_nDay ; } } void CSerialDateDoc::OnEditModify() { CDateDialog dlg; dlg.m_nYear=date.m_nYear; dlg.m_nMonth=date.m_nMonth; dlg.m_nDay=date.m_nDay; if(dlg.DoModal()==IDOK) { date.m_nYear=dlg.m_nYear; date.m_nMonth=dlg.m_nMonth; date.m_nDay=dlg.m_nDay; } UpdateAllViews(NULL); SetModifiedFlag(true);//关闭窗口时提示存盘 } 6. 修改SerialDateView.cpp中的OnDraw代码 void CSerialDateView::OnDraw(CDC* pDC) { CSerialDateDoc* pDoc = GetDocument(); 49 ASSERT_VALID(pDoc); CString str; str.Format("Year:%d", pDoc->date.m_nYear); pDC->TextOut(20,20,str); str.Format("Month:%d", pDoc->date.m_nMonth); pDC->TextOut(20,40,str); str.Format("Day:%d", pDoc->date.m_nDay); pDC->TextOut(20,60,str); } 2. SerialRect应用程序串行化一个矩形数据,用对话框修改数据,用编辑/修改菜单打开对话框。 1. 用AppWizard建立一个普通单文档SerialRect工程,在Step 6将CSerialRectView的基 类设为CFormView。初始界面如下: 2. 在Form上添加控件 50 3. 添加变量Edit1~Edit4整型(m_x1, m_y1, m_x2, m_y2),取值范围0~300,Edit5为 Control-CEdit型(m_Ctrl) 4. 用右键选择控件的Events修改Edit1的黙认EN_CHANGE消息处理OnChangeEdit1 为自定义的OnChangeEdit。其他三个Edit也映射到这个函数。 5. 在Doc头文件SerialRectDoc.h中添加变量: class CSerialRectDoc : public CDocument { protected: // create from serialization only CSerialRectDoc(); DECLARE_DYNCREATE(CSerialRectDoc) // Attributes public: int x1, y1, x2, y2; // Operations 6. 在SerialRectDoc.cpp的构造函数中初始化变量: CSerialRectDoc::CSerialRectDoc() { // TODO: add one-time construction code here x1=y1=x2=y2=0; } 7. SerialRectView.cpp中添加下面内容: 51 void CSerialRectView::OnChangeEdit() { // TODO: Add your control notification handler code here UpdateData(); CSerialRectDoc* pDoc= GetDocument(); if(m_x1!=pDoc-> x1) pDoc-> x1 =m_x1; if(m_y1!=pDoc-> y1) pDoc-> y1 =m_y1; if(m_x2!=pDoc-> x2) pDoc-> x2 =m_x2; if(m_y2!=pDoc-> y2) pDoc-> y2 =m_y2; Invalidate(true); } void CSerialRectView::OnInitialUpdate() { CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); m_x1=GetDocument()->x1; m_x2=GetDocument()->x2; m_y1=GetDocument()->y1; m_y2=GetDocument()->y2; UpdateData(false); } 8. 在SerialRectDoc.cpp的串行化代码: void CSerialRectDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: add storing code here ar<>x1>>y1>>x2>>y2; } } 9. 为CSerialRectView类添加OnDraw函数 在工作区类视图中右键单击CSerialRectView类,选择Add Member Function弹出对话框: 52 void CSerialRectView::OnDraw(CDC *pDC) { m_Ctrl.UpdateWindow(); pDC=m_Ctrl.GetWindowDC(); pDC->Rectangle(m_x1,m_y1,m_x2,m_y2); UpdateData(false); } 53 6 (怎样用32位调试程序了解类和对象的内存映象) Visual C++的IDE内置了32位DEBUG程序调试程序。可以用于帮助检测查和纠正逻 辑错误,查看和内存变量和寄存器的动态运行情况,进程的内存空间分配等。 DEBUG程序调试程序通过菜单命令提供了设置断点,单步运行等基本调试功能。并提 供了各种调试窗口帮助用户了解程序运行时机器底层发生的各种情况。 调试窗口 说明 Output 显示调试过程中输出的错误信息 Watch 显示变量和表达式的结果 QuickWatch 提供一个对话框供显示或修改变量和表达式的值 Variables 显示当前及上一条语句所使用的变量和函数的返回值等信息 Registers 显示CPU寄存器当前内容 Memory 显示内存储器当前内容 Call Stack 显示未返回的函数的堆栈内容 Dissembly 显示当前编译的源程序的汇编语言代码 下面通过对教材中几个习题和例题的调试举例,了解类和对象在机器底层的实例化情 况,有助于加深对类和对象,进程空间分配及动态绑定等概念的了解。 15. 3 #include void main() { int a[5]={34 , 256 , 87 , 46 , 90 }; int b[][3]={1, 2, 3, 4, 5, 6, 7, 8, 9}; int x,y,z; x=a[2]+a[3]; y=*a+*(a+4); z=b[1][2]+**b+**(b+1)+*(*(b+1)+1); cout<<"x = "<showStudentInfo(); Student::showTotal(); delete ps; cout<<"After delete a student: "; Student::showTotal(); } main()函数中的动态对象存储情况如图7.3所示: 堆空间 st1 1000001 P S st1.name地址 e m 22 t i e st2 1000002 t r h st2.name地址 /0 /0 M 23 a L st3 1000003 r i 1000004 y n st3.name地址 /0 动态对象name d 21 d 20 *ps 动态对象地址 /0 图7.3 例7.19的进程空间分配 57 在DEBUG中,用菜单命令Run to Cursor打开调试窗口,在动态变量窗口中观察对象 的实例化和初始化情况。 Student st1("Peter",22),st2("Smith",23),st3("Linda",21); st1 {…} —count 1000003 (0x000f4243) —ID 1000001 name 0x00431e80 " Peter" 80 “P” age 22 st2 {…} —count 1000003 (0x000f4243) —ID 1000001 name 0x00431e40 " Smith" 83 “S” age 23 st3 {…} —count 1000003 (0x000f4243) —ID 1000003 name 0x00431e00 "Linda" 76 “L” age 21 58 Student *ps=new Student("Mary",20); ps 0x00431b90 —count 1000004 (0x000f4244) —ID 1000004 name 0x00431b50 " Mary " 77 “M” age 20 delete ps; ps 0x00431b90 —count 1000003 (0x000f4243) —ID -572662307 name 0xdddddddd " " CXX0030:Error:expression cannot be… age -572662307 59 打开Disassembly窗口,可以找到Student类的成员函数在代码区中的分配情况: 本例程序的进程空间分配情况如下: 在代码区中存放有Student类的构造函数、析构函数,成员函数showStudentInfo()以及静态成员函数showTotal()的代码。 在静态数据区中存放有Student类的静态数据成员变量count。 main() 0x00401070 ShowTotal() 0x004012e0 showStudentInfo() 0x00401360 Student (char *sname, int sage) 0x00401230 ~Student() 0x00401410 Student::count 0x00428d50 指针指向堆区: ps(0x00431b90) st1.name(0x00431e80) st1,st2,st3在栈中分配: 0x0012ff50 60 310.3 #include class Point { protected: int x, y; public: Point(int a, int b){x=a; y=b;} virtual void print() { cout<<"(“<print(); ptr=&d2; ptr->print(); ptr->forward(5); ptr=&d1; ptr->print(); ptr=&d2; ptr->print(); } 61 光标设在main()函数中 倒数第一行ptr->print();语句前面,执行菜单命令Run to Cursor 打开调试窗口,在动态变量窗口和Watch窗口中,观察对象d1,d2: &d1 0x0012FF74 __vfptr 0x0042601c const Point::`vftable' [0] 0x00401019 Point::print(void) [1] 0x00401032 Point::forward(int) x 2 y 4 &d2 0x0012ff64 Point {...} __vfptr 0x00426034 const Point_3d::`vftable' [0] 0x00401037 Point_3d::print(void) [1] 0x00401028 Point_3d::forward(int) x 6 y 8 z 10 Disassembly: virtual void Point::print() 004012A0 virtual void Point::forward(int d) 00401080 virtual void Point_3d::print() 004013B0 virtual void Point_3d::forward(int d) 004010E0 62 实验7 C++文件处理 (文件流与文件操作基本技术) 1. 流的字符处理成员函数的使用: 以键盘输入内容建立文本文件,Ctrl+Z退出 #include #include void main() { char ch; ofstream afile("d:\\text1.txt"); //创建一个文件流 if (!afile) //如果创建失败,退出 { cout <<"Can't open file"; exit(-1); } cout <<"Input chars to the text1.txt file:(Quit by Ctrl+Z)"< #include void main() { char ch; ifstream fin("d:\\text1.txt"); //创建一个输入流,并和输入文件"d:\text1.txt"联系 ofstream fout("d:\\text2.txt");//创建一输出流,并和输出文件"d:\text2.txt"联系 if(!fin) { cerr<<"Cannot open file file.in"; exit(-1); } if (!fout) { cerr<<"Can't open file file.out"; exit(-1); } while (fin.get(ch)) { ch=char(ch+1); fout.put(ch); } 64 cout<<"The file operating has down."< #include void main() { char ch; ifstream fin("d:\\text2.txt"); ofstream fout("d:\\text1.txt",ios::app); if(!fin) { cerr<<"Cannot open file file.in"; exit(-1); //如果原文件出错,显示信息并退出 } if (!fout) { cerr<<"Can't open file file.out"; exit(-1); //如果目的文件出错,显示信息并退出 } while (fin.get(ch)) { ch=char(ch-1); fout.put(ch); } cout<<"The file operating has down."< void main() { try{ char ch; ifstream fin("D:\\Text1.txt"); //为缺省目录中的文件创建一个输入文件流 if(!fin) throw "Cannot open file in.txt"; ofstream fout("h:\\new.txt"); //为指定目录中的文件创建一个输出文件流 if (!fout) throw "Can't open file new.txt"; while (fout&&fin.get(ch)) fout.put(ch); cout<<"The file copy has done."<
/
本文档为【第一次作业】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索