




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Visual C+程序设计重庆科技学院Visual C+程序设计大作业专业班级: 应数12级2班 学 号: 姓 名: 成 绩: 1、 公共部分1. 请详细地论述面向对象的封装性和继承性。封装性:封装(Encapsulation)就是把对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节。封装有两个含义:一是把对象的全部属性和行为结合在一起,形成一个不可分割的独立单位,对象的属性值(除了公有的属性值)只能由这个对象的行为来读取和修改;二是尽可能隐蔽对象的内部细节,对外形成一道屏障,与外部的联系只能通过外部接口实现。封装的信息隐蔽作用反映了事物的相对独立性,可以只关心它对外所提供的接口
2、,即能做什么,而不注意其内部细节,即怎么提供这些服务。例如,用陶瓷封装起来的一块集成电路芯片,其内部电路是不可见的,而且使用者也不关心它的内部结构,只关心芯片引脚的个数、引脚的电气参数及引脚提供的功能,利用这些引脚,使用者将各种不同的芯片连接起来,就能组装成具有一定功能的模块。封装的结果使对象以外的部分不能随意存取对象的内部属性,从而有效地避免了外部错误对它的影响,大大减小了查错和排错的难度。另一方面,当对象内部进行修改时,由于它只通过少量的外部接口对外提供服务,因此同样减小了内部的修改对外部的影响。同时,如果一味地强调封装,则对象的任何属性都不允许外部直接存取,要增加许多没有其他意义,只负责
3、读或写的行为。这为编程工作增加了负担,增加了运行开销,并且使得程序显得臃肿。为了避免这一点,在语言的具体实现过程中应使对象有不同程度的可见性,进而与客观世界的具体情况相符合。封装机制将对象的使用者与设计者分开,使用者不必知道对象行为实现的细节,只需要用设计者提供的外部接口让对象去做。封装的结果实际上隐蔽了复杂性,并提供了代码重用性,从而降低了软件开发的难度。 封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言的封装更为清晰、更为有力。面向对象的封
4、装就是把描述一个对象的属性和行为的代码封装在一个“模块”中,也就是一个类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象中的属性。通常情况下,只要记住让变量和访问这个变量的方法放在一起,将一个类中的成员变量全部定义成私有的,只有这个类自己的方法才可以访问到这些成员变量,这就基本上实现对象的封装,就很容易找出要分配到这个类上的方法了,就基本上算是会面向对象的编程了。把握一个原则:把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和它操作的数据放在同一个类中。继承性:客观事物既有共性,也有特性。如果只考虑事物的共性,而不考虑事物的特性,就不能反映出客观世界中事物之间的层
5、次关系,不能完整地、正确地对客观世界进行抽象描述。运用抽象的原则就是舍弃对象的特性,提取其共性,从而得到适合一个对象集的类。如果在这个类的基础上,再考虑抽象过程中各对象被舍弃的那部分特性,则可形成一个新的类,这个类具有前一个类的全部特征,是前一个类的子集,形成一种层次结构,即继承结构。继承(Inheritance)是一种联结类与类的层次模型。继承性是指特殊类的对象拥有其一般类的属性和行为。继承意味着“自动地拥有”,即特殊类中不必重新定义已在一般类中定义过的属性和行为,而它却自动地、隐含地拥有其一般类的属性与行为。继承允许和鼓励类的重用,提供了一种明确表述共性的方法。一个特殊类既有自己新定义的属
6、性和行为,又有继承下来的属性和行为。尽管继承下来的属性和行为是隐式的,但无论在概念上还是在实际效果上,都是这个类的属性和行为。当这个特殊类又被它更下层的特殊类继承时,它继承来的和自己定义的属性和行为又被下一层的特殊类继承下去。因此,继承是传递的,体现了大自然中特殊与一般的关系。在软件开发过程中,继承性实现了软件模块的可重用性、独立性,缩短了开发周期,提高了软件开发的效率,同时使软件易于维护和修改。这是因为要修改或增加某一属性或行为,只需在相应的类中进行改动,而它派生的所有类都自动地、隐含地作了相应的改动。由此可见,继承是对客观世界的直接反映,通过类的继承,能够实现对问题的深入抽象描述,反映出人
7、类认识问题的发展过程。2. 请结合例程分别详细的论述什么是面向对象的静态多态和运行时多态。多态性是面向对象程序设计的重要特性之一,它与封装性和继承性面向对象程序设计的三大特性。所谓多态性,是指不同类型的对象接受相同的消息时产生不同的行为。这里的消息主要是指对类的成员函数的调用,而不同的行为是指成员函数的不同实现。在c+中,多态性可分为两种:编译时的多态性(静态多态)和运行时的多态性。运行时多态: 运行时的多态性是通过虚函数(virtual)来实现的,它指在程序执行之前,根据函数和参数还无法确定应该调用哪一个函数,必须在程序的执行过程中,根据具体的执行情况动态地确定。 #include <
8、iostream.h> class CShape public: virtual float area() /将area定义成虚函数 return 0.0; ; class CTtriangle: public CShape public: CTtriangle(float h,float w) H=h; W=w; Float area() return(float)(H*W*0.5); private: Float H,W;Class CCircle:public CShapepublic: CCircle(float r) R=r; float area() return(float
9、)(3.14159265*R*R); private: Floa R;int main() CShape*s2; s0=new CTriangle(3,4); cout<<s0->area()<<endl; s1=new CCircle(5); cout<<s1->area()<<endl; Return 0;程序运行结果如下:678.5398代码中,虚函数area是通过在基类的area函数前面加上virtual关键字来实现的。程序中*s2是定义的基类CShape指针,语句“s0=new CTriangle(3,4);”是将s0指向派
10、生类CTriangle,因而“s0->area()”实际上是调用CTriangle类的area成员函数,结果是6;同样可以分析s1->area()的结果。从这个例子可以看出,正是通过虚函数,达到了用基类指针访问派生类对象成员函数的目的,从而使一个函数具有多种不同的版本,这一点与重载函数相似,只不过虚函数的不同版本是在该基类的派生类中重新定义的。这样,只要声明了基类指针就可以使不同的派生类对象产生不同的函数调用,实现了程序的运行时多态。需要说明的是:(1)虚函数在重新定义时,参数的个数和类型必须和基类中的虚函数完全匹配,这一点和函数重载完全不同。(2) 只有通过基类指针才能实现虚函数
11、的多态性,若虚函数的调用是通过普通方式来进行的,则不能实现其多态性。例如: CShape ss; cout<<ss.area()<<endl;输出的结果为0.0。(3)如果不使用new来创建相应的派生类对象指针,也可以通过使用&运算符来获取对象的地址。例如: void main() CShape*p1,*p2; CTriangle tri(3,4); CCircle cir(5); p1=&tri;p2=○ cout<<p1->area()<<endl; Cout<<p2->area()&l
12、t;<endl; (4) 虚函数必须是类的一个成员函数,不能是友元函数,也不能是静态的成员函数。(5) 可以把析构函数定义为虚函数,但不能将构造函数定义为虚函数。通常在释放基类中及其派生类中动态申请存储空间时,也要把析构函数定义为虚函数,以便实现撤销对象时的多态性。 静态多态: 编译时的多态性态则是通过函数或运算符的重载来实现的,下面举两个例子:1)函数模板 template <typename T> T max(const T& lsh, const T& rhs) return (lsh > rhs) ? lsh : rhs; 返回两个任意类型对象的
13、最大值,前提是该类型能够使用>运算符进行比较,并且返回值是BOOL类型。使用: int a = 3; int b = 4; cout << max(a, b) << endl; float c = 2.4; float d = 1.2; cout << max(c, d) << endl;输出结果为: 4 2.4 这种绑定发生在编译期,这是由于模板的实例化是发生在编译期的,即在编译时编译器发现你调用max(a, b)时就自动生成一个函数 int max(const int& lsh, const int& rhs) retu
14、rn (lsh > rhs) ? lsh : rhs; 2)函数重载 int max (int a, int b) return (a > b) ? a : b; int max (int a, int b, int c) return max(max(a, b), c); 以上两个函数名称一样,参数类型或个数不完全相同,返回值一样。使用: int a = 3, b = 4, c = 5; cout << max(a, b) << endl; cout << max(a, b, c) << endl;输出结果为: 4 5 确定函数的过
15、程也发生在编译器,当你使用max(a, b),编译器发现只有两个参数,那么就调用只有两个参数的函数版本,当使用max(a, b, c)时,编译器则使用有3个参数的版本。通过上面的两个例子,你还可以使用更为方便的函数重载: template <typename T> T max(const T& lsh, const T& rhs) return (lsh > rhs) ? lsh : rhs; template <typename T> T max(const T& a, const T& b, const T& c) re
16、turn max(max(a, b), c); 使用: float a = 3.6, b = 1.2, c = 7.8; cout << max(a, b, c) << endl;输出结果为: 7.8 通过参数个数和类型,编译器自动生成和调用对应得函数版本。3. 详细描述你所理解的MFC的文档视图架构。应用程序的大部分代码都会被添加在文档和视图这两类中。文档和视图紧密相连,是用户和文档之间的交互接口。用户通过文档视图结构可实现数据的传输、编辑、读取和保存等。但文档、视图以及和应用程序框架的相关部分之间还包含了一系列非常复杂的相互作用。拆分窗口和一档多视是文档和视图相互作
17、用的典型实例。1. 文档视图结构概述文档即应用程序数据的基本元素的集合,是构成应用程序所使用的数据单元,提供数据管理和维护的手段。视图即在文档和用户之间其中介作用,是数据的用户窗口,提供文档数据的显示功能,并为用户提供了数据交互操作的界面。MFC提供了两类文档应用程序:只有一个窗口的单文档界面(SDI)及同时可以操作多个文档的多文档界面(MDI)。2.文档与视图的相互作用 MFC应用程序用一种编程式使程序中数据与它的显示形式和用户交互分离开来,这种模式就是“文档视图结构”,文档视图结构能方便地实现文档和视图的相互作用。一旦在用MFC AppWizard (exe)创建SDI/MDI的第1步中选
18、中了Document/View architecture support(文档/视图体系结构支持)复选框,就可使用CView:GetDocument、CDocument:UpdateAllViews、CView:OnUpdate、CView:OnInitialUpdate及CDocument:OnNewDocument 5个文档和视图相互作用的重要成员函数。3. 文档视图结构的内在机制A.文档保留了该文档的视图列表,一个文档至少有一个相关联的视图,而一个视图只能与一个文档关联。B.视图保留了指向其对应的指针,该指针包含在视图所在框架之中。C.框架保留了指向其当前活动视图的指针。MFC提供了文档
19、/视图模型以实现数据和现实的分离。文档类(Dcument)用来维护、管理数据,包括数据的读取、存储与修改;视图类(View)用来接收显示数据,将这些数据交给文档类来处理。在文档/视图结构中,MFC文档对象将数据读入或写入永久存储区,并提供数据驻留位置的接口。而一个视图对象可以管理数据显示,包括在窗口中显示数据。编辑数据等。MFC可以利用文档/视图结构使用一个单独的视图对象表示每个数据视图,还可以使用文档对象同时更新所有试图。MFC文档/视图将数据结构的存储与维护同其是分开的,图4显示了文档与视图的关系。文档视图当前可见的文档视图图1 文档与视图的关系文档/视图结构类的各自主要作用:1)文档用于
20、管理应用程序的数据。2) 视图的主要作用是以图形方式显示文档数据,以及接收用户的输入并将其解释为对文档的操作。3)MFC框架使用框架窗口来包含视图,框架窗口提供了用于环绕视图的可见框架(菜单、最小化和最大化窗口等),使用窗口框架类管理框架,使用视图类管理框架中的视图,用户与文档之间的交互操作发生在视图的客户区内,而不是框架窗口的客户区内;4)框架使用了两个文档模板类用于管理创建文档及关联的视图和框架窗口的复杂过程,由应用程序对象创建文档模板,由文件模板创建文档和框架窗口,而由框架窗口创建文档的对应视图。二、选做部分1. 用MFC AppWizard(exe)创建一个单文档的应用程序1)双击桌面
21、上的Visual C+6.0快捷方式图标,选择文件新建命令,在弹出的新建对话框中,选择MFC AppWizard(exe)项目类型(该类型用于创建可执行的Windows应用程序),将位置(项目工作文件夹)定位在H:题目二,并在工程名称中输入项目名:题目二,如图1.1所示。图1.1 MFC AppWizard的新建对话框2)单击确定按钮,弹出如图1.2所示的步骤1对话框,应用程序类型选择单文档。因此次程序的需要,直接单击完成按钮,便完成了单文档应用程序的创建。图1.2 MFC AppWizard的步骤1对话框2. 为单文档应用程序添加对话框2.1 插入对话框选择“插入”“资源”菜单命令,打开“插
22、入资源”对话框,在对话框中可以看到资源列表中存在Dialog项,单击“新建”按钮便在此程序中创建了一个对话框,如图2.1所示。图2.1 “插入资源”对话框2.2 设置对话框属性及添加和布局控件2.2.1 设置对话框属性在对话框模板的空白处右击鼠标,从弹出的快捷菜单中选择“属性”菜单项,弹出对话框,ID修改为IDD_DIALOG,Caption标题改为:关于sin曲线,如图2.2所示。 图2.2 对话框属性窗口2.2.2 添加和布局控件参看图2.3所示的空间布局,用编辑器为对话框添加如表2.1所示的一些控件。图2.3 “关于sin曲线”对话框表2.1控件ID号标题属性静态文本默认区间起始位置:默
23、认静态文本默认区间结束位置:默认控件ID号标题属性编辑框IDD_EDIT1无默认编辑框IDD_EDIT2无默认2.2.3 创建对话框类在对话框资源模板的空白区域(没有其他元素或控件)内双击鼠标左键,将弹出如图2.4所示的对话框,询问是否为对话框资源创建一个新类。单击OK按钮,则为该对话框创建类,Name为:CDlg。Base class为CDialog。图2.4 Adding a class对话框利用ClassWizard,为表2.2所示的对话框类(CDlg)的控件增加成员变量。表2.2控件控件ID号变量类型变量名范围和大小编辑框IDD_EDIT1doublem_t1-10.010.0编辑框I
24、DD_EDIT2doublem_t2-10.010.03. 设计菜单用编辑器设计菜单:在项目工作区打开ResourceView选项卡,展开Menu文件夹,双击IDR_MAINFRAME,右边的文档窗口出现菜单编辑器,如图3.1所示;展开“编辑”下拉菜单,如图3.2所示,删除其下所有子菜单,双击空白子菜单,弹出“菜单项属性”对话框,在Caption处写菜单名:修改参数,在ID处写:ID_AMEND。图3.1 菜单资源编辑器图3.2 菜单编辑器和修改菜单项属性4. 编写代码 在文档类的头文件“题目二Doc.h”的class CMyDoc : public CDocument中写如下语句:publi
25、c:double m_t1;/定义区间起始位置变量double m_t2; /定义区间结束位置变量double m_yMin;double m_yMax;CDC m_dc;bool bStart;void Draw();double fun(double x);void Rang();5. 图形绘制5.1 运行结果编译并运行程序,则弹出如图5.1所示的窗口,单击“文件”“新建”,弹出写入参数对话框(关于sin曲线),写入参数如图5.2所示,点击“确定”按钮,即可得到绘制的sin曲线图如图5.3所示。图5.1图5.2图5.35.2 修改参数并绘图当绘制如图5.3时,还可通过单击“编辑”“修改参数
26、”,重新写入参数,令X轴起始位置为-10,X轴结束位置为10,绘制sin曲线如图5.4所示。图5.46. 保存绘图结果未保存前,此曲线图无标题,如图6.1所示,当单击“文件”“保存”,弹出如图6.1所示的窗口,将文件名记为“sin曲线图”,点击保存即可。图6.1 保存后此曲线标题为“sin曲线图”,如图6.2所示。图6.2附录Dlg.cpp :#include "stdafx.h"#include "题目二.h"#include "Dlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_
27、FILEstatic char THIS_FILE = _FILE_;#endif/ CDlg dialogCDlg:CDlg(double t1, double t2, CWnd* pParent /*=NULL*/): CDialog(CDlg:IDD, pParent)/AFX_DATA_INIT(CDlg)m_t1 = t1;m_t2 = t2;/AFX_DATA_INITvoid CDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CDlg)DDX_Text(pDX, IDC
28、_T1, m_t1);DDX_Text(pDX, IDC_T2, m_t2);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CDlg, CDialog)/AFX_MSG_MAP(CDlg)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CDlg message handlersBOOL CDlg:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization here/UpdateData(FALSE);return TRUE; / return TRUE unless you set
29、the focus to a control / EXCEPTION: OCX Property Pages should return FALSE/为“确定”按钮添加代码void CDlg:OnOK() UpdateData(); /数据从控件向相关联的成员变量复制编辑框的内容在按钮上显示if(m_t1 >= m_t2) /做判断MessageBox("X轴起始位置必须小于X轴结束位置"); return;CDialog:OnOK();MainFrm.cpp :#include "stdafx.h"#include "题目二.h&quo
30、t;#include "MainFrm.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CMainFrameIMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)/AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()ON_UPDATE_COMMAND_UI(ID_AMEND, OnUpdateAmend)/AFX
31、_MSG_MAPEND_MESSAGE_MAP()static UINT indicators =ID_SEPARATOR, / status line indicatorID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,;/ CMainFrame construction/destructionCMainFrame:CMainFrame()/ TODO: add member initialization code hereCMainFrame:CMainFrame()int CMainFrame:OnCreate(LPCREATEST
32、RUCT lpCreateStruct)if (CFrameWnd:OnCreate(lpCreateStruct) = -1)return -1;if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) |!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)TRACE0("Failed to create toolbarn&qu
33、ot;);return -1; / fail to createif (!m_wndStatusBar.Create(this) |!m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)TRACE0("Failed to create status barn");return -1; / fail to createm_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlB
34、ar(&m_wndToolBar);return 0;BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)if( !CFrameWnd:PreCreateWindow(cs) )return FALSE;/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn TRUE;/ CMainFrame diagnostics#ifdef _DEBUGvoid CMainFrame:AssertValid() constCFr
35、ameWnd:AssertValid();void CMainFrame:Dump(CDumpContext& dc) constCFrameWnd:Dump(dc);#endif /_DEBUG/ CMainFrame message handlersvoid CMainFrame:OnUpdateAmend(CCmdUI* pCmdUI) / TODO: Add your command update UI handler code here题目二Doc.cpp : #include "stdafx.h"#include "题目二.h"#in
36、clude "题目二Doc.h"#include "dlg.h"#include <math.h>#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CMyDocIMPLEMENT_DYNCREATE(CMyDoc, CDocument)BEGIN_MESSAGE_MAP(CMyDoc, CDocument)/AFX_MSG_MAP(CMyDoc)ON_COMMAND(ID_AMEND, OnAmend)ON_UPDA
37、TE_COMMAND_UI(ID_AMEND, OnUpdateAmend)ON_UPDATE_COMMAND_UI(ID_FILE_SAVE_AS, OnUpdateFileSaveAs)ON_UPDATE_COMMAND_UI(ID_FILE_SAVE, OnUpdateFileSave)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CMyDoc construction/destructionCMyDoc:CMyDoc()/变量初始化m_t1 = 0.0; m_t2 = 0.0;m_yMin = 0.0;m_yMax = 0.0;bStart = true;CMyDoc:
38、CMyDoc()/新建对话框BOOL CMyDoc:OnNewDocument()if(!bStart)CDlg dlg;if(dlg.DoModal() = IDOK) /用户单击了“确定”按钮m_t1 = dlg.m_t1;m_t2 = dlg.m_t2;Draw(); /调用Draw()函数elsereturn FALSE;elsebStart = false;if (!CDocument:OnNewDocument()return FALSE;/ TODO: add reinitialization code here/ (SDI documents will reuse this d
39、ocument)return TRUE;/绘制sin曲线图void CMyDoc:Draw()m_dc.DeleteDC();Rang();POSITION pos = GetFirstViewPosition(); /调用绘图函数CDC *pDC = GetNextView(pos)->GetDC();CBitmap bmp;bmp.CreateCompatibleBitmap(pDC, WIDTH, HEIGHT);m_dc.CreateCompatibleDC(pDC);m_dc.SelectObject(&bmp);CRect rc(0, 0, WIDTH, HEIGHT
40、);m_dc.FillRect(&rc, &CBrush(RGB(255,255,255); /画坐标轴m_dc.MoveTo(0, GetY(0);m_dc.LineTo(WIDTH, GetY(0);m_dc.MoveTo(GetX(0), 0);m_dc.LineTo(GetX(0), HEIGHT);rc.right = GetX(0) - 1;rc.top = GetY(0) + 2;rc.left = rc.right - 100;rc.bottom = rc.top + 100;m_dc.DrawText("O", &rc, DT_RI
41、GHT | DT_TOP | DT_SINGLELINE);char c20;int i;double j;double jg = (m_t2 - m_t1) / 5;for(j = m_t1; j <= m_t2; j += jg)if(j = 0.0)continue;m_dc.MoveTo(GetX(j), GetY(0);m_dc.LineTo(GetX(j), GetY(0) - 7);sprintf(c, "%g", j);rc.left = GetX(j) - 100;rc.right = GetX(j) + 100;m_dc.DrawText(c, &
42、amp;rc, DT_CENTER | DT_TOP | DT_SINGLELINE);jg = (m_yMax - m_yMin) / 5;rc.right = GetX(0) - 1;rc.left = rc.right - 100;for(i = int(m_yMin - 0.5) / jg); i <= int(m_yMax + 0.5) / jg); i +)if(i = 0)continue;m_dc.MoveTo(GetX(0), GetY(i * jg);m_dc.LineTo(GetX(0) + 7, GetY(i * jg);sprintf(c, "%g&q
43、uot;, i * jg);rc.top = GetY(i * jg) - 100;rc.bottom = GetY(i * jg) + 100;m_dc.DrawText(c, &rc, DT_VCENTER | DT_RIGHT | DT_SINGLELINE);m_dc.SetTextAlign(TA_RIGHT | TA_TOP);m_dc.TextOut(WIDTH, GetY(0) + 2, "x"); /画出x轴m_dc.TextOut(GetX(0), 0, "y"); /y轴CPen pen(PS_SOLID, 1, RGB(0
44、,0,0); /定义黑色画笔m_dc.SelectObject(pen);jg = (m_t2 - m_t1) / 1000;m_dc.MoveTo(GetX(m_t1), GetY(fun(m_t1);for(j = m_t1 + jg; j <= m_t2; j +=jg)m_dc.LineTo(GetX(j), GetY(fun(j);UpdateAllViews(NULL);/ CMyDoc serialization/文件保存和打开void CMyDoc:Serialize(CArchive& ar)if(bStart)bStart = false;/档案表头BITMA
45、PFILEHEADER bfh;ZeroMemory(&bfh, sizeof(bfh);bfh.bfType = *(WORD*)"BM"bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) + HEIGHT * (WIDTH * 3 + 3) / 4 * 4);/资讯表头BITMAPINFO bmi;ZeroMemory(&bmi, sizeof(bmi);
46、bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);bmi.bmiHeader.biWidth = WIDTH;bmi.bmiHeader.biHeight = HEIGHT;bmi.bmiHeader.biPlanes = 1;bmi.bmiHeader.biBitCount = 24;bmi.bmiHeader.biCompression = BI_RGB;bmi.bmiHeader.biSizeImage = HEIGHT * (WIDTH * 3 + 3) / 4 * 4);/保存绘图结果if (ar.IsStoring()/ TODO: a
47、dd storing code hereCDC dc;CBitmap bmp;dc.CreateCompatibleDC(&m_dc);bmp.CreateCompatibleBitmap(&m_dc, WIDTH, HEIGHT);dc.SelectObject(bmp);dc.BitBlt(0, 0, WIDTH, HEIGHT, &m_dc, 0, 0, SRCCOPY);BITMAP bm;bmp.GetObject(sizeof(bm), &bm);DWORD len = bm.bmHeight * bm.bmWidthBytes;BYTE *c =
48、new BYTElen;bmp.GetBitmapBits(len, c);ar.Write(&bfh, sizeof(bfh);ar.Write(&bmi, sizeof(bmi);for(int i = bm.bmHeight - 1; i >= 0; i -)int j;for(j = 0; j < bm.bmWidthBytes; j +=4)ar<<ci * bm.bmWidthBytes + j + 1<<ci * bm.bmWidthBytes + j + 2<<ci * bm.bmWidthBytes + j;if
49、(WIDTH % 4)for(j = 4 - (WIDTH * 3) % 4; j > 0; j -)ar<<BYTE(0);delete c;ar<<m_t1<<m_t2;else/ TODO: add loading code hereBITMAPFILEHEADER bfh1;BITMAPINFO bmi1;if(ar.Read(&bfh1, sizeof(bfh1) < sizeof(bfh1)AfxMessageBox("打开文件失败");return;if(memcmp(&bfh1, &bf
50、h, sizeof(BITMAPFILEHEADER)AfxMessageBox("打开文件失败");return;if(ar.Read(&bmi1, sizeof(bmi1) < sizeof(bmi1)AfxMessageBox("打开文件失败");return;if(memcmp(&bmi1, &bmi, sizeof(BITMAPINFO)AfxMessageBox("打开文件失败");return;BYTE *c = new BYTEbmi.bmiHeader.biSizeImage;if(ar
51、.Read(c, bmi.bmiHeader.biSizeImage) < bmi.bmiHeader.biSizeImage)delete c;AfxMessageBox("打开文件失败");return;delete c;double t1,t2;if(ar.Read(&t1, sizeof(double) < sizeof(double)AfxMessageBox("打开文件失败");return;if(ar.Read(&t2, sizeof(double) < sizeof(double)AfxMessageBo
52、x("打开文件失败");return;m_t1 = t1;m_t2 = t2;Draw();/ CMyDoc diagnostics#ifdef _DEBUGvoid CMyDoc:AssertValid() constCDocument:AssertValid();void CMyDoc:Dump(CDumpContext& dc) constCDocument:Dump(dc);#endif /_DEBUG/为“修改参数”添加代码void CMyDoc:OnAmend() CDlg dlg(m_t1, m_t2);if(dlg.DoModal() = IDOK) /用户单击了“确定”按钮m_t1 = dlg.m_t1;m_t2 = dlg.m_t2;Draw();void CMyDoc:OnUpdateAmend(CCmdUI* pCmdUI) / TODO: Add your command update UI handle
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 乡镇房产抵押短期借款协议
- 2025-2030中国艰难梭菌感染药物行业市场发展趋势与前景展望战略研究报告
- 人工智能科技园能源中心项目可行性研究报告(范文)
- 媒体合作媒体合作协议
- 2025-2030中国脂肪酸二乙醇酰胺行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国聚氨酯漆行业市场发展分析及前景趋势与投资研究报告
- 2025-2030中国综艺节目行业市场深度调研及竞争格局与投资策略研究报告
- 七年级英语下册 Unit 5 Why do you like pandas Section A(1a-2d)教学设计(新版)人教新目标版
- 2025-2030中国粘蛋白1行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国管接头行业市场发展趋势与前景展望战略研究报告
- 技术转让合同备忘录协议备忘录(2024年版)
- 注册会计师财务成本管理章节练习题三
- 第十一单元课题1化学与人体健康-2024-2025学年九年级化学人教版(2024)下册
- 6S管理制度(可参考)-6s管理制度
- 《子宫内膜异位》课件
- 文旅场所安全培训课件
- 《商标侵权案例分析》课件
- 脑梗死的护理查房
- 导游讲解的常用技巧教案
- 产后抑郁症讲课课件
- 算法设计与分析 课件 6.3-贪心法应用-活动安排问题
评论
0/150
提交评论