实验三 文档视图结构
- 格式:doc
- 大小:322.50 KB
- 文档页数:8
实验三视图和索引一、实验目的使学生掌握SQL SERVER中的视图创建、查看、修改和删除的方法;索引的创建和删除方法二、实验内容在学生-课程数据库中(1)用图形工具和T-SQL两种方法创建视图,取名为view_stu_grade,要求查看学生的学号,姓名,课程名和成绩。
(2)若发现视图定义的结构不能很好满足要求,还可以对它进行修改。
(3)删除视图(4)尝试分别为student表的每一个属性列添加一个惟一索引,将出现的现象和原因分析一下。
(5)删除索引三、实验过程要求个人填写(要求有文字描述和适当的图片辅助说明)注:图片需要上机运行SQL Server软件之后,可用QQ的抓图工具把运行窗口抓下来,粘贴在word文档中。
(1)①用图形工具创建视图:展开stud_course数据库,右键单击“视图”,在弹出的快捷菜单中有“新建视图”菜单项,单击“新建视图”,就会出现新建视图对话框,保存视图,给视图取名为view_stu_grade.②用T-SQL创建视图:查看结果:(2)若发现视图定义的结构不能很好满足要求,还可以对它进行修改。
如需要修改则点击视图选中view_stu_grade右键修改例如将视图修改为显示出计算机科学系男生的情况,并要求加密(3)删除视图①用图形工具删除视图②用T-SQL删除视图(4)①选中Student表打开索引,右键新建索引,如图操作②创建索引问题1(未选择要添加到索引键的表列)解决办法问题2(记录相同不能建立唯一索引)解决办法:不建立唯一结果(5)删除索引①图形工具删除索引单击鼠标右键要删除的索引,选择“删除”命令,然后弹出“删除对象”对话框,单击确定按钮,即可删除索引。
②用T-SQL语句删除索引四、实验总结要求个人填写(实验中发现的问题和解决的办法)本次实验练习了视图创建、查看、修改和删除的方法;索引的创建和删除方法。
通过这次实验我认识到视图的作用,能够简化用户的操作,视图使用户能以多钟角度看待同一数据,适当的利用视图可以更清晰的表达查询。
2016/5/30文档视图结构文档视图结构是MFC中结构最为复杂,体系最为庞大,最具有代表性的部分。
MFC之所以被称为应用程序框架,原因之一就是文档视图结构将应用程序数据管理与数据显示分离,允许用户对两部分代码进行独立编写。
一、MFC支持两种文档视图应用程序,1、单文档界面(SDI):只有一个窗口,即用户在同一时刻只能操作一个文档。
(记事本)多文档界面(MDI):可以同时操作多个文档。
(WORD)2、MFC隐藏了两种用户界面模型的许多差别,通过应用程序向导创建两种文档的过程完全一样,但SDI文档不生成类CChildFrame,SDI主框架类CMainFrame的基类是CFrameWnd,而MDI的类CMainFrame的基类是CMDIFrameWnd。
二、文档、视图、框架、文档模板文档视图结构由四个要素组成,文档,视图,框架和文档模板。
1、文档:用于管理应用程序的数据——应用程序数据的抽象表示1.1任务:1)对数据进行管理与维护,数据保存在文档类的成员变量中。
2)处理命令消息,如菜单,工具栏,加速键的WM_COMMAND通知消息(但不能处理其他WINDOWS 消息)(WINDOWS消息和控件消息只能被窗口和视图处理)。
类CDocument是所有文档类的基类,提供文档类所需要的,最基本的功能实现,为文档对象和其他对象的交互提供基本框架。
1.2类CDocument提供的三种方法:1)构造方法:创建CDocument类对象,函数声明:CDocument()。
2)操作方法(12种方法):AddView,为文档添加视图;GetTitle,返回文档标题;RemoveView,为文档移除视图;SetTitle,为文档设置标题;SetPathName,设置文档数据文件的路径。
3)虚拟方法(12种):使应用程序能够对其重写一=以获取类CDocument派生类方法。
DeleteContents,删除文档数据;OnChangeViewList,检查视图是否有增加或减少;OnNewDocument,创建文档;OnOpenDocument,打开文档;OnSaveDocument,保存文档。
文档/视图结构一、文档/视图的概念●在MFC中,文档类负责管理数据,提供保存和加载数据的功能。
视图类负责数据的显示,以及给用户提供对数据的编辑和修改功能。
●MFC给我们提供Document/View结构,将一个应用程序所需要的“数据处理与显示”的函数空壳都设计好了,这些函数都是虚函数,我们可以在派生类中重写这些函数。
有关文件读写的操作在CDocument的Serialize函数中进行,有关数据和图形显示的操作在CView的OnDraw函数中进行。
我们在其派生类中,只需要去关注Serialize和OnDraw 函数就可以了,其它的细节我们不需要去理会,程序就可以良好地运行。
●当我们按下“打开文件”菜单项时,Application Framework会激活打开文件对话框,让你指定文件名,然后自动调用CMiniCADDoc::Serialize读取文件。
Application Framework 还会调用CMiniCADView::OnDraw,传递一个显示DC,让你重新绘制窗口内容。
●MFC给我们提供Document/View结构,是希望我们将精力放在数据结构的设计和数据显示的操作上,而不要把时间和精力花费在对象与对象之间、模块与模块之间的通信上。
●一个文档对象可以和多个视图类对象相关联,而一个视图类对象只能和一个文档对象相关联。
●MFC对“文档”的设计思想是:一个类中的所有成员变量,都应该能够保存到一个文件中去,反之,也应该能从一个文件中读出来,加载到该类相应的成员变量中去。
MFC 对此的实现机制就是文档/视图的串行化(Serialize)。
二、串行化基础知识:使用CArchive类对存储在内存中的变量进行存取。
打开“006菜单工具栏状态栏”一章中的项目“2MiniCAD_图形保持”,添加菜单项“写文件”和“读文件”,对应代码如下:void CMiniCADDoc::OnFileWrite(){CFile file("C:\\1.dat", CFile::modeCreate | CFile::modeWrite);CArchive ar(&file, CArchive::store); //将CFile类和CArchive类关联起来,保存//ar.IsStoring();int i = 4;char ch = 'a';float f = 1.3f;CString str("ITJob");ar << i << ch << f << str;AfxMessageBox("成功写入数据到文件C:\\1.dat");}以二进制形式查看C:\1.dat文件的内容,如下void CMiniCADDoc::OnFileRead(){CFile file("C:\\1.dat", CFile::modeRead);CArchive ar(&file, CArchive::load); //将CFile类和CArchive类关联起来int i;char ch;float f;CString str;CString strResult;ar >> i >> ch >> f >> str;strResult.Format("从文件C:\\1.dat成功读取到数据:%d, %c, %f, %s", i, ch, f, str);AfxMessageBox(strResult);}上述代码说明,CArchive类具有对文件的读写功能,可以通过其流操作符<<将变量存入文件,通过>>将文件中的数据读取到变量中来。
软件工程实验三-概要设计人事工资管理系统概要设计目录1.导言 (3)1.1目的 (3)2.系统分析 (4)3.界面设计 (4)图2-5人事管理0层编号1的数据流图 (7)图2-6 人事管理0层编号2的1层数据流图 (8)图2-7 工资管理0层数据流图 (8)4.体系结构 (8)4.1体系结构 (9)4.1.1STRUCT体系结构 (9)4.1.2系统体系结构 (9)4.2系统运行环境 (10)4.2.1网络结构图........................................................................................... 错误!未定义书签。
4.2.2 硬件环境 (10)4.2.3软件环境 (10)5.数据模型 (11)5.1数据库的概念结构模型设计 (11)5.2数据库的逻辑结构模型设计 (11)5.3数据库管理物理结构模型设计 (11)6.模块设计 (12)6.1.1表示层设计 (12)6.1.2控制层 (12)6.1.3模型层 (12)6.2登录管理模块设计 (12)6.2.1表示层设计 (12)6.2.2控制层设计 (13)6.2.3模型层设计 (13)1.导言1.1目的该文档的目的是描述人事工资管理系统项目的概要设计,其主要内容包括:●系统功能简介●系统结构设计●系统接口设计●数据设计●模块设计●界面设计本文档的预期的读者是:●开发人员●项目管理人员●测试人员1.2范围该文档定义了系统的结构和单元接口,但未确定单元的实现方法,这部分内容将在详细设计/实现中确定。
1.3缩写说明UMLUnified Modeling Language(统一建模语言)的缩写,是一个标准的建模语言。
HRHuman resources management(人事工资管理管理)的缩写。
1.4引用标准[1] 《企业文档格式标准》北京长江软件有限公司[2] 《软件概要设计报告格式标准》北京长江软件有限公司软件工程过程化组织1.5参考资料[1] 《实战struct》〔美〕TedHusted机械工业出版社[2] 《软件重构》清华大学出版社2.系统分析本系统可以实现人事工资管理,人事管理者通过该系统进行人事工资管理。
⽂档视图结构详细介绍以单⽂档界⾯(SDI)应⽤程序为例,介绍MFC的⽂档/视图程序结构。
学习要求理解⽂档/视图结构,可在AppWizard⽣成的SDI程序框架的基础上添加必要的代码,以⽣成⾃⼰的应⽤程序。
授课内容⼤部分应⽤程序均要使⽤数据,其主要⼯作可以分为两部分:⼀是对数据的管理,如存储、复制和查询等任务,⼀是对数据的处理和输⼊输出,包括显⽰和打印。
MFC提供了“⽂档/视图”结构⽀持这类应⽤程序。
12.1⽂档/视图概念在⽂档/视图结构⾥,⽂档可视为⼀个应⽤程序的数据元素的集合,MFC通过⽂档类提供了⼤量管理和维护数据的⼿段。
视图是数据的⽤户界⾯,可将⽂档的部分或全部内容在其窗⼝中显⽰,或者通过打印机打印出来。
视图还可提供⽤户与⽂档中数据的交互功能,将⽤户的输⼊转化为对数据的操作。
在MFC中,有两种类型的⽂档视结构,即单⽂档界⾯(SDI:Single Document Interface)应⽤程序和多⽂档界⾯(MDI:Multiple Document Interface)应⽤程序。
在单⽂档界⾯(SDI)程序中,⽤户在同⼀时刻只能操作⼀个⽂档,例如Windows的NotePad(记事本)程序采⽤的就是单⽂档界⾯。
在SDI程序中,打开新⽂档时会⾃动关闭当前打开的活动⽂档,如果当前⽂档修改后尚未保存,会提⽰⽤户是否保存所做的修改。
SDI应⽤程序⼀般都提供⼀个File菜单,在该菜单下有⼀组命令,⽤于新建⽂档(New)、打开已有⽂档(Open)、保存或换名存盘⽂档等。
这类程序相对⽐较简单,常见的应⽤程序有终端仿真程序和⼀些⼯具程序。
多⽂档界⾯(MDI)应⽤程序允许同时对多个⽂档进⾏操作,例如Microsoft Word和Developer Studio本⾝采⽤的都是多⽂档界⾯。
在MDI程序中可以打开多个⽂档(同时也为每个⽂档打开⼀个窗⼝),可以通过切换活动窗⼝激活相应的⽂档进⾏编辑处理。
MDI应⽤程序也提供⼀个File菜单,⽤于新建、打开和保存⽂档。
实验三Word 操作训练实验报告一、实验目的:通过该试验,掌握文档、文本、字符、段落、项目符号、分栏、图片、艺术字、表格、公式编辑器、页面排版等的使用和操作二、实验内容和步骤:1. 样张1:文字处理软件WPS之父金山软件是中国最知名的软件企业之一,中国领先的应用软件和互联网提供商。
做世界一流的软件公司,是所有金山人不变的梦想。
金山软件创造了WPS office、金山词霸、金山毒霸、剑侠情缘、封神榜等众多知名产品。
金山软件董事长兼CEO得求伯君——这位成功开发国内第一套文字处理软件WPS的软件业“教父”而言,如何扛起民族软件自主创新大旗,前方并非一路平坦。
1986年,求伯君辞去河北省徐水县国企的工作,加盟北京四通公司,并于次年调往深圳四通公司。
1988年,求伯君加入香港金山公司,在深圳从事软件开发,并于1989年成功开发国内第一套文字处理软件WPS.1994年,由于香港金山被方正合并,求伯君脱离出来,自己在珠海成立珠海金山电脑公司,任董事长兼总经理,WPS业迎来了它最强的对手——微软旗下的word。
主动出击迎战的求伯君,生产出一种类似office套件的产品,叫做盘古组件,包含WPS、电子词典和电子表等产品。
然而,盘古组件——这款珠海金山独立自主做出的第一个软件最终败兵麦城。
1997年9月,WPS97正式上市,成绩出乎意料的好,推出仅两个多月,销量便达到1.3万套,金山也借此迈过最艰难的时刻。
1998年至2003年,先后获得联想等注资的金山软件,重点发力WPS、金山词霸、金山毒霸三大业务,金山软件的发展进入平稳阶段。
2003年,金山软件迎来了战略转型,求伯君和是时的搭档雷军发现了网游这块大蛋糕。
事实上,这一年,金山软件本已打算前往纳斯达克上市融资,但他们发现了准备上市和马上进军网游业务间的矛盾。
几经权衡,求伯君和搭档雷军共同说服了公司股东。
后来雷军回忆说,那一年资源其实还很有限,无法在多个战场全部拉开。
(转)文档视图结构中的各个部分是如何联系到一起的文档/视图结构是MFC中最有特色而又有难度的部分,在这当中涉及了应用、文档模板、文档、视图、MDI框架窗口、MDI子窗口等不同的对象,如果不了解这些部分之间如何关联的话,就可能犯错误,也就很难编出有水平的文档/视图程序。
比如我在初学VC编程的时候,为应用程序添加了两个文档模板,两个模板公用一个文档类,只是视图不一样,期望当一个模板的文档的视图改变了文档后,调用UpdateAllViews后也能更新另一个文档模板的视图,结果当然是不行的,原因就是对MFC的文档/视图结构没有深入的了解,了解的最好方法就是阅读一下MFC的源代码。
下面就是我的笔记:(一)应用程序对象与文档模板之间的联系:首先,在应用程序对象中有一个CDocManager指针类型的共有数据成员m_pDocManager,在CDocManager中维护一个 CPtrList类型的链表:m_tempateList,它是一个保护成员。
InitInstance函数中调用CWinApp:: AddDocTemplate函数,实际上是调用m_pDocManager的AddDocTemplate函数向链表m_templateList 添加模板指针。
CWinApp提供了GetFirstDocTemplatePosition和GetNextDocTemplate函数实现对m_templateList链表的访问(实际上是调用了CDocManager的相关函数)。
在文件操作方面CWinApp提供的最常用的功能是文件的新建(OnFileNew)和打开(OnFileOpen),它也是调用CDocManager 类的同名函数。
对于新建,一般的时候在只有一个文档模板的时候,它新建一个空白的文件;如果有多个文档模板的时候,它会出现一个对话框提示选择文档类型。
它的源代码如下:void CDocManager::OnFileNew(){if (m_templateList.IsEmpty()){.......return;}//取第一个文档模板的指针CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead();if (m_templateList.GetCount() > 1){// 如果多于一个文档模板,出现对话框提示用户去选择CNewTypeDlg dlg(&m_templateList);int nID = dlg.DoModal();if (nID == IDOK)pTemplate = dlg.m_pSelectedTemplate;elsereturn; // none - cancel operation}......//参数为NULL的时候OpenDocument File会新建一个文件pTemplate->OpenDocumentFile(NULL);}打开文件:void CDocManager::OnFileOpen(){// 出现打开文件对话框CString newName;if (!DoPromptFileName(newName, AFX_IDS_OPENFILE,OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, TRUE, NULL)) return; // open cancelledAfxGetApp()->OpenDocumentFile(newName); //实际也是调用文档模板的同名函数}(二)文档模板与文档之间的联系:从上面看出应用程序对象对文件的新建和打开是依靠文档模板的OpenDocumentFile函数实现的。
实验三文档视图结构1.实验学时:4学时2.实验目的:学习MFC程序的文档视图结构。
3.实验内容:(1)创建一个标题为“ MySdi”的应用程序。
主窗口中显示一文本“您好, 单文档界面的例程!”。
“编辑”菜单含有菜单项“改变显示文本”,单击该项,弹出一个对话框,用以改变主窗口中的显示文本。
如图1所示。
(2)创建一个标题为“ My MDI Test–Mymdi1”多文档的应用程序,程序运行后,可以打开若干个文档,如图2所示, Mymdi1和Mymdi21是两个文档.图1 单文档应用程序图2 多文档应用程序4.实验步骤:对于单文档应用程序:1. 创建工程:创建一个MFC AppWizard(exe)工程文件Mysdi,并选择Single Document的的应用程序。
2. 添加资源:程序添加如图所示的对话框。
并使用ClassWizard为对话框生成CDialog类的派生类CDlgInput,并为其中的EditBox控件(其ID为IDC_EDIT1)添加相关联的成员变量m_input,其类型为Cstring。
3. 添加成员变量:为CMysdiDoc类添加成员变量,步骤如下:在Workspace窗口的ClassView选项卡中展开Mysdi Class,右击CMysdiDoc;在弹出菜单中,单击Add Member Variable;输入变量类型为CString, 变量名m_str, 访问类型public:单击OK。
4.文档变量初始化:在CMysdiDoc的OnNewDocument成员变量中为公有成员m_str赋以初值“您好, 单文档界面的例程!”。
方法是将OnNewDocument的实现替换为如下代码:BOOL CMymdiDoc2::OnNewDocument(){if (!CDocument::OnNewDocument()) return FALSE;m_str="您好, 单文档界面的例程!";return TRUE;}5.视图的输出为视图的框架窗口中显示文档类的m_str成员变量的内容,用如下代码替换类CMysdiView的OnDraw成员函数void CMysdiView::OnDraw(CDC* pDC){CMysdiDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CRect rectClient;GetClientRect(rectClient); // 取当前客户区的指针CSize sizeClient=rectClient.Size(); // 取当前客户区的大小CString str=pDoc->m_str; // 从文件中读取数据CSize sizeTextExtent=pDC->GetTextExtent(str); // 用新字体绘制字符pDC->TextOut((sizeClient.cx-sizeTextExtent.cx)/2,(sizeClient.cy-sizeTextExtent.cy)/2, str);}6. 添加菜单项:在“编辑”菜单中添加一项改变文档内容的菜单,可将所修改的文档显示文本存入磁盘文件,实现方法如下:(1)单击Workspace窗口--> ResourceView选项卡--> 展开Mysdi resources|Menu --> 双击IDR_MAINFRAME --> 为“编辑”菜单添加一个菜单项“改变显示文本”--> 设置ID 为ID_EDIT_CHANGETEXT。
(2)为示例程序添加如图16-7所示的对话框。
然后,使用ClassWizard为对话框生成CDialog类的派生类CInputDlg,并为其中的EditBox控件(其ID为IDC_EDIT1)添加相关联的成员变量m_input,其类型为CString。
(3)在类CMysdiDoc中为菜单项“编辑|改变显示文本”(ID为ID_EDIT_CHANGETEXT)添加处理函数OnEditChangeText()void CMysdiDoc::OnEditChangetext(){CInputDlg inputDlg; //建立一个CinputDlg类的对象inputDlg//使inputDlg成为一个模式对话框if( inputDlg.DoModal()==IDOK ){m_str = inputDlg.m_input; //获取输入的字符串UpdateAllViews(NULL); //更新视图}}7. 为使CInputDlg类在CMysdiDoc类中成为可识别的,必须在mysdiDoc.cpp文件中加入CInputDlg类的说明头文件InputDlg.h#include “InputDlg.h”//加入头文件8. 运行,调试。
对于多文档应用程序:1. 创建MDI工程:创建一个MFC AppWizard(exe)工程文件Mymdi,并选择Multiple Document的的应用程序。
在Step4单击Advanced,并设置Advanced Option对话框。
在Step6设置基类为CEditView。
其它均取默认值设置。
2. 创建第二种文档和视图类:在View-->Class Wizard-- lass Info-->Add Class加入新类在New Class对话框设置Cdocument的派生类CMymdiDoc2。
同样方法,加入CScollView的派生类CMymdiView2。
3. 创建资源:(1) 文档、视图、框架窗口共同的资源ID在Resource.h文件中,手工加入下列代码:#define IDR_MYMDITYPE2 135这样,就定义了文档、视图、框架窗口共同的资源ID。
(2) 文档模板的资源对于第一个文档,利用应用程序向导直接产生了一个文档模板,现在必须手工地运用这种格式加入资源。
具体的方法是在mymdi.rc文件中,加入下列代码:IDR_MYMDITYPE2 “\nMymdi2\nMymdi2\nMymdi2 文件(*.mm2)\n.mm2 \nMymdi2.Document\nMymdi2 Document"(3) 菜单、对话框资源:为了实现可视化的程序,须添加一系列的资源,用户可将所修改文档显示文本保存入磁盘文件,需要时再打开并恢复该文档。
(a) 单击Workspace窗口的ResourceView选项卡,展开Mymdi resources|Menu,加入ID为IDR_MYMDITYPE2的菜单,使它与现有的ID为IDR_MYMDITYPE的菜单完全相同,然后,在其“编辑”菜单添加菜单项“改变显示文本”,并添加新菜单项ID为ID_EDIT_CHANGETEXT。
(b) 用与单文档应用程序完全相同的方法,添加的对话框。
使用ClassWizard为对话框生成CDialog类的派生类CDlgInput,并为其中的EditBox控件(其ID为IDC_EDIT1)添加相关联的成员变量m_input,其类型为CString。
4. 代码编辑1. 创建文档模板类在应用程序的InitInstance()函数中,通过使用文档模板的构造函数创建文档模板的对象如下:BOOL CMymdiApp::InitInstance(){ …CMultiDocTemplate* pDocTemplate2;pDocTemplate2 = new CMultiDocTemplate(IDR_MYMDITYPE2,RUNTIME_CLASS(CMymdiDoc2), //MDI派生文档类的CRuntimeClass对象的指针RUNTIME_CLASS(CChildFrame),//MDI派生子框架类的CRuntimeClass对象的指针RUNTIME_CLASS(CMymdiView2) // 创建文档模板的对象);//使用CwinApp::AddDocTemplate() 将新模板添加到应用程序的文档模板列表中AddDocTemplate(pDocTemplate2);…}为使CMymdiDoc2类和CMymdiView2类在CMymdiApp类中成为可识别的,必须在MymdiApp.cpp文件中加入说明CMymdiDoc2类和CMymdiView2类的MymdiDoc2.h和MymdiView2.h#include "MymdiDoc2.h" //加入头文件#include "MymdiView2.h"2. 扩展CMymdiDoc2类(a) 添加成员变量用对CMysdiDoc类同样的方法,对CmymdiDoc2类添加成员变量,最终,在CMymdiDoc2.h 的下述代码段中增加变量m_str声明语句。
// Attributespublic:CString m_str;(b) 文档变量初始化在CmymdiDoc2的OnNewDocument成员变量中为公有成员m_str赋以初值“您好, 多文档界面的例程!”。
方法是将OnNewDocument()代码替换如下:BOOL CMymdiDoc2::OnNewDocument(){if (!CDocument::OnNewDocument()) return FALSE;m_str="您好, 多文档界面的例程!";return TRUE;}(c) 添加菜单处理函数使用ClassWizard在类CmymdiDoc2中为菜单项“编辑|改变显示文本”(ID为ID_EDIT_CHANGETEXT)添加处理函数OnEditChangeText,其代码如下:void CmymdiDoc2::OnEditChangetext(){ CDlgInput inputDlg; //建立CinputDlg类的对象inputDlgif( inputDlg.DoModal()==IDOK )//inputDlg成为一个模式对话框{m_str = inputDlg.m_input; //获取输入的字符串UpdateAllViews(NULL); //更新视图}}为了在CMymdiDoc类中识别CinputDlg类,必须在文件MymdiDoc2.cpp中加入说明CinputDlg类的头文件。
#include "InputDlg.h"//加入头文件3.视图的输出为在视图的框架窗口中显示文档类中的m_str成员变量的内容,应为CmymdiView2类的OnDraw成员函数添加些代码,将OnDraw成员函数替换如下:void CmymdiView2::OnDraw(CDC* pDC){CmymdiDoc2* pDoc = (CmymdiDoc2*)GetDocument();ASSERT_VALID(pDoc);CRect rectClient; // 当前客户区GetClientRect(rectClient); // 获取当前客户区的指针CSize sizeClient=rectClient.Size(); // 获取当前客户区的大小CString str=pDoc->m_str; // 从文件中读取数据CSize sizeTextExtent=pDC->GetTextExtent(str);//用新字体绘制字符pDC->TextOut((sizeClient.cxsizeTextExtent.cx)/2,(sizeClient.cysizeTextExtent.cy)/2,str); // 确定文本输出位置5.实验要求:实验报告中要有演示程序运行的结果截图。