应用程序.ppt

上传人:hyn****60 文档编号:71565073 上传时间:2023-02-03 格式:PPT 页数:62 大小:362.50KB
返回 下载 相关 举报
应用程序.ppt_第1页
第1页 / 共62页
应用程序.ppt_第2页
第2页 / 共62页
点击查看更多>>
资源描述

《应用程序.ppt》由会员分享,可在线阅读,更多相关《应用程序.ppt(62页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第第6章章框架文档和视图框架文档和视图16.1.1单文档界面与多文档界面单文档界面与多文档界面VC的的MFC库库支持三种不同支持三种不同的应用程序的应用程序单文档界面单文档界面(SDI)多文档界面多文档界面(MDI)基于对话框的应用程序基于对话框的应用程序SDI的应用程序的应用程序只有一个窗口只有一个窗口MDI的应用程序每次的应用程序每次可以读写多个文件或可以读写多个文件或文档,可同时对多个文档,可同时对多个文档进行操作,可以文档进行操作,可以有多个子窗口有多个子窗口主主要要差差别别在创建在创建SDI界面的应用程序时,不生成界面的应用程序时,不生成CChildFrame类,类,CMainFra

2、me类的基类为类的基类为CFrameWnd在创建在创建MDI界面的应用程序时,界面的应用程序时,CMainFrame类的基类为类的基类为CMDIFrameWnd使用使用AppWizard创建创建SDI和和MDI界面的应用界面的应用程序的过程几乎完全程序的过程几乎完全一样一样2由于每一个文档可以有多个视图,但每个视图只由于每一个文档可以有多个视图,但每个视图只能对应于一个确定的文档能对应于一个确定的文档多文档程序需要解决的问题仅仅是多个文档的数多文档程序需要解决的问题仅仅是多个文档的数据管理方法的问题据管理方法的问题多文档程序,最初的文档模板只支持主窗口,但每次打开一个新文档时都调用多文档程序,

3、最初的文档模板只支持主窗口,但每次打开一个新文档时都调用CDocument的函数的函数OnNewDocument,建立一个由建立一个由CMDIChildWnd派生的新的派生的新的MDI子窗口,这些窗口中保存着各种已打开的文档,所有的细节都由子窗口,这些窗口中保存着各种已打开的文档,所有的细节都由MFC库处库处理理视图是文档的不同表现形式,一个视图是文档的不同表现形式,一个*.html语言的文件,在浏览器里和在记事本中打语言的文件,在浏览器里和在记事本中打开的表现形式是不同的但它们操作的是同开的表现形式是不同的但它们操作的是同一个文件这就是一个文档对应两视图一个文件这就是一个文档对应两视图36.

4、1.2文档文档/视图结构视图结构在在文档文档/视图视图结构中结构中对数据进行管理和维护,对数据进行管理和维护,数据保存在文档类的成数据保存在文档类的成员变量中员变量中文档类文档类通过串行化通过串行化的过程将数据保存的过程将数据保存到磁盘文件或数据库中到磁盘文件或数据库中文档类文档类还可处理来自如还可处理来自如菜单、工具栏按钮和加菜单、工具栏按钮和加速键的速键的WM_COMMANDWM_COMMAND消息消息除除WM_COMMANDWM_COMMAND外,文档外,文档不不能能处理其它的处理其它的WindowsWindows消息消息由此我们可以由此我们可以看出,命令消看出,命令消息可以被多种息可以

5、被多种对象处理,这对象处理,这些对象除了窗些对象除了窗口和视图外,口和视图外,还可以是文档、还可以是文档、文档模板或应文档模板或应用程序本身用程序本身这一点与这一点与Windows消息消息和控件通知消息不同,和控件通知消息不同,因为因为Windows消息和控消息和控件通知消息就只能被件通知消息就只能被窗口和视图处理。窗口和视图处理。通过调用文档和视图的接口将修通过调用文档和视图的接口将修改的信息反馈给文档类,实际的改的信息反馈给文档类,实际的数据更新仍然是由文档来完成的数据更新仍然是由文档来完成的在文档和用户之在文档和用户之间起中介作用间起中介作用视图可以直接或间接视图可以直接或间接的访问文档

6、类中的成的访问文档类中的成员变量,它从文档类员变量,它从文档类中中(而不是从存储介质而不是从存储介质中中)将文档中的数据取将文档中的数据取出来,然后在屏幕上出来,然后在屏幕上显示文档的数据显示文档的数据它可以接收用户的输入它可以接收用户的输入,并接受用户的修改,并接受用户的修改4文档文档/视图结构的工作机制视图结构的工作机制视图通过视图通过GetDocumentGetDocument成成员函数获得指向相关联的员函数获得指向相关联的文档对象的指针文档对象的指针通过该指针调用文档通过该指针调用文档类的成员函数来从文类的成员函数来从文档中读取数据档中读取数据视图把数据显示于视图把数据显示于计算机屏幕

7、上计算机屏幕上用户通过与视图的交用户通过与视图的交互来查看数据并对数互来查看数据并对数据进行修改据进行修改视图通过相关联的文档类的视图通过相关联的文档类的成员函数将经过修改的数据成员函数将经过修改的数据传递给文档对象传递给文档对象文档对象获得修改过的数据之后,对其文档对象获得修改过的数据之后,对其进行必要的修改,最后保存到永久介质进行必要的修改,最后保存到永久介质(如磁盘文件如磁盘文件)中中5SDI文档文档/视图应用程序示意图视图应用程序示意图6文档文档/视图结构优点视图结构优点v 文档视图结构重要的特征是数据操作与数据显示分离。v 文档视图结构另一个重要特征是许多MFC类对公共的文档视图活动

8、提供了大量的帮助。例如,对文件的操作(选择文件、打开文件和关闭文件)完全由框架类来管理。用户所需做的仅仅是从数据流中读写所需要的字节,这种工作方法可以省略相同代码的重复编写,而将更多的时间用于编写应用程序的特殊代码上。6.1.3 SDI程序中文档、视图对象的创建过程程序中文档、视图对象的创建过程 SDI程序中框架窗口、文档和视图的创建是在应用程序对象的程序中框架窗口、文档和视图的创建是在应用程序对象的InitInstance()成员函数中通过文档模板类完成的:成员函数中通过文档模板类完成的:CSingleDocTemplate*pDocTemplate;/创建单文档模板类对象创建单文档模板类对

9、象pDocTemplate=new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CMyDoc),/CMyDoc是应用程序中的文档类是应用程序中的文档类 RUNTIME_CLASS(CMainFrame),/CMainFrame是应用程序中的框架窗口是应用程序中的框架窗口 RUNTIME_CLASS(CMyView);/CMyView是应用程序中的视图类是应用程序中的视图类AddDocTemplate(pDocTemplate);/加载文档模板类对象到文档模板列表加载文档模板类对象到文档模板列表CCommandLineInfo cmdInfo;P

