分享
分销 收藏 举报 申诉 / 63

类型第07章-框架窗口、文档和视图.ppt

  • 上传人:仙人****88
  • 文档编号:14748969
  • 上传时间:2026-11-13
  • 格式:PPT
  • 页数:63
  • 大小:479KB
  • 下载积分:10 金币
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    07 框架 窗口 文档 视图
    资源描述:
    单击此处编辑母版标题样式,第7,章 框架窗口、文档和视图,7.1框架窗口,7.2文档及其序列化,作业1,7.3视图及视图类,7.4文档视图结构,作业2,7.1,框架窗口,7.1.1,主窗口和文档窗口,主窗口是应用程序直接放置在桌面上的那个窗口,每个应用程序只能有一个主窗口,主窗口的标题栏上往往显示应用程序的名称。,文档窗口对于,SDI,程序来说,它和主窗口是一致的,即主窗口就是文档窗口;而对于,MDI,程序,文档窗口是主窗口的子窗口,如图。文档窗口一般都有相应的可见边框,它的客户区是由相应的视图来构成的,因此可以说视图是文档窗口内的子窗口。文档窗口时刻跟踪当前处于活动状态的视图的变化,并将用户或系统产生的命令消息传递给当前活动视图。而主窗口负责管理各个用户交互对象并根据用户操作相应地创建或更新文档窗口及其视图。,图7.1,MDI,应用程序的框架窗口,文档窗口,主窗口,7.1,框架窗口,7.1.2,窗口风格的设置,窗口风格,窗口风格通常有一般和扩展两种形式。这两种形式的窗口风格可在函数,CWnd,:Create,或,CWnd,:,CreateEx,参数中指定,,CreateEx,函数可同时支持以上两种风格,而,CWnd,:Create,只能指定窗口的一般风格。需要说明的是,对于控件和对话框这样的窗口来说,它们的窗口风格可直接通过其属性对话框来设置。,需要说明的是,除了上述风格外,框架窗口还有以下三个自己的风格。它们都可以在,PreCreateWindow,重载函数中指定。,FWS_ADDTOTITLE,该风格指定相关的信息如文档名添加到框架窗口标题的后面。,FWS_PREFIXTITLE,该风格使得框架窗口标题中的文档名显示在应用程序名之前。,FWS_SNAPTOBARS,该风格用来调整窗口的大小,使它刚好包含了框架窗口中的控制栏。,7.1,框架窗口,用,MFC AppWizard,设置,图7.2,MFC AppWizard,的窗口风格设置,7.1,框架窗口,修改,CREATESTRUCT,结构,窗口创建之前,系统自动调用,PreCreateWindow,虚函数。在用,MFC AppWizard,创建,SDI/MDI,应用程序结构时,,MFC,已为主窗口或文档窗口类自动重载了该虚函数。可以在此函数中通过修改,CREATESTRUCT,结构来设置窗口的绝大多数风格。,例如,在,SDI,程序中,框架窗口默认的风格是,WS_OVERLAPPEDWINDOW,和,FWS_ADDTOTITLE,的组合,更改风格代码:,BOOL,CMainFrame,:,PreCreateWindow,(CREATESTRUCT&,cs,),/,新窗口不带有,最大化,按钮,cs,.style,/,将窗口的大小设为,1/3,屏幕并居中,cs,.cy=:,GetSystemMetrics,(SM_CYSCREEN)/3;,cs,.,cx,=:,GetSystemMetrics,(SM_CXSCREEN)/3;,cs,.y=(,cs,.cy*3)-,cs,.cy)/2;,cs,.x=(,cs,.,cx,*3)-,cs,.,cx,)/2;,/,调用基类的,PreCreateWindow,函数,return,CFrameWnd,:,PreCreateWindow,(,cs,);,对于,MDI,程序,文档窗口的风格可用下列的代码更改:,BOOL,CChildFrame,:,PreCreateWindow,(CREATESTRUCT&,cs,),/,创建不含有,最大化,按钮的子窗口,cs,.style,/,调用基类的,PreCreateWindow,函数,return,CMDIChildWnd,:,PreCreateWindow,(,cs,);,7.1,框架窗口,使用,ModifyStyle,和,ModifyStyleEx,CWnd,类中的成员函数,ModifyStyle,和,ModifyStyleEx,也可用来更改窗口的风格,其中,ModifyStyleEx,还可更改窗口的扩展风格。这两个函数具有相同的参数,其含义如下。,BOOL,ModifyXXXX,(DWORD,dwRemove,DWORD,dwAdd,UINT,nFlags,=0);,参数,dwRemove,用来指定需要删除的风格,,dwAdd,用来指定需要增加的风格,,nFlags,表示,SetWindowPos,的标志,,0(,默认,),表示更改风格的同时不调用,SetWindowPos,函数。,由于框架窗口在创建时不能直接设定其扩展风格,因此只能通过调用,ModifyStyle,函数来进行。,7.1,框架窗口,例,Ex_,Vscroll,多文档,(,MDI),的子文档窗口增加垂直滚动条。,(1),用,MFC AppWizard,创建一个多文档应用程序。,(2),用,ClassWizard,为子文档窗口类,CChildFrame,添加,OnCreateClient,消息处理,并增加下列代码:,BOOL,CChildFrame,:,OnCreateClient,(LPCREATESTRUCT,lpcs,CCreateContext,*,pContext,),ModifyStyle(0,WS_VSCROLL,0);,return,CMDIChildWnd,:,OnCreateClient,(,lpcs,pContext,);,(3),编译并运行,如图。,图7.3,为文档子窗口添加垂直滚动条,7.1,框架窗口,设置,TopMost,窗口风格,最顶,(,TopMost,),窗口是指那些始终出现在桌面的最前方且不会被其他窗口覆盖的窗口。如果要创建这样的一个最顶窗口,则在运行时必须指定,WS_EX_TOPMOST,扩展窗口风格。此风格的设置是在,CWnd,:,SetWindowPos,函数中进行;作为技巧,我们可以先调用,CWnd,:,GetExStyle,函数来确定是否已经设置了,WS_EX_TOPMOST,风格。例如下面的代码:,void,SetWindowTopMost,(,CWnd,*,pWnd,),ASSERT_VALID(,pWnd,);,pWnd,-,SetWindowPos,(,pWnd,-,GetExStyle,()&WS_EX_TOPMOST)?,&wndNoTopMost:&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);,函数,SetWindowPos,具体的使用方法将在下一节中介绍。,7.1,框架窗口,7.1.3,窗口状态的改变,用,ShowWindow,改变窗口的显示状态,当一个新的应用程序创建之后,,InitInstance,函数总会调用,ShowWindow,函数来显示窗口,想要改变改变窗口显示状态,只需根据上表选择所需的参数值,调用,ShowWindow,函数就可达到目的。当然,也可对,CWinApp,的公有型,(,public),成员变量,m_,nCmdShow,进行赋值,同样能达到效果。下面的代码是将窗口的初始状态设置为“最小化”:,BOOL,CEx,_,SdiApp,:,InitInstance,(),.,m_,nCmdShow,=SW_SHOWMINIMIZED;,/,由于,CEx,_,SdiApp,类继承了基类,CWinApp,的特性,因此也可在派生类,/,CEx,_,SdiApp,使用这个公有型成员变量,m_,nCmdShow,。,m_,pMainWnd,-,ShowWindow,(m_,nCmdShow,);,m_,pMainWnd,-,UpdateWindow,();,return TRUE;,7.1,框架窗口,用,SetWindowPos,或,MoveWindow,改变窗口的大小和位置,SetWindowPos,不仅可以改变窗口的大小、位置,还可以改变所有窗口在堆栈排列的次序,(,Z,次序,),,这个次序是根据它们在屏幕出现的先后来确定的。,函数,CWnd,:,MoveWindow,也可用来改变窗口的大小和位置,用户必须在,MoveWindow,函数中指定窗口的大小。,void,MoveWindow,(,int,x,int,y,int,nWidth,int,nHeight,BOOL,bRepaint,=TRUE);,void,MoveWindow,(LPCRECT,lpRect,BOOL,bRepaint,=TRUE);,参数,x,和,y,表示窗口新的左上角坐标,,nWidth,和,nHeight,表示窗口新的宽度和高度,,bRepaint,用于指定窗口是否重绘,,lpRect,表示窗口新的大小和位置。,使用上述两个函数把主窗口移动到屏幕的,(100,100)处(,代码添在,CEx,_,SdiApp,:,InitInstance,中,return TRUE,语句之前,),。,/,使用,SetWindowPos,函数的示例,m_,pMainWnd,-SetWindowPos(NULL,100,100,0,0,SWP_NOSIZE|SWP_NOZORDER);,CRect,rcWindow,;/,使用,MoveWindow,函数的示例,m_,pMainWnd,-,GetWindowRect,(,rcWindow,);,m_,pMainWnd,-MoveWindow(100,100,rcWindow.Width(),rcWindow.Height(),TRUE);,改变窗口的大小和位置的,CWnd,成员函数还不止以上两个。例如,CenterWindow,函数是使窗口居于父窗口中央,就像下面的代码:,CenterWindow,(,CWnd,:,GetDesktopWindow,();/,将窗口置于屏幕中央,AfxGetMainWnd,()-,CenterWindow,();/,将主框架窗口居中,7.2,文档及其序列化,7.2.1,单文档和多文档,一个多文档应用程序的示例过程:,(1),用,MFC AppWizard,创建一个多文档应用程序项目,Ex_,Mdi,。,由于向导默认创建的就是这种程序类型,因此只要在向导的,Step 1,对话框中单击,Finish,按钮即可创建一个默认的多文档应用程序。,(2),打开,CEx,_,MdiApp,:,InitInstance,可看出与默认的单文档应用程序不同的代码是:,BOOL,CEx,_,MdiApp,:,InitInstance,(),CMultiDocTemplate*pDocTemplate;,pDocTemplate=new CMultiDocTemplate(,IDR_EX_MDITYPE,RUNTIME_CLASS(,CEx,_,MdiDoc,),RUNTIME_CLASS(,CChildFrame,),/MDI,文档子窗口,RUNTIME_CLASS(,CEx,_,MdiView,);,AddDocTemplate,(,pDocTemplate,);,/,创建,MDI,主框架窗口,CMainFrame,*,pMainFrame,=new,CMainFrame,;,if(!,pMainFrame,-,LoadFrame,(IDR_MAINFRAME),return FALSE;,m_,pMainWnd,=,pMainFrame,;,7.2,文档及其序列化,(3),用,ClassWizard,为该项目添加一个,CDocument,派生类,CAnotherDoc,,,并在,CEx,_,Mdi,-App:,InitInstance,增加下列代码:,BOOL,CEx,_,MdiApp,:,InitInstance,(),CMultiDocTemplate,*,pDocTemplate,;,pDocTemplate,=new,CMultiDocTemplate,(IDR_EX_MDITYPE,RUNTIME_CLASS(,CEx,_,MdiDoc,),RUNTIME_CLASS(,CChildFrame,),/MDI,文档子窗口,RUNTIME_CLASS(,CEx,_,MdiView,);,AddDocTemplate,(,pDocTemplate,);,CMultiDocTemplate,*,pAnother,;,pAnother,=new,CMultiDocTemplate,(IDR_EX_MDITYPE,RUNTIME_CLASS(,CAnotherDoc,),RUNTIME_CLASS(,CChildFrame,),/MDI,文档子窗口,RUNTIME_CLASS(,CEx,_,MdiView,);,AddDocTemplate,(,pAnother,);,/,创建,MDI,主框架窗口,CMainFrame,*,pMainFrame,=new,CMainFrame,;,if(!,pMainFrame,-,LoadFrame,(IDR_MAINFRAME),return FALSE;,m_,pMainWnd,=,pMainFrame,;,7.2,文档及其序列化,(4),在,Ex_,Mdi,.,cpp,文件的开始处,添加包含,CAnotherDoc,类的头文件:,#,include,AnotherDoc,.h,(5),编译并运行后,如图,从中选择一个文档类型。任何时候,选择,Ex_,Mdi,程序的“文件”菜单,“新建”命令或单击“新建”工具按钮都将弹出此对话框。,选定第二个文档类型后,单击,确定,。这时程序出现一个断言错误,这是因为在视图类中有一个,GetDocument,函数,它的代码如下:,CEx,_,MdiDoc,*,CEx,_,MdiView,:,GetDocument,()/non-debug version is inline,ASSERT(m_,pDocument,-,IsKindOf,(RUNTIME_CLASS(,CEx,_,MdiDoc,);,return(,CEx,_,MdiDoc,*)m_,pDocument,;,创建的文档类型是,CAnotherDoc,时,由于两种类型的文档共用一个视图,调用的,GetDocument,函数是同一个函数,因此断言不成立,程序不能正常运行。,(6),用,ClassWizard,为该项目添加一个,CView,类的派生类,CAnotherView,,,并将,InitInstance,第二模板,pAnother,中的,CEx,_,MdiView,改成,CAnotherView,,,然后在该源文件前面添加,CAnotherView,的头文件,AnotherView,.h。,(7),再次运行,上述问题得到解决。但是,图,7.4,的文档“新建”对话框中显示的文档类型名称应该怎么修改呢?这时就需要使用文档的字串资源。,图7.4,文档“新建”对话框,7.2,文档及其序列化,7.2.2,文档的字串资源,通过对文档的字串资源修改可以改变文档窗口标题、文档类型以及通用文件对话框中的某些内容。例如下面的示例过程:,(1),打开前面的多文档应用程序项目,Ex_,Mdi,。,(2),打开,String Table,,将,IDR_EX_MDITYPE,字串资源复制,复制后的,ID,为,IDR_ANOTHERTYPE,,修改这两个字串资源,结果如下表所示。,如果,IDR_ANOTHERTYPE,的值不等于,130,,可在其属性对话框中直接给标识赋值,如图。,(3)将,InitInstance,第二模板,pAnother,中的资源号,IDR_EX_MDITYPE,改成,IDR_ANOTHERTYPE,。,图7.5,指定标识值,7.2,文档及其序列化,(4),重新编译并运行,如图。测试后还发现“打开”或“保存”对话框中的“文件类型”框中显示出文档字串资源定义的类型名,如图,。,文档资源字串的内容也可在文档应用程序创建时的,Advanced Options,对话框中指定,如图,图中数字表示该项的含义与表中对应串号的含义相同。,图7.7,Ex_,Mdi,运行结果,图7.8,Advanced Options,对话框,0,4,5,6,2,1,3,图7.6 “,新建”对话框,7.2,文档及其序列化,7.2.3,SDI,序列化过程,创建空文档,应用程序类的,InitInstance,函数在调用了,AddDocTemplate,函数之后,会通过,CWinApp,:,ProcessShellCommand,间接调用,CWinApp,的另一个非常有用的成员函数,OnFileNew,,,并依次完成下列工作:,(1),构造文档对象,但并不从磁盘中读数据。,(2),构造主框架类,CMainFrame,的对象,并创建该主框架窗口,但不显示。,(3),构造视图对象,并创建视图窗口,也不显示。,(4),通过内部机制,使文档、主框架和视图“对象”之间“真正”建立联系。,AddDocTemplate,函数建立的是“类”之间的联系。,(5),调用文档对象的,CDocument,:,OnNewDocument,虚成员函数,并调用,CDocument,:,DeleteContents,(,清除文档对象的内容,),虚函数。,(6),调用视图对象的,CView,:,OnInitialUpdate,虚成员函数。,(7),调用框架对象的,CFrameWnd,:,ActiveFrame,虚成员函数,以便显示出具有菜单、工具栏、状态栏以及视图窗口的主框架窗口。,MFC AppWizard,为用户在文档类中自动产生,OnNewDocument,虚函数的重载,用户利用此函数框架可以对文档对象进行初始化。,7.2,文档及其序列化,打开文档,MFC AppWizard,创建应用程序时,它会自动将“文件,(,File)”,菜单中的“打开,(,Open)”,命令,(,ID,号为,ID_FILE_OPEN),映射到,CWinApp,的,OnFileOpen,成员函数。这一结果可以从应用类,(.,cpp,),的消息入口处得到验证:,BEGIN_MESSAGE_MAP(,CEx,_,SdiApp,CWinApp,),ON_COMMAND(ID_FILE_NEW,CWinApp,:,OnFileNew,),ON_COMMAND(ID_FILE_OPEN,CWinApp,:,OnFileOpen,),/Standard print setup command,ON_COMMAND(ID_FILE_PRINT_SETUP,CWinApp,:,OnFilePrintSetup,),END_MESSAGE_MAP(),OnFileOpen,函数还会进一步完成下列工作:,(1),弹出通用“打开”对话框,供用户选择一个文件。,(2),调用文档对象的,CDocument,:,OnOpenDocument,虚成员函数。该函数将打开文件,并调用,DeleteContents,清除文档对象的内容,然后创建一个,CArchive,对象用于数据的读取,接着又自动调用,Serialize,函数。,(3),调用视图对象的,CView,:,OnInitialUpdate,虚成员函数。,7.2,文档及其序列化,MFC,为我们重载了,Serialize,函数,使得我们不必使用,CFile,类就可以完成相应的文档操作。例如,在文档类中有这样的代码:,void,CEx,_,SdiDoc,:Serialize(,CArchive,&,ar,),if(,ar,.,IsStoring,(),/TODO:add storing code here,else,/TODO:add loading code here,只需根据,ar,.,IsStoring,(),结果的“真”与“假”就可决定向文档写与读数据。例如,在此判断体中,可以增加一些代码来读取文档中的数据:,void,CEx,_,SdiDoc,:Serialize(,CArchive,&,ar,),if(,ar,.,IsStoring,(),else,for(,int,i=0;im_,ch,i;,CString,str,;,str.Format(_T(“%s”),m_ch);,AfxMessageBox(str);,7.2,文档及其序列化,保存文档,MFC AppWizard,创建应用程序时,会自动将“文件,(,File)”,菜单中的“保存,(,Save)”,命令与文档类,CDocument,的,OnFileSave,函数在内部关联起来,在程序框架中看不到相应的代码。,OnFileSave,函数还会进一步完成下列工作:,(1),弹出通用“保存”对话框,让用户提供一个文件名。,(2),调用文档对象的,CDocument,:,OnSaveDocument,虚成员函数,接着又自动调用,Serialize,函数,将,CArchive,对象的内容保存在文档中。,需要说明的是:,只有在保存文档之前还没有存过盘或读取的文档是“只读”的,,OnFileSave,函数才会弹出通用“保存”对话框。否则,只执行第二步。,“文件,(,File)”,菜单中还有一个“另存为,(,Save As)”,命令,它是与文档类,CDocument,的,OnFileSaveAs,函数相关联。不管文档有没有保存过,,OnFileSaveAs,都有会执行上述两个步骤。,可以用,ClassWizard,来重载,CDocument,:,OnSaveDocument,函数,并可在,Serialize,函数体的,ar,.,IsStorinr,(),为“真”的条件语句处添加代码来在文档中保存用户自己的数据,,7.2,文档及其序列化,关闭文档,试图关闭文档时,应用程序会根据文档是否修改进一步完成下列任务:,若文档内容已被修改,则弹出一个消息对话框,询问用户是否需要将文档保存。若用户选择“是”,则应用程序执行,OnFileSave,过程。,调用,CDocument,:,OnCloseDocument,虚成员函数,关闭所有与该文档相关联的文档窗口及相应的视图,调用文档类,CDocument,的,DeleteContents,清除文档数据。,MFC,应用程序通过,CDocument,的数据成员,m_,bModified,的逻辑值来判断用户是否对文档进行修改,如果,m_,bModified,为“真”,则表示文档被修改。,protected,类型的,m_,bModified,标记是通过,CDocument,的,SetModifiedFlag,和,IsModified,成员函数被访问的。当文档创建、从磁盘中读出以及文档存盘时,文档的这个标记就被置为,FALSE(,假),;而当文档数据被修改时,必须使用,SetModifiedFlag,函数将该标记置为,TRUE。,关闭文档时,应用程序才会显示询问消息对话框。,7.2,文档及其序列化,7.2.4,使用,CFile,和,CArchive,类,使用,CFile,类,(1),文件的打开和关闭,在,MFC,中,使用,CFile,打开一个文件通常使用下列两个步骤:,构造一个不带指定任何参数的,CFile,对象;,调用成员函数,Open,并指定文件路径以及文件标志。,Open,函数的原型如下:,BOOL Open(LPCTSTR,lpszFileName,UINT,nOpenFlags,CFileException,*,pError,=NULL);,7.2,文档及其序列化,(2),文件的读写和定位,CFile,类支持文件的读、写和定位操作。它们相关函数的原型如下:,UINT Read(void*,lpBuf,UINT,nCount,);,将文件中指定大小的数据读入指定的缓冲区,返回向缓冲区传输的字节数。,void Write(const void*,lpBuf,UINT,nCount,);,此函数将缓冲区的数据写到文件中。,LONG Seek(LONG,lOff,UINT,nFrom,);,定位文件指针的位置,若要定位的位置是合法的,返回从文件开始的偏移量。否则,返回值是不定的且激活一个,CFileException,对象。,函数,void,SeekToBegin,(),和,DWORD,SeekToEnd,(),分别将文件指针移动到文件开始和结尾位置,对于后者还将返回文件的大小。,7.2,文档及其序列化,(3),获取文件的有关信息,BOOL,GetStatus,(,CFileStatus,&,rStatus,)const;,static BOOL PASCAL,GetStatus,(LPCTSTR,lpszFileName,CFileStatus,&,rStatus,);,若指定文件的状态信息成功获得,该函数返回,TRUE,,否则返回,FALSE。,rStatus,用来存放文件状态信息,是一个,CFileStatus,结构类型,该结构具有下列成员:,CTime,m_,ctime,文件创建日期和时间,CTime,m_,mtime,文件最后一次修改日期和时间,CTime,m_,atime,文件最后一次访问日期和时间,LONG m_size,文件的逻辑大小字节数,就像,DOS,命令中,DIR,所显示的大小,BYTE m_attribute,文件属性,char m_,szFullName,_MAX_PATH,文件名,例如下面的代码:,CFile,theFile,;,char*,szFileName,=c:test,myfile,.,dat,;,BOOL,bOpenOK,;,CFileStatus,status;,if(,CFile,:,GetStatus,(,szFileName,status),bOpenOK,=,theFile,.Open(,szFileName,CFile,:,modeWrite,);,else,bOpenOK,=,theFile,.Open(,szFileName,CFile,:,modeCreate,|,CFile,:,modeWrite,);,7.2,文档及其序列化,使用,CArchive,类,(1),CArchive,类对象的创建和关闭,创建,CArchive,对象,有两种方法:一是通过框架隐式创建,CArchive,对象,另一是显式创建,CArchive,对象。,(2),使用“,”,运算符,(3),文件文本的读写,CArchive,提供成员函数,ReadString,和,WriteString,用来从一个文件对象中读写一行文本,它们的原型如下:,Bool,ReadString,(,CString,&,rString,);,LPTSTR,ReadString,(LPTSTR,lpsz,UINT,nMax,);,void,WriteString,(LPCTSTR,lpsz,);,7.2,文档及其序列化,7.2.5,使用简单数组集合类,简单数组集合类的构造及元素的添加,对简单数组集合类构造的方法都是一样的,都是使用各自的构造函数,它们的原型如下:,CByteArray CByteArray,();,CDWordArray CDWordArray,();,CPtrArray CPtrArray,();,CStringArray CStringArray,();,CUIntArray CUIntArray,();,CWordArray CWordArray,();,为了有效使用内存,在使用简单数组集合类之前最好调用成员函数,SetSize,设置此数组的大小,与其对应的函数是,GetSize,,,用来返回数组的大小。它们的原型如下:,void,SetSize,(,int,nNewSize,int,nGrowBy,=-1);,int,GetSize,()const;,向简单数组集合类添加一个元素,可使用成员函数,Add,和,Append,,它们的原型如下:,int,Add(,CObject,*,newElement,);,int,Append(const,CObArray,&,src,);,7.2,文档及其序列化,访问简单数组集合类的元素,在,MFC,中,一个简单数组集合类元素的访问既可以使用,GetAt,函数,也可使用“,”,操作符,例如:,/,CObArray,:operator,示例,CObArray,array;,CAge,*pa;/,CAge,是一个用户类,array.Add(new,CAge,(21);/,添加一个元素,array.Add(new,CAge,(40);/,再添加一个元素,pa=(,CAge,*)array0;/,获取元素,0,ASSERT(*pa=,CAge,(21);,array0=new,CAge,(30);/,替换元素,0;,ASSERT(*(,CAge,*)array0=,CAge,(30);,/,CObArray,:,GetAt,示例,CObArray,array;,array.Add(new,CAge,(21);/,元素,0,array.Add(new,CAge,(40);/,元素,1,ASSERT(*(CAge*)array.GetAt(0)=CAge(21);,7.2,文档及其序列化,删除简单数组集合类的元素,删除简单数组集合类中的元素一般需要进行以下几个步骤:,(1),使用函数,GetSize,(),和整数下标值访问简单数组集合类中的元素。,(2),若对象元素是在堆中创建的,则使用,delete,删除每一个对象元素。,(3),调用函数,RemoveAll,(),删除简单数组集合类中的所有元素。,例如,下面代码过程是一个,CObArray,的删除示例:,CObArray,array;,CAge,*pa1;,CAge,*pa2;,array.Add(pa1=new,CAge,(21);,array.Add(pa2=new,CAge,(40);,ASSERT(array.,GetSize,()=2);,for(,int,i=0;i3),nStyleIndex,=0;,7.3,视图及视图类,(5),用,ClassWizard,为,CEx,_,ListView,类添加,NM_DBLCLK,消息映射函数,增加代码:,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,CEx,_,ListView,:,OnInitialUpdate,(),CListView,:,OnInitialUpdate,();,/,创建图像列表,m_ImageList.Create(32,32,ILC_COLOR8|ILC_MASK,1,200);,m_ImageListSmall.Create(16,16,ILC_COLOR8|ILC_MASK,1,200);,CListCtrl,&m_,ListCtrl,=,GetListCtrl,();,m_,ListCtrl,.,SetImageList,(&m_,ImageList,LVSIL_NORMAL);,m_,ListCtrl,.,SetImageList,(&m_,ImageListSmall,LVSIL_SMALL);,LV_COLUMN,listCol,;,char*arCols4=,文件名,大小,类型,修改日期,;,listCol,.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;,7.3,视图及视图类,for(,int,nCol,=0;,nCol,4;,nCol,+),listCol,.,iSubItem,=,nCol,;,listCol,.,pszText,=,arCols,nCol,;,if(,nCol,=1),listCol,.,fmt,=LVCFMT_RIGHT;,else,listCol,.,fmt,=LVCFMT_LEFT;,m_,ListCtrl,.,InsertColumn,(,nCol,&,listCol,);,/,查找当前目录下的文件,CFileFind,finder;,BOOL,bWorking,=finder.,FindFile,(*.*);,int,nItem,=0,nIndex,nImage,;,CTime,m_time;,CString,str,strTypeName,;,while(,bWorking,),bWorking,=finder.,FindNextFile,();,if(finder.,IsArchived,(),str,=finder.,GetFilePath,();,SHFILEINFO,fi,;,SHGetFileInfo(str,0,&fi,sizeof(SHFILEINFO),SHGFI_ICON|SHGFI_LARGEICON|SHGFI_TYPENAME);,strTypeName,=,fi,.,szTypeName,;,nImage,=-1;,7.3,视图及视图类,for(,int,i=0;im_,strArray,.,GetSize,();i+),if(m_,strArray,i=,strTypeName,),nImage,=i;break;,if(,nImage,1024),str,.Format(%,dK,dwSize/1024);,else,str,.Format(%d,dwSize,);,m_ListCtrl.SetItemText(nIndex,1,str);,m_ListCtrl.SetItemText(nIndex,2,strTypeName);,finder.,GetLastWriteTime,(m_time);,m_ListCtrl.SetItemText(nIndex,3,m_time.Format(%Y-%m-%d);,nItem,+;,7.3,视图及视图类,SetCtrlStyle,(m_,ListCtrl,.,GetSafeHwnd,(),LVS_REPORT);,m_ListCtrl.SetColumnWidth(0,LVSCW_AUTOSIZE);/,设置列宽,m_ListCtrl.SetColumnWidth(1,100);,m_ListCtrl.SetColumnWidth(2,LVSCW_AUTOSIZE);,m_ListCtrl.SetColumnWidth(3,200);,(7),编译并运行,如图。,图7.11,Ex_List,运行结果,7.3,视图及视图类,7.3.3,树控件和树视图,树形视图的风格,7.3,视图及视图类,树控件的常用操作,函数,InsertItem,用来向树控件插入一个新项,操作成功后,函数返回新项的句柄,否则返回,NULL。,函数原型如下:,HTREEITEM,InsertItem,(UINT,nMask,LPCTSTR,lpszItem,int,nImage,int,nSelectedImage,UINT,nState,UINT,nStateMask,LPARAM,lParam,HTREEITEM,hParent,HTREEITEM,hInsertAfter,);,HTREEITEM,InsertItem,(LPCTSTR,lpszItem,HTREEITEM,hParent,=,TVI_ROOT,HTREEITEM,hInsertAfter,=,TVI_LAST);,HTREEITEM,
    展开阅读全文

    开通VIP折扣优惠下载文档

    提示  咨信网声明:本文档由用户上传并分享,仅供学习交流、研究之用,未经授权,严禁复制、发行、汇编、翻译或网络传播等,侵权必究。

    咨信网小贴示:
    1、浏览或下载可查看了解,请点击【咨信网告知】。
    2、下载文件中如有侵权或不适当内容,将立即纠正。
    3、如果因为网速或其他原因下载失败请重新下载,重复下载[60天内]不扣币。
    4、开具发票登录电脑端申请,请点击【索取发票】。

    咨信网客服组:【微信客服】

    自信AI创作助手
    关于本文
    本文标题:第07章-框架窗口、文档和视图.ppt
    链接地址:https://www.zixin.com.cn/doc/14748969.html

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork