实验4单文档和多文档窗口_第1页
实验4单文档和多文档窗口_第2页
实验4单文档和多文档窗口_第3页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验 4 单文档和多文档窗口一 实验目的掌握利用开发平台创建单文档和多文档窗口方法掌握在窗口中输出文字、图形的方法及 MFC 中相关类的使用二 实验要求1创建一个单文档窗口,在文档类定义一个整型变量,其取值范围从01000循环,在视图的中间显示该数字,当用户点击窗口的不同区域时,变量值按不同的增量增加并显示。提示:在修改数据后,使用 Invalidate() 函数引起 MFC 对 OnDraw() 的调用,这样就可 以用修改后的数据进行画图了。关于对文档类的访问,见本实验的技术支持。2 创建一个单文档窗口, 鼠标在窗口上单击后在鼠标的位置显示一正方形, 点击 20 次后清 窗口, 新的点击将不

2、再增加新的正方形, 而是将已输入的正方形在原位置显示,当然, 在每 20 单击后要重新清窗口。(要求用 MFC 的通用类保存单击的信息,如 CList 类)知识点:画线当单击鼠标左键时, 就可以获得一个点, 即线条的起点。 接着按住鼠标左键并拖 动一段距离后松开鼠标,此时也可以获得一个点,即线条的终点。也就是说,我 们需要捕获两个消息,一个是鼠标左键按下消息( WM_LBUTTOND)VV在该消息 响应函数中可以获得将要绘制的线条的起点;另一个是鼠标左键弹起来的消息(WM_LBUTTONUP在该消息响应函数中可以获得将要绘制的线条的终点。有了这两个点就可以绘制出一条线。利用 SDK 全局函数实

3、现画线功能为了进行绘图操作,必须获得一个设备描述表(DC ),因此,首先定义一个 HDC 类型的变量:hdc,接着调用全局函数 GetDC获得当前窗口的设备描述表。因为 CWnd类有一个成员变量( m_hWnd ),而 CView 类派生于 CWnd 类,因此该类也有这样的一个成员变用于 保存窗口句柄,而 GetDC 函数可以直接把这个成员变量作为参数来使用。利用 MFC 的 CDC 类实现画线功能该类提供一个数据成员 m_hDC 类用来保存与 CDC 相关的 DC 句柄。其道理与 CWnd 类提供成员变量 m_hWnd 保存与窗口相关的窗口句柄是一样的。CDC* pDC = GetDC();

4、pDC->MoveTo(m_ptOriginal);pDC->LineTo(point);ReleaseDC(pDC);利用 MFC 的 CClientDC 类实现画线功能利用 MFC 提供的 CClientDC 类来实现画线的方法。这个类派生于 CDC 类,并且在构 造时调用 GetDC 函数,在析构时调用 ReleaseDC 函数。也就是说,当一个 CclientDC 对象 在构造时会调用 GetDC 函数,获得一个设备描述表对象;对象析构时,会自动释放这个设 备描述表资源。这样的话,程序中只需要定义一个 CclientDC 对象,就是利用该对象提供的 函数进行绘图操作了。当该

5、对象的生命周期结束时,会自动释放其所占用的设备资源。CClientDC dc(this);dc.MoveTo(m_ptOriginal);dc.LineTo(point);为了在视图之外的框架上画图,将第一句改为 CClientDC dc(GetParent(); ,结果发现线 条可以画到工具栏上面了。绘制彩色线条CPen pen(PS_SOLID,1,RGB(255, 0, 0);/画笔为实线、线宽为 1、红色。点线设为 PS_DOT ,虚线为 PS_DASHCClientDC dc(this);Cpen* pOldPen = dc.SelectObject(&pen);/ Sele

6、ctObject 函数实现将 GDI 对象选入设备描述符中, 并且返回原先被选对象的指针 dc.MoveTo(m_ptOriginal);dc.LineTo(point);dc.SelectObject(pOldPen);/ 恢复原画笔3 在一个单文档窗口中,当鼠标在窗口中移动并按下左键时画图,左键弹起时停止4 创建一个 MDI 窗口,读入一个数据文件,然后用不同的方式在不同的窗口上显示。三 实验过程4.1创建一个单文档窗口,在文档类定义一个整型变量,其取值范围从01000循环,在视图的中间显示该数字, 当用户点击窗口的不同区域时, 变量值按不同的增量增加并显示。提示:在修改数据后,使用 In

7、validate() 函数引起 MFC 对 OnDraw() 的调用,这样就可 以用修改后的数据进行画图了。目标:掌握运用 Appwizard 创建一个应用程序, 熟悉 CApp1Doc 文档类和 CApp1View 视图 类,掌握视图类的 OnDraw() 的调用和文档类中的数据处理步骤:1 使用 AppWizard 创建一个应用程序创建一个 MFC 单文档应用程序1) 单击 Developer Studio 的 File (文件)菜单中的 New (新建)命令,以显示 New 对话框,选 择 MFC( AppWizard (exe) ,然后输入需要创建工程的名称和目录(见图 4-1)。注意

8、,几乎在所有的工程文件的内部和外部都使用该名字,因此,此处的任何错误在以后都是很 难改正的。选择MFCAppWizardfexe)nn输入项目的名字和日录图4-1指定应用程序的文件名和位置2)AppWizard的第一步是选择应用程序的类型(见图4-2 ),选择单文档选项。选择闷用 程序类型图4-2选择应用程序类型3) AppWizard的第二步要求指定应用程序所需要的数据库支持种类。选择Header FilesOnly (只有头文件)使AppWizard只添加支持数据库访问的MFC类。因此,访问一个 ODBC或DAO数据库,选择 Database View without File Suppo

9、rt(数据库视图,没有文件支持)或者Database View With File Support(数据库支持,具有文件支持)使AppWizard创建一个具有特殊的视图和文档类的简单的数据库编辑器。如果选择 Database View without FileSupport ,AppWizard将不添加标准文件打开命令到应用程序菜单(即:File /New, File/Open等)。从理论上讲,如果只访问一个数据库,无论如何也不需这些命令,当应用程序开始运行时,合适的数据库将被自动打开。然而,如果应用程序既要访问平面文件,又要访问数据库文件,则应该选择 Database View with F

10、ile Support 。4) AppWizard的第三步要求指定应用程序所需要的C O M支持。本实验只采用了默 认选项。5)AppWizard的第四步要求选择一些基本的应用程序选项(见图4- 3 ),可以选择应用程序是否有一个工具栏或状态,是否添加打印命令到菜单,以及是否包括支持e-mail或网络通信。Recent File list(当前文件列表)是应用程序打开的最近几个文件的一个列表,它由应用程序自动维护,用户必须决定这里的n是多少。单击 Advaneed (高级)按钮进行更高级的选项设置(本实验采用默认选项)。陇择简单的血用理序选项然后编辑将在 文件对话中显 示的过滤名了图4-3选择

11、应用程序选项6)高级选项的第一页要选择将在应用程序标题栏中显示的标题。如果创建一个串行化它 的文档到磁盘的应用程序,则可以选择应用程序追加给那些文件的文件扩展名,然后就可以在打开或保存文档时显示的文件对话框的过滤域中编辑文本(见图4 -4 )(本实验采用默认选项)。输入应用程 序创建的文 档的三个字 母扩展名图4-4指定应用程序标题、缺省文件扩展名和文件对话文本7)高级选项的第二页要求在应用程序中添加视图分割(Splitting )能力,它将提供允许动态分割他们的视图的一个菜单命令。也可以决定是否要求应用程序主窗口或子窗口初始最大化或初始最小化,以及用户是否能够重调它们的大小(见图4- 5)(

12、本实验采用默认选项)cAdvarttsd Qp-l*ontm-BW- »*- M 8»» i!S -厂I曲SfilU : . iJ = iia* * BL._MI: . K J.'输入高级应 用程序选顼17 Mr i nut: Liisi戸加说m m*r:u f* Mm nutd 厂 M j»itudMD <Wd Pbh'fr 脚应時 F liJi JhiE舟bowM n r»Ed疗 Ma- riie tow Mreed图4-5:指定应用程序的框架窗口选项8)在AppWizard的第五步,必须决定是用MFC库静态链接,还是

13、用一个共享的MFC DLL进行链接(见图4 - 6 )。静态链接MFC库使应用程序相当庞大,但用户从来不必考虑正确版 本的MFC DLL当前是否已经安装在系统上。如果计划用MFC库创建自己的 DLL,则必须链接MFC DLL 。(本实验采用默认选项)选择是慨态链 接MFC还是与 其他应用程序 共亨它的DLL图4-6选择怎样链接MFC9)AppWizard的最后一步,允许改变应用程序的视图类。关于选项的描述。对于没有列出的任何视图类,选择缺省视图类一可以在以后编辑名字(见图4-7 )。(本实验采用默认选项)选定视图类文件wFC AwWiriiri- Slct Gof SC.-/a*ppCMarF

14、iSTji: 任hfcFi長 i 口吩57 gmIddUMS CFa林g iL_rtl'Xe.«j L-t IT'Hli.hf iJhpWT 毋 cr<JVuwAppVikfld ce«*53 hebhing 云邹:?$ 才卅匚选样件地 选择一个 不同的视 関类图4-7选择一个视图类.10) 编译连接后,产生的默认的单文档应用程序(图4-8)图4-8 个单文档应用程序2.在文档类定义一个变量 m_value,在视图类里面给添加命令响应函数 On LButto nDow n(UINT nFlags, CPoi nt poi nt),用于捕捉鼠标点击位置,

15、作为变量值。具体代 码添加如下:在文档类头文件中/ Impleme ntati onpublic:int m_value; /添加整形变量名virtual CSy41Doc();在构造函数初始化 m_valueCSy41Doc:CSy41Doc()/ TODO: add one-time construction code herem_value=0; 在视图类添加的整形变量x, y,布尔变量 m_bCaptured在视图类头文件中/ Implementationpublic:int y;int x;bool m_bCaptured;virtual CSy41View(); 在构造函数中初始化

16、变量 CSy41View:CSy41View() / TODO: add construction code herex=0;y=0;m_bCaptured=false;在鼠标响应函数 OnLButtonDown(UINT nFlags, CPoint point) 中添加 void CSy41View:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default/SetCapture(); m_bCaptured=true;x=point.x;y=

17、point.y;Invalidate(m_bCaptured); / 进行操作的更新CView:OnLButtonDown(nFlags, point); 在 OnDraw(CDC* pDC )中添加void CSy41View:OnDraw(CDC* pDC)CSy41Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/pDoc->m_value=(x+pDoc->m_value)%1000;CString m_str;m_str.Format("

18、%4d", pDoc->m_value);pDC->TextOut(x,y,m_str);4.2 创建一个单文档窗口, 鼠标在窗口上单击后在鼠标的位置显示正方形, 点击 20 次后清窗 口,新的点击将不再增加新的正方形, 而是将已输入的正方形在原位置显示, 当然, 在每 20 单击后要重新清窗口。 (要求用 MFC 的通用类保存单击的信息,如 CList 类) 目标:熟悉视图类文件的 OnDraw ()函数,掌握鼠标消息映射函数实现人机界面功能。 步骤:1 如实验 4.1 创建一个单文档窗口,在视图类里面添加两个成员变量,整形变量count 用于记录鼠标点击次数, 布尔变

19、量 m_bCaptured 用于判断鼠标的点击, 添加一个 CRect 类的对 象 m_boxShape 。添加成员函数鼠标消息映射函数OnLButtonDown(UINT nFlags, CPointpoint) 。具体的程序清单如下。在视图类头文件中添加成员变量/ Implementationpublic:int m_count;CRect m_boxShape;bool m_bCaptured;初始化成员变量在 CSy42View:CSy42View()CSy42View:CSy42View()/ TODO: add construction code herem_bCaptured=f

20、alse;m_count=0;在鼠标消息映射函数 OnLButtonDown(UINT nFlags, CPoint point) 添加: void CSy42View:OnLButtonDown(UINT nFlags, CPoint point)/ TODO: Add your message handler code here and/or call default/SetCapture(); m_bCaptured=true;if(m_bCaptured)m_count+=1; if(m_count%20 != NULL)m_boxShape.left=point.x; m_boxSh

21、ape.right=point.x+100;m_boxShape.top=point.y; m_boxShape.bottom=point.y+100;else m_boxShape.left=0; m_boxShape.right=0; m_boxShape.top=0; m_boxShape.bottom=0; m_count=0;Invalidate(true);m_bCaptured=false;CView:OnLButtonDown(nFlags, point);在 OnDraw(CDC* pDC) 函数中添加void CSy42View:OnDraw(CDC* pDC)CSy42D

22、oc* pDoc = GetDocument(); ASSERT_VALID(pDoc);/ TODO: add draw code for native data here pDC->Rectangle(m_boxShape);4.3 在一个单文档窗口中,当鼠标在窗口中移动并按下左键时画图,左键弹起时停止目标:熟悉使用鼠标进行画图,并且选择不同的画笔。步骤:1按照实验 4.1 创建一个单文档窗口,然后在视图类头文件中 sy43View.h 添加 ShpType 集合类型和结构体 Shape 结构以及常量 SHPS_MAX=1000;enum ShpType / 可以添加其他图形shpR

23、ectangle;struct ShapeCRect m_boxShape;ShpType m_typeshape;const int SHPS_MAX=1000;2在视图类头文件 sy43View.h 中添加数据成员到公共属性区, 并且在文件 sy43View.cpp 的 视图类构造器 CSy43View:CSy43View() 初始化成员变量public:ShpType m_TypeNext;Shape m_shpTemp;Shape m_arShpsSHPS_MAX;int m_countShapes;bool m_bCapture;CBrush * m_pBrush01d;ShpTyp

24、e m_typeshape;/ CSy43View:CSy43View()/ TODO: add construction code here srand(unsigned) time(NULL); m_TypeNext=shpRectangle;m_bCapture=false;m_pBrush01d=NULL;m_countShapes=0;3在视图的 OnDraw 函数添加如下代码,采用一个 for 循环砸在数组 m_arShps 绘出所有图 形。void CSy43View:OnDraw(CDC* pDC)CSy43Doc* pDoc = GetDocument();ASSERT_VA

25、LID(pDoc);/ TODO: add draw code for native data hereSetPenBrush(pDC);for (int nShp=0; nShp<m_countShapes; nShp+)ASSERT(m_arShpsnShp.m_typeshape=shpRectangle); pDC->Rectangle(m_arShpsnShp.m_boxShape);ResetPenBrush (pDC);函数说明,首先调一个 SetPenBrush 函数改变 OnDraw 函数的设备描述表,在程序结束后, 调用一个对应 ResetPenBrush 函数

26、回复以前的设备描述表属性。4给鼠标消息添加消息函数,首先是OnLButtonDown 消息处理函数中,添加如下代码void CSy43View:OnLButtonDown(UINT nFlags, CPoint point)/ TODO: Add your message handler code here and/or call default /SetCapture();m_bCapture=true;ASSERT(m_TypeNext=shpRectangle);CView:OnLButtonDown(nFlags, point);接着在 OnMouseMove 消息处理函数中添加voi

27、d CSy43View:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default if(m_bCapture)CView:OnMouseMove(nFlags, point);最后在 OnLButtonUp 消息处理函数中,添加void CSy43View:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defa

28、ult if(m_bCapture):ReleaseCapture(); m_bCapture=false; CClientDC dc(this);InvertShape(&dc,m_shpTemp,false); m_arShpsm_countShapes=m_shpTemp; m_countShapes+;CView:OnLButtonUp(nFlags, point);5.添加绘图辅助函数,在 sy43View.cpp文件中添加函数 SetPenBrush,添加如下代码 void CSy43View:SetPenBrush(CDC *pDC)ASSERT(pDC !=NULL);

29、 m_pBrush01d=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);接着添加 ResetPenBrush 函数,添加如下代码void CSy43View:ResetPenBrush(CDC *pDC)ASSERT(pDC !=NULL);ASSERT( m_pBrush01d !=NULL); m_pBrush01d=(CBrush*)pDC->SelectStockObject(NULL_BRUSH); m_pBrush01d=NULL;最后添加 InvertShape 函数,添加代码如下:void CSy43View:InvertS

30、hape(CDC *pDC, Shape &s, bool bInvert)ASSERT(pDC !=NULL);int nMode01d;if(bInvert) nMode01d=pDC->SetROP2(R2_NOT);SetPenBrush(pDC);shpRectangle: pDC->Rectangle(s.m_boxShape); if(bInvert) pDC->SetROP2(nMode01d);ResetPenBrush(pDC);其中, InvertShape 函数是将绘图和擦除动作合成在一起。4.4 创建一个 MDI 窗口,读入一个数据文件,然后

31、用不同的方式在不同的窗口上显示。 目标:熟悉多文档窗口的创建,掌握在不同的窗口中用不同的方式显示数据文件。步骤:1 按照实验 4.1 的创建一个多文档窗口,如图4-2,选择多文档选项。2在 CChildFrame 添加一个基于 CSplitterWnd 类成员变量 m_wndSplitter ,同时添加一个成 员函数 OnCreateClient( LPCREATESTRUCT lpcs ,CCreateContext* pContext) ,添加代码如下: BOOL CChildFrame:OnCreateClient( LPCREATESTRUCT lpcs,CCreateContext*

32、 pContext) if(!m_wndSplitter.CreateStatic(this,1,2)|!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CStatView1),CSize(165,0),pContext)|!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CStatView2),CSize(0,0),pContext) return false;return true;我们调用 3 个函数:一个 m_wndSplitter.CreateStatic ,两个 m_wndSplitter.CreateVi

33、ew 。如 果其中一个调用失败,讲返回false,应用程序中止运行。函数CreateStatic采用一个参数来标识它的父窗口,2个参数用来设置行数和列数(在实例中是 1 行 2 列),创建初始化静态分割窗口。对于静态分割窗口,我们用 CreateView 函数 设置窗口的视图类,前两个参数用于设置窗口的行数和列数,采用0、 0 使窗口具有 1 行 2列(两个窗口左右并列) ;在第二个 CreateView 函数调用中, 采用参数 0、1。每一个 CreatView 函数调用传递一个 CRuntimeClass 对象,可由 RUNTIME_CLASS 宏获得,传递该对象,用 于标识 MFC 创建

34、视图对像所需的视图类。在上面的列子中,我们为左右两个窗口分别设置为C View的派生类CStatViewl和CStatView2。 CSize变量用于设置两个窗口的宽度。在本 实例中调用 CSize( 165, 0),采用 CSize( 0, 0)用来设置右边窗口占用左边窗口所剩余的 水平空间。3. 在文档类定义两个成员变量,整型变量m_value,字符串变量 m_stri ng,初始化为: CSy44Doc:CSy44Doc()/ TODO: add one-time construction code herem_String="Hello World!"m_Value

35、=582;4. 创建两个 CView 的派生类 CStatView1 和 CStatView2 。采用 insert 中 new class 命令添加。 在新创建的两个类的 OnDraw(CDC* pDC) 函数里面添加如下代码:void CStatView1:OnDraw(CDC* pDC)CSy44Doc* pDoc =(CSy44Doc*) GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code here pDC->TextOut(10,10,pDoc->m_String);void CStatView2:OnDraw(C

36、DC* pDC)CSy44Doc* pDoc = (CSy44Doc*)GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code hereCString x;x.Format("%4d",pDoc->m_Value); pDC->TextOut(10,10,x); 数据文件分别显示在不同的窗口里面。四 技术支持. Single DocumentInterface(SDI ,单文档界面 ) 这种类型的应用程序一次 只允许打开个文档。 文档自动充满应用程序的主窗口, 不为其他的文档留下空 间。 Windows 的

37、NotePad 程序是一个 SDl 应用程序。 Multiple Document Interface (MDI,多文档界面 ) 这种类型的应用程序允许同时打开多个文档。我们非常熟悉的 Word 就属于 MDI 应用程序。究竟何时选择 SDI 和 MDI ?如果在运行期间应用程序只与一个文档有关连, 那 么就使用 SDI 方法。但是,如果应用程序能产生多个文档,并对多个文档进行 处理( 即使这不是一次性完成的 ) ,这时应该采取 MDI 的方法,即使在开始时并 没有看到在同一时间修改多个文档的可能。一个 MDI 应用程序并不比一个 SDI 应用程序复杂多少,却可以带给用户在同一时间看阅多个文档

38、的方便。如果不特别说明,MFC应用程序使用编程的模板将数据和数据显示分离开,将数 据与用户对数据的交互分离开。在这种模型下,MFC文档对象读写数据,提供与 数据的接口。 个独立的视图对象管理数据的显示, 为窗口提供数据公用及用户 对数据的选择、编辑。视图对象从文档获取数据,将数据的变化传回文档。尽管用户可以忽略文档和视图的分离,但是,遵循这种模型是有原因的。第一, 当用户需要同一个文档的多个视时 ( 如表格和图表视图 ),由于对所有视图的公用 代码存在文档中, 文档视图结构使一个单独的视图对象代表了数据的每一个视 图。当数据变化时,文档将更新所有的视图对象。MFC的文档/视图结构支持多视图,多

39、文档类型,切分窗口和其他用户接口特性。 文档视图结构的核心是以下四个类: CDocument或COIeDocument)用于存储和控制程序数据的对象; CView ( 或派生类) 用于显示文档数据和管理用户与数据的交互; CFrameWnd提供文档的一个或多个视图的框架; CDocTempIate ( 或 CSingIeDocTemptate 、CMuItiDocTempIate) 协调给定类 型的一个或几个文档,并管理创建文档、视图和框架窗口对象。文档和视图在一个典型的 MFC 应用程序中是成对出现的。数据存放在文档中, 而视图对这些数据有访问优先权。 文档与视图的分离将数据的存储和维护与它

40、的 显示分离开来:从视图中访问文档数据从视图中访问文档数据有两种方式,一种是使用 GetDocumemt函数,返回一个指向文档的指针,另一种就是使视图类成为文档类 的友元。用户输入到视图现将鼠标单击解释为选择或编辑数据, 同样,将键盘输入认为是 数据的输入或编辑。 假设用户在视图中输入一个字符串,视图将获得到文档的 指针并使用指针将新的数据化送到文档中,以某种数据结构存储起来。更新同一文档的多个视图在一个带有多个视图的应用中, 如文本编辑器的切分窗 口,视图首先将新数据传到文档中, 然后调用文档的 UpdateAllViews 成员函数, 通知文档所有的视图进行更新。视图的其他成员函数处理和解

41、释所有用户的输入, 用户通常在视图类中定义消息 处理函数,以便处理以下内容: Windows 消息,由鼠标和键盘操作产生; 来自菜单、工具条按钮和加速键产生的命令。视图所处理的消息依赖于应用 程序。在前面的消息处理和映射一节中已解释了怎样将菜单项和其他用户界面控 制与命令相连。经常使用的有 7 个重要的 CDocument 函数。这些函数分为三类: 访问视图的函 数、与文档信息相关的函数、与修改状态有关的函数。?对视图的访问一一CDocument类提供了三个函数使得对附属在文档上的 视图更容易使用 由于一个文档可以有多个视图,但每个视图只能有一个 文档。所以可以通过调用 GetFirstVie

42、w() 函数来获取一个附属在文档上 的视图。如果有多个视图存在的话, 则可以调用 GetNextView() 直到返回 值为NULL=文档不时地改变某些数据并需要通知其所有的视图进行更新, UpdateAllViews(NULL) 函数便是为此目的而设计的。? 文档信息 GetPathName() 和 GetTitle() 这两个函数可以使文档找 到其所连接的文件。 GetPathName() 返回的是文档的完全路径,而 GetTitle() 返回的是文档的标题,通常与其文件名有关。如果一个新的 文档还从没有被保存过,那么该函数的返回值使是NULL。? 修改状态 CDocument 类有两个函

43、数使你可以监视自文档上次被保存 以来文档是否被修改过。 如果数据被改变了, 那么 IsModified() 函数返 回非零值, 但是,要使之发挥作用, 每个改变文档数据的函数必须在它改 变数据时调用 SetModifiedFlag() 函数。创建窗口类型的选择使用开发平台中的 AppWizard 可以自动创建三种类型的 MFC 应用程序窗口:对 话框、单文档界面或多文档界面。对窗口类型的选择可基于以下几点考虑:如果创建一个用户界面需求有限的应用程序, 或如果想界面完全单一, 那么就 创建一个对话框应用程序。典型的对话框应用程序包括配置硬件设备的应用程 序、屏幕保护程序和游戏程序等。如果应用程序

44、要编辑一个文档, 应该选择另外两种应用程序类型。 这里的“编 辑一个文档”是广义上的意思, 所指的文档可以是一个文本文件、 电子数据表文 件、第三方数据库的一个或多个表、 或者是自己的二进制文件, 甚至可以是大量 硬件设备的储存设置。 编辑仅仅表示对其中任何一个类型的文档进行添加、 删除 或修改操作。单文档界面应用程序一次只允许处理一个文档。 如果应用程序实际上一次只需 处理一个文档,诸如监视一组硬件设备的应用程序,那么应该选择单文档界面; 否则应该创建一个多文档界面应用程序, 即使在开始时一次编辑多个文档并未显 出有任何好处。一个多文档界面应用程序允许一次编辑多个文档, 它并不比一个单文档界

45、面应 用程序复杂,但却带来了一次至少查看多个文档的方便。选择视图的类型单文档或多文档界面应用程序, 在退出 AppWizard 之前必须选择所需的视图类, 在 AppWizard 的最后一步,可以选择下面视图类:对于一个简单的文本编辑器应用程序,选择 CEditView 。 对于一个能编辑多信息文本格式 ( RTF) 文件的应用程序,选择 CRichEditView( 这一选择将导致应用程序为文档类选择 CRichEditDoc 类) 。 对于一个图形应用程序,选择 CScrollView 。对于一个简单的监控或帐目管理应用程序,选择 CListView 。 要着手创建一个资源管理器类型的应用

46、程序, 请选择 CTreeView ( 在以后的步 骤中, 可以手工添加一个 CListView ) 。在对话框模板外创建一个视图, 选择 CFormView ( 一个对话框是一个被几个控 件窗口占据的窗口,诸如按钮和编辑框 ) 。对于一些特殊用途,也可以在 AppWizard 的早期阶段为视图类间接地选择 CRecordView 或 CDaoRecordView ,同时在该阶段还得决定为应用程序添加什么 样的数据库支持。如果在第二步中选择任何一项“ DataBase View ”选项,则该视图被添加,并允许轻松地访问一个 ODBC或DAO数据库中的记录。选择文档类型 应用程序可以与三种基本文档类型进行交互:平面文件 (flat file) 、串行文件或数据库。通常,文档类型的选择取决于用户打算编写的应用 程序类型,让我们讨论怎样选择:一个平面二进制或文本文件是应用程序可以支持的最简单的文档, 并且

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论