10、arseCommandLine(cmdInfo);/初始化初始化CCommandLineInfo对象对象if(!ProcessShellCommand(cmdInfo)/据对象中的信息启动程序据对象中的信息启动程序 return FALSE;m_pMainWnd-ShowWindow(SW_SHOW);m_pMainWnd-UpdateWindow();/显示和更新窗口显示和更新窗口86.1.4SDI程序的消息传递过程程序的消息传递过程当用户选择了菜单项,单当用户选择了菜单项,单击了快捷键或工具条按钮,击了快捷键或工具条按钮,系统就会发送系统就会发送WM_COMMAND消息。框架消息。框架窗口

11、实际上是大多数窗口实际上是大多数WM_COMMAND消息的接受消息的接受者,但者,但WM_COMMAND消息消息还可以在视图、文档,甚还可以在视图、文档,甚至应用程序类中被处理。至应用程序类中被处理。96.2Doc/View框架的主要成员框架的主要成员Doc/View框架虽然可以调用成百上千个不同的框架虽然可以调用成百上千个不同的类,但是核心类只有五个类,但是核心类只有五个:CWinAppCDocumentCViewCDocTemplateCFrameWnd10利用CDocTemplate、CDocument和CView之间的存取关系,遍历整个文档模板、文档以及视 uCMyApp*pMyApp

12、=(CMyApp*)AfxGetApp();uPOSITION p=pMyApp-GetFirstDocTemplatePosition();uwhile(p!=NULL)uCDocTemplate*pDocTemplate=pMyApp-GetNextDocTemplate(p);uPOSITION p1=pDocTemplate-GetFirstDocPosition();uwhile(p1!=NULL)uCDocument*pDocument=pDocTemplate-GetNextDoc(p1);uPOSITION p2=pDocument-GetFirstViewPosition()

13、;uwhile(p2!=NULL)uCView*pView=pDocument-GetNextView(p2);uuu116.2.1CWinApp类类 CWinApp类代表主程序,类代表主程序,CWinApp本身是不可见的,它负责本身是不可见的,它负责维护进程的启动、终止、消息循环、命令行参数、资源管理维护进程的启动、终止、消息循环、命令行参数、资源管理 其他类中可以其他类中可以通过通过AfxGetApp()函数得到本工程函数得到本工程CWinApp派生类派生类的对象。的对象。成员成员描述描述m_pszAppNamem_pszAppName应用程序名应用程序名m_lpCmdLine_lpCmd

14、Line命令行参数命令行参数m_pMainWnd_pMainWnd应用程序主窗口指应用程序主窗口指针针m_pszExeName_pszExeName可执行文件名可执行文件名m_pszProfileName_pszProfileName 配置配置INIINI文件名文件名m_pszRegistrKey_pszRegistrKey配置注册表主键值配置注册表主键值LoadCursorLoadCursor加载光标资源加载光标资源LoadIconLoadIcon加载图标资源加载图标资源部分主部分主要成员要成员126.2.2框架窗口u单文档(SDI)与多文档u从程序员的眼光看,每个MDI应用程序必须有一个C

15、MDIFrameWnd或其派生类的对象,该窗口称做MDI框架窗口。uMDIFrameWnd是从CFrameWnd派生来的,它不仅继承了CFrameWnd类的全部特性外,还增加了一些与MDI相关的一些特性。13从程序员角度看SDI与MDI应用程序u与与SDI不同,不同,MDI框架窗口并不直接与一个文档和视图相关框架窗口并不直接与一个文档和视图相关联,联,MDI框架窗口有其自己的客户窗口,在显示或隐藏工框架窗口有其自己的客户窗口,在显示或隐藏工具栏或状态栏时,重新定位该子窗口;具栏或状态栏时,重新定位该子窗口;uMDI客户窗口是客户窗口是MDI子窗口的直接父窗口,它负责管理主子窗口的直接父窗口,它

16、负责管理主框架窗口(主应用程序窗口)的客户区(不包括菜单栏、框架窗口(主应用程序窗口)的客户区(不包括菜单栏、工具栏、状态栏、滚动条的供客户使用的区域)以及创建工具栏、状态栏、滚动条的供客户使用的区域)以及创建子窗口。每个子窗口。每个MDI主框架窗口有且仅有一个主框架窗口有且仅有一个MDI客户窗口。客户窗口。uMDI子窗口是子窗口是CMDIChildWnd或其派生类对象,或其派生类对象,CMDIChildWnd也是从也是从CFrameWnd派生来的,主要用于派生来的,主要用于容纳文档和视图,相当于容纳文档和视图,相当于SDI中的主框架窗口。每打开一个中的主框架窗口。每打开一个文档,主程序窗口就

17、自动为该文档创建一个文档,主程序窗口就自动为该文档创建一个MDI子窗口。子窗口。一个一个MDI应用程序负责动态地创建和删除应用程序负责动态地创建和删除MDI子窗口,在子窗口,在任何时候,最多只有一个子窗口是活动的。任何时候,最多只有一个子窗口是活动的。14从程序员角度看SDI与MDI应用程序-续u在没有任何活动子窗口时,在没有任何活动子窗口时,MDI的框架窗口可以有的框架窗口可以有自己的默认菜单。当有活动的子窗口(打开的文档)自己的默认菜单。当有活动的子窗口(打开的文档)时,时,MDI框架窗口的菜单会自动被子窗口菜单取代。框架窗口的菜单会自动被子窗口菜单取代。框架窗口会自动监视当前活动文档窗口

18、的类型,相框架窗口会自动监视当前活动文档窗口的类型,相应地改变框架窗口的菜单;应地改变框架窗口的菜单;uMDI框架窗口为层叠、平铺、排列和新建子窗口等框架窗口为层叠、平铺、排列和新建子窗口等一些标准的窗口操作提供了默认的菜单选项。用户一些标准的窗口操作提供了默认的菜单选项。用户单击文件下的单击文件下的“新建新建”命令时,框架窗口会调用命令时,框架窗口会调用CDocTemplate:CreateNewFrame()为当前的活动文档创建一个子窗口,该函数不仅为当前的活动文档创建一个子窗口,该函数不仅创建子窗口创建子窗口(CMDIChildWnd类的对象类的对象),还创建与文,还创建与文档相对应的视

19、图。档相对应的视图。15框架窗口的组成v框框架架窗窗口口的的作作用用主主要要有有两两个个:一是为视图提供可视的边框,包括标题栏、一些标准的窗口组件(最大、最小化按钮、关闭按钮),像一个容器一样把视图包装起来。二是响应标准的窗口消息,包括最大化、最小化、调整尺寸等。当框架窗口关闭时,其中的视图对象也被自动删除。v对于框架窗口,程序要完成的主要工作是设置窗口外观,MDI应用程序还要维护活动文档窗口和非活动文档窗口之间的切换,对于框架所围的内容则由视图类来管理。16框架窗口风格u用MFC AppWizard设置 图图7.2MFCAppWizard的窗口风格设置的窗口风格设置17程序中改变框架u修改修

20、改CREATESTRUCT结构结构u窗口创建之前,系统自动调用窗口创建之前,系统自动调用PreCreateWindow虚函数。在用虚函数。在用MFCAppWizard创建创建SDI/MDI应用程序结构时,应用程序结构时,MFC已为主窗口或文档窗口类自动重载了该虚函数。可以在此函数中已为主窗口或文档窗口类自动重载了该虚函数。可以在此函数中通过修改通过修改CREATESTRUCT结构来设置窗口的绝大多数风格。结构来设置窗口的绝大多数风格。u例如,在例如,在SDI程序中,框架窗口默认的风格是程序中,框架窗口默认的风格是WS_OVERLAPPEDWINDOW和和FWS_ADDTOTITLE的组合,更改

21、风格代码:的组合,更改风格代码:uBOOLCMainFrame:PreCreateWindow(CREATESTRUCT&cs)u/新窗口不带有新窗口不带有最大化最大化按钮按钮ucs.style&=WS_MAXIMIZEBOX;u/将窗口的大小设为将窗口的大小设为1/3屏幕并居中屏幕并居中ucs.cy=:GetSystemMetrics(SM_CYSCREEN)/3;ucs.cx=:GetSystemMetrics(SM_CXSCREEN)/3;ucs.y=(cs.cy*3)-cs.cy)/2;ucs.x=(cs.cx*3)-cs.cx)/2;u/调用基类的调用基类的PreCreateWind

22、ow函数函数ureturnCFrameWnd:PreCreateWindow(cs);uu18框架窗口-相关函数u使用使用ModifyStyle和和ModifyStyleExuCWnd类中的成员函数类中的成员函数ModifyStyle和和ModifyStyleEx也可用来更改窗口的风格,其中也可用来更改窗口的风格,其中ModifyStyleEx还可更改窗口的扩展风格。这两个函还可更改窗口的扩展风格。这两个函数具有相同的参数,其含义如下。数具有相同的参数,其含义如下。uBOOLModifyXXXX(DWORDdwRemove,DWORDdwAdd,UINTnFlags=0);u参数参数dwRem

23、ove用来用来指定需要删除的风格,指定需要删除的风格,dwAdd用来指定需要增加的风格,用来指定需要增加的风格,nFlags表示表示SetWindowPos的标志,的标志,0(默认默认)表示更改风格的同时表示更改风格的同时不调用不调用SetWindowPos函数。函数。u由于框架窗口在创建时不能直接设定其扩展风格,由于框架窗口在创建时不能直接设定其扩展风格,因此只能通过调用因此只能通过调用ModifyStyle函数来进行。函数来进行。19程序框架增加滚动条u使用使用ModifyStyle和和ModifyStyleExu覆盖覆盖OnCreateClient函数?!函数?!u增加如下函数增加如下函

24、数lModifyStyle(0,WS_VSCROLL,0);20使程序置顶u最顶最顶(TopMost)窗口是指那些始终出现在桌面的最窗口是指那些始终出现在桌面的最前方且不会被其他窗口覆盖的窗口。如果要创建这前方且不会被其他窗口覆盖的窗口。如果要创建这样的一个最顶窗口,则在运行时必须指定样的一个最顶窗口,则在运行时必须指定WS_EX_TOPMOST扩展窗口风格。此风格的设置扩展窗口风格。此风格的设置是在是在CWnd:SetWindowPos函数中进行;作为技巧,函数中进行;作为技巧,我们可以先调用我们可以先调用CWnd:GetExStyle函数来确定是函数来确定是否已经设置了否已经设置了WS_E

25、X_TOPMOST风格。风格。u可以覆盖可以覆盖OnCreateClient函数后,函数后,添加如下代码添加如下代码SetWindowPos(GetExStyle()&WS_EX_TOPMOST)?&wndNoTopMost:&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);21总结总结CFrameWnd类类作用作用CFrameWnd类在类在Doc/View结构中起着举足轻重结构中起着举足轻重的作用。主要做如下工作:的作用。主要做如下工作:l框架的位置和显示框架的位置和显示 状态状态l 工具条、菜单、状态条的显示、更新;工具条、菜单、状态条的显示、更新;l

26、视图的位置和显示,其它可停靠空间的停靠和视图的位置和显示,其它可停靠空间的停靠和动态尺寸调整。动态尺寸调整。226.2.2 CDocument类类 23最常用的是最常用的是SetModifiedFlag()和和UpdateAllViews()。文档内容被修改后,一文档内容被修改后,一般要调用般要调用SetModifiedFlag()来设定一个标志。来设定一个标志。UpdateAllView()刷新所有和刷新所有和文档关联的视图。实际上该函数调用各个视图类的文档关联的视图。实际上该函数调用各个视图类的OnUpdate()函数。这函数。这样做可以保证各个视图之间的同步。样做可以保证各个视图之间的同

27、步。24 25用户可通过函数用户可通过函数GetFirstViewPosition()和和GetNextView()得到和得到和文档关联的视图的指针,代码如下:文档关联的视图的指针,代码如下:POSITIONpos=GetFirstViewPosition();/得到视图列表头的位得到视图列表头的位置置While(pos!=NULL)CView*pView=GetNextView(pos);/获得视图列表中的视获得视图列表中的视图指针图指针文档最主要的功能如下:文档最主要的功能如下:l打开保存文档打开保存文档l维护文档相关的视图列表维护文档相关的视图列表l维护文档修改标志维护文档修改标志用户修

28、改文档数据时,调用用户修改文档数据时,调用SetModifiedFlag方法来标志数据被更方法来标志数据被更改过。当程序关闭该文档关联的最后一个视图的时候,文档改过。当程序关闭该文档关联的最后一个视图的时候,文档会自动提示你保存修改。会自动提示你保存修改。26串行化 CArchiveu无论是保存文档或是打开文档,应用程序都是通过无论是保存文档或是打开文档,应用程序都是通过调用文档类的调用文档类的Serialize串行化成员函数来完成操作串行化成员函数来完成操作的。在大多数情况下,我们都需要重载的。在大多数情况下,我们都需要重载Serialize成成员函数。员函数。CArchive对象是单向的,

29、只用于保存或读对象是单向的,只用于保存或读取两者之一,不能通过同一个取两者之一,不能通过同一个CArchive对象既保存对象既保存又读取文档。又读取文档。u在框架创建在框架创建CArchive对象时,已根据用户选择的对象时,已根据用户选择的是是“保存保存”(“另存为另存为”)还是还是“打开打开”来设置来设置了了CArchive对象的类型,我们可以使用对象的类型,我们可以使用CArchive类类的成员函数的成员函数IsStoring来检索当前来检索当前CArchive对象的类对象的类型,从而得知用户所期望的操作是保存还是读取,型,从而得知用户所期望的操作是保存还是读取,执行不同的操作。执行不同的

30、操作。27SDI序列化过程u创建空文档 u应用程序类的应用程序类的InitInstance函数在调用了函数在调用了AddDocTemplate函数之后,会函数之后,会通过通过CWinApp:ProcessShellCommand间接调用间接调用CWinApp的另一个非的另一个非常有用的成员函数常有用的成员函数OnFileNew,并依次完成下列工作:,并依次完成下列工作:l构造文档对象,但并不从磁盘中读数据。构造文档对象,但并不从磁盘中读数据。l构造主框架类构造主框架类CMainFrame的对象,并创建该主框架窗口,但不显示。的对象,并创建该主框架窗口,但不显示。l构造视图对象,并创建视图窗口,

31、也不显示。构造视图对象,并创建视图窗口,也不显示。l通过内部机制,使文档、主框架和视图通过内部机制,使文档、主框架和视图“对象对象”之间之间“真正真正”建立联系。建立联系。AddDocTemplate函数建立的是函数建立的是“类类”之间的联系。之间的联系。l调用文档对象的调用文档对象的CDocument:OnNewDocument虚成员函数,并调用虚成员函数,并调用CDocument:DeleteContents(清除文档对象的内容清除文档对象的内容)虚函数。虚函数。l调用视图对象的调用视图对象的CView:OnInitialUpdate虚成员函数。虚成员函数。l调用框架对象的调用框架对象的C

32、FrameWnd:ActiveFrame虚成员函数,以便显示出具有虚成员函数,以便显示出具有菜单、工具栏、状态栏以及视图窗口的主框架窗口。菜单、工具栏、状态栏以及视图窗口的主框架窗口。lMFCAppWizard为用户在文档类中自动产生为用户在文档类中自动产生OnNewDocument虚函数的重虚函数的重载,用户利用此函数框架可以对文档对象进行初始化。载,用户利用此函数框架可以对文档对象进行初始化。28打开文档uMFCAppWizard创建应用程序时,它会自动将创建应用程序时,它会自动将“文件文件(File)”菜单中的菜单中的“打开打开(Open)”命令命令(ID号为号为ID_FILE_OPEN

33、)映射到映射到CWinApp的的OnFileOpen成员函成员函数。这一结果可以从应用类数。这一结果可以从应用类(.cpp)的消息入口处得到验证:的消息入口处得到验证:BEGIN_MESSAGE_MAP(CEx_SdiApp,CWinApp)ON_COMMAND(ID_FILE_NEW,CWinApp:OnFileNew)ON_COMMAND(ID_FILE_OPEN,CWinApp:OnFileOpen)/StandardprintsetupcommandON_COMMAND(ID_FILE_PRINT_SETUP,CWinApp:OnFilePrintSetup)END_MESSAGE_M

34、AP()uOnFileOpen函数还会进一步完成下列工作:函数还会进一步完成下列工作:l弹出通用弹出通用“打开打开”对话框,供用户选择一个文件。对话框,供用户选择一个文件。l调用文档对象的调用文档对象的CDocument:OnOpenDocument虚成员函数。该函数将打开文件,虚成员函数。该函数将打开文件,并调用并调用DeleteContents清除文档对象的内容,然后创建一个清除文档对象的内容,然后创建一个CArchive对象用于数据的对象用于数据的读取,接着又自动调用读取,接着又自动调用Serialize函数。函数。l调用视图对象的调用视图对象的CView:OnInitialUpdate

35、虚成员函数。虚成员函数。29保存及关闭文档 u保存文档l调用文档对象的调用文档对象的CDocument:OnSaveDocument虚成员函虚成员函数,接着又自动调用数,接着又自动调用Serialize函数,将函数,将CArchive对象的对象的内容保存在文档中。内容保存在文档中。u关闭文档l试图关闭文档时,应用程序会根据文档是否修改进一步试图关闭文档时,应用程序会根据文档是否修改进一步完成下列任务:完成下列任务:若文档内容已被修改,则弹出一个消息对话框,询问用户是否需要将文档保存。若用户选择“是”,则应用程序执行OnFileSave过程。调用CDocument:OnCloseDocument

36、虚成员函数,关闭所有与该文档相关联的文档窗口及相应的视图,调用文档类CDocument的DeleteContents清除文档数据。30使用简单数组集合类u对简单数组集合类构造的方法都是一样的,都是使用各自的构造函数,它们的对简单数组集合类构造的方法都是一样的,都是使用各自的构造函数,它们的原型如下:原型如下:uCByteArrayCByteArray();uCDWordArrayCDWordArray();uCPtrArrayCPtrArray();uCStringArrayCStringArray();uCUIntArrayCUIntArray();uCWordArrayCWordArray

37、();u为了有效使用内存,在使用简单数组集合类之前最好调用成员函数为了有效使用内存,在使用简单数组集合类之前最好调用成员函数SetSize设置此数组的大小,与其对应的函数是设置此数组的大小,与其对应的函数是GetSize,用来返回数组的大小。,用来返回数组的大小。它们的原型如下:它们的原型如下:uvoidSetSize(intnNewSize,intnGrowBy=-1);uintGetSize()const;u向简单数组集合类添加一个元素,可使用成员函数向简单数组集合类添加一个元素,可使用成员函数Add和和Append,它们,它们的原型如下:的原型如下:uintAdd(CObject*new

38、Element);uintAppend(constCObArray&src);31数组集合类可以使你如虎添翼u更普通的数组类 CArrayl定义方法lCArray 新的数组对象 CArray Arint;CArray Arstr;typedef CArray CMyStringArray;/等同于等同于CStringArray326.2.3CView类类视图类视图类(CView)是从是从CWnd类下派生的,包括以下派类下派生的,包括以下派生类。生类。lCEditView:简单的文本编辑器,类似:简单的文本编辑器,类似NotepadlCListView:基于列表的视图,类似文件夹浏览:基于列表的

39、视图,类似文件夹浏览lCTreeView:基于树状控件的视图,类似文件浏览左侧:基于树状控件的视图,类似文件浏览左侧的树状结构的树状结构lCRichEditView:支持多种字体、:支持多种字体、OLE和和RTF格式的高格式的高级编辑器级编辑器CScrollView:支持滚动条的视图:支持滚动条的视图lCFormView:窗体视图,支持在上边使用对话框控件:窗体视图,支持在上边使用对话框控件lCRecordView:连接到:连接到ODBC数据库的视图数据库的视图lCDaoRecordView:连接到:连接到DAO数据库的视图数据库的视图l前前4个类是个类是CCtrlView的派生类,适用于文档

40、视图结构也的派生类,适用于文档视图结构也适用于控件适用于控件。33 CView类中最常用的是类中最常用的是OnDraw函数,该函数在屏函数,该函数在屏幕发生变化或因为焦点的变化需要重绘时调用,幕发生变化或因为焦点的变化需要重绘时调用,没有该函数,就不可能在程序的切换后保证屏幕没有该函数,就不可能在程序的切换后保证屏幕的正确显示。的正确显示。注意注意:尽量不要在尽量不要在OnDraw之外的函数调用绘图之外的函数调用绘图方法,那些方法不会在视图需要重新绘制的时候方法,那些方法不会在视图需要重新绘制的时候被自动调用。被自动调用。若想在数据更新的时强制视图更新,可调用若想在数据更新的时强制视图更新,可

41、调用Invalidate方法和方法和UpdateWindow方法来实现。方法来实现。34视图类简介uCFormView类类lCFormView类是一个非常有用的视图类,它具有许多无类是一个非常有用的视图类,它具有许多无模式对话框的特点。像模式对话框的特点。像CDiolog的派生类一样,的派生类一样,CFormView的派生类也和相应的对话框资源相联系,它的派生类也和相应的对话框资源相联系,它也支持对话框数据交换和对话框数据确认也支持对话框数据交换和对话框数据确认(DDX和和DDV)。lCFormView是所有表单视是所有表单视(如如CRecordView、CDaoRecordView、CHtm

42、lView等等)的基类;一个基于表的基类;一个基于表单的应用程序能让用户在程序中创建和使用一个或多个单的应用程序能让用户在程序中创建和使用一个或多个表单。表单。l创建表单应用程序的基本方法除了在创建创建表单应用程序的基本方法除了在创建SDI/MDI的第的第六步中选择六步中选择CFormView作为应用程序视图类的基类外。作为应用程序视图类的基类外。35视图类简介uCEditView类uCEditView类对象是一种视图,提供窗口编辑控制功类对象是一种视图,提供窗口编辑控制功能,可以执行简单文本操作。由于能,可以执行简单文本操作。由于CEditView类自动类自动封装上述功能的映射函数,因此只要

43、在文档模板中使封装上述功能的映射函数,因此只要在文档模板中使用用CEditView类,那么应用程序的类,那么应用程序的“编辑编辑”菜单和菜单和“文件文件”菜单里的菜单项都可自动激活。与编辑控件使菜单里的菜单项都可自动激活。与编辑控件使用类似。用类似。u缺点:缺点:lCEditView不具有所见即所得编辑功能。不具有所见即所得编辑功能。lCEditView只能将文本作单一字体的显示,不支持特殊格式只能将文本作单一字体的显示,不支持特殊格式的字符。的字符。lCEditView可容纳的文本总数有限,在可容纳的文本总数有限,在32位位Windows中最多中最多不超过不超过1M字节。字节。图图7.10“

44、NewForm”对话框对话框36视图类简介uCRichEditView类类lCRichEditView类使用了复文本编辑控件,因此它支持类使用了复文本编辑控件,因此它支持混合字体格式和更大数据量的文本。混合字体格式和更大数据量的文本。CRichEditView类类被设计成与被设计成与CRichEditDoc和和CRichEditCntrItem类一起类一起使用,它们可实现一个完整的使用,它们可实现一个完整的ActiveX包容器应用程序。包容器应用程序。uCHtmlView类类lCHtmlView类是在文档视图结构中提供类是在文档视图结构中提供WebBrowser控控件的功能。件的功能。WebB

45、rowser控件可以浏览网址,也可以作控件可以浏览网址,也可以作为本地文件和网络文件系统的窗口,它支持超级链接、为本地文件和网络文件系统的窗口,它支持超级链接、统一资源定位统一资源定位(URL)导航器并维护历史列表等。导航器并维护历史列表等。37uCScrollView类类lCScrollView类不仅能直接支持视图的滚动操作,类不仅能直接支持视图的滚动操作,而且还能管理视口的大小和映射模式,并能响应而且还能管理视口的大小和映射模式,并能响应滚动条消息、键盘消息以及鼠标滚轮消息。滚动条消息、键盘消息以及鼠标滚轮消息。u列表视图列表视图l与列表控件使用类似,也可以当做一个控件操作列表控件使用类似

46、,也可以当做一个控件操作如:如:CListCtrl*pCtrl;pCtrl=&GetListCtrl();38列表控件的例子u例例Ex_Lview将当前文件夹中的文件用将当前文件夹中的文件用“大图标大图标”、“小小图标图标”、“列表视图列表视图”以及以及“报表视图报表视图”四种不同方式在四种不同方式在列表视图中显示出来。当双击某个列表项时,还将该项的列表视图中显示出来。当双击某个列表项时,还将该项的文本标签内容用消息对话框的形式显示出来。文本标签内容用消息对话框的形式显示出来。(1)用用MFCAppWziard创建一个单文档应用程序创建一个单文档应用程序Ex_List,在创建的第六步将视图的基

47、类选择为在创建的第六步将视图的基类选择为CListView。(2)为为CEx_ListView类添加下列成员函数和成员函数:类添加下列成员函数和成员函数:public:CImageList m_ImageList;CImageListm_ImageListSmall;CStringArraym_strArray;voidSetCtrlStyle(HWNDhWnd,DWORDdwNewStyle);(3)将项目工作区窗口切换到将项目工作区窗口切换到ResourceView页面,打开页面,打开Accelerator节点下的节点下的IDR_MAINFRAME,为其添加一个为其添加一个键盘加速键键盘加

48、速键Ctrl+Shift+X,其,其ID号为号为ID_VIEW_CHANGE。(4)用用ClassWizard为为CEx_ListView类添加类添加ID_VIEW_CHANGE的的COMMAND消息映射函数,并增加下列代码:消息映射函数,并增加下列代码:voidCEx_ListView:OnViewChange()staticintnStyleIndex=1;DWORDstyle4=LVS_REPORT,LVS_ICON,LVS_SMALLICON,LVS_LIST;CListCtrl&m_ListCtrl=GetListCtrl();SetCtrlStyle(m_ListCtrl.GetS

49、afeHwnd(),stylenStyleIndex);nStyleIndex+;if(nStyleIndex3)nStyleIndex=0;39SetCtrlStyle实现函数LONG lStyle;lStyle=GetWindowLong(hWnd,GWL_STYLE);/获取当前窗口style lStyle&=LVS_TYPEMASK;/清除显示方式位 lStyle|=dwNewStyle;/设置style SetWindowLong(hWnd,GWL_STYLE,lStyle);/设置style(5)用ClassWizard为CEx_ListView类添加NM_DBLCLK消息映射函数

50、,增加代码:void CEx_ListView:OnDblclk(NMHDR*pNMHDR,LRESULT*pResult)LPNMITEMACTIVATE lpItem=(LPNMITEMACTIVATE)pNMHDR;int nIndex=lpItem-iItem;if(nIndex=0)CListCtrl&m_ListCtrl=GetListCtrl();CString str=m_ListCtrl.GetItemText(nIndex,0);MessageBox(str);*pResult=0;(6)在CEx_ListView:OnInitialUpdate中添加下列代码:void C

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com