框架窗口文档和视图优秀PPT.ppt

上传人:石*** 文档编号:51802228 上传时间:2022-10-20 格式:PPT 页数:61 大小:3.06MB
返回 下载 相关 举报
框架窗口文档和视图优秀PPT.ppt_第1页
第1页 / 共61页
框架窗口文档和视图优秀PPT.ppt_第2页
第2页 / 共61页
点击查看更多>>
资源描述

《框架窗口文档和视图优秀PPT.ppt》由会员分享,可在线阅读,更多相关《框架窗口文档和视图优秀PPT.ppt(61页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、框架窗口文档和视图框架窗口文档和视图你现在浏览的是第一页,共61页7.1框架窗口框架窗口 7.1.1主窗口和文档窗口主窗口和文档窗口 主窗口是应用程序直接放置在桌面上的那个窗口,每个应用程序只能有一个主窗口,主窗口的标题栏上往往显示应用程序的名称。文档窗口对于SDI程序来说,它和主窗口是一致的,即主窗口就是文档窗口;而对于MDI程序,文档窗口是主窗口的子窗口,如图。文档窗口一般都有相应的可见边框,它的客户区是由相应的视图来构成的,因此可以说视图是文档窗口内的子窗口。文档窗口时刻跟踪当前处于活动状态的视图的变化,并将用户或系统产生的命令消息传递给当前活动视图。而主窗口负责管理各个用户交互对象并根

2、据用户操作相应地创建或更新文档窗口及其视图。图图7.1 MDI应用程序的框架窗口应用程序的框架窗口文档窗口主窗口你现在浏览的是第二页,共61页7.1框架窗口框架窗口7.1.2窗口风格的设置窗口风格的设置 窗口风格 窗口风格通常有一般和扩展两种形式。这两种形式的窗口风格可在函数CWnd:Create或CWnd:CreateEx参数中指定,CreateEx函数可同时支持以上两种风格,而CWnd:Create只能指定窗口的一般风格。需要说明的是,对于控件和对话框这样的窗口来说,它们的窗口风格可直接通过其属性对话框来设置。需要说明的是,除了上述风格外,框架窗口还有以下三个自己的风格。它们都可以在Pre

3、CreateWindow重载函数中指定。uFWS_ADDTOTITLE该风格指定相关的信息如文档名添加到框架窗口标题的后面。uFWS_PREFIXTITLE 该风格使得框架窗口标题中的文档名显示在应用程序名之前。uFWS_SNAPTOBARS 该风格用来调整窗口的大小,使它刚好包含了框架窗口中的控制栏。你现在浏览的是第三页,共61页7.1框架窗口框架窗口用用MFC AppWizard设置设置 图图7.2 MFC AppWizard的窗口风格设置的窗口风格设置你现在浏览的是第四页,共61页7.1框架窗口框架窗口修改CREATESTRUCT结构 窗口创建之前,系统自动调用PreCreateWind

4、ow虚函数。在用MFC AppWizard创建SDI/MDI应用程序结构时,MFC已为主窗口或文档窗口类自动重载了该虚函数。可以在此函数中通过修改CREATESTRUCT结构来设置窗口的绝大多数风格。例如,在SDI程序中,框架窗口默认的风格是WS_OVERLAPPEDWINDOW和FWS_ADDTOTITLE的组合,更改风格代码:BOOL CMainFrame:PreCreateWindow(CREATESTRUCT&cs)/新窗口不带有最大化按钮cs.style&=WS_MAXIMIZEBOX;/将窗口的大小设为1/3屏幕并居中cs.cy=:GetSystemMetrics(SM_CYSCR

5、EEN)/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&=WS_MAXIMIZEBOX;/调用基类的PreCreateWindow函数return CM

6、DIChildWnd:PreCreateWindow(cs);你现在浏览的是第五页,共61页7.1框架窗口框架窗口使用ModifyStyle和ModifyStyleExCWnd类中的成员函数ModifyStyle和ModifyStyleEx也可用来更改窗口的风格,其中ModifyStyleEx还可更改窗口的扩展风格。这两个函数具有相同的参数,其含义如下。BOOL ModifyXXXX(DWORD dwRemove,DWORD dwAdd,UINT nFlags=0);参数dwRemove用来指定需要删除的风格,dwAdd用来指定需要增加的风格,nFlags表示SetWindowPos的标志,0

7、(默认)表示更改风格的同时不调用SetWindowPos函数。由于框架窗口在创建时不能直接设定其扩展风格,因此只能通过调用ModifyStyle函数来进行。你现在浏览的是第六页,共61页7.1框架窗口框架窗口例Ex_Vscroll 多文档(MDI)的子文档窗口增加垂直滚动条。(1)用MFC AppWizard创建一个多文档应用程序。(2)用ClassWizard为子文档窗口类CChildFrame添加OnCreateClient消息处理,并增加下列代码:BOOL CChildFrame:OnCreateClient(LPCREATESTRUCT lpcs,CCreateContext*pCon

8、text)ModifyStyle(0,WS_VSCROLL,0);return CMDIChildWnd:OnCreateClient(lpcs,pContext);(3)编译并运行,如图。图图7.3 为文档子窗口添加垂直滚动条为文档子窗口添加垂直滚动条你现在浏览的是第七页,共61页7.1框架窗口框架窗口设置设置TopMost窗口风格窗口风格 最顶(TopMost)窗口是指那些始终出现在桌面的最前方且不会被其他窗口覆盖的窗口。如果要创建这样的一个最顶窗口,则在运行时必须指定WS_EX_TOPMOST扩展窗口风格。此风格的设置是在CWnd:SetWindowPos函数中进行;作为技巧,我们可以先

9、调用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具体的使用方法将在下一节中介绍。你现在浏览的是第八页,共61页7.1框架窗口框架窗口7.1.3窗口状态的改变窗口状态的改变 用用ShowWindow

10、改变窗口的显示状态改变窗口的显示状态 当一个新的应用程序创建之后,InitInstance函数总会调用ShowWindow函数来显示窗口 想要改变改变窗口显示状态,只需根据上表选择所需的参数值,调用ShowWindow函数就可达到目的。当然,也可对CWinApp的公有型(public)成员变量m_nCmdShow进行赋值,同样能达到效果。下面的代码是将窗口的初始状态设置为“最小化”:BOOL CEx_SdiApp:InitInstance().m_nCmdShow=SW_SHOWMINIMIZED;/由于CEx_SdiApp类继承了基类CWinApp的特性,因此也可在派生类/CEx_SdiAp

11、p使用这个公有型成员变量m_nCmdShow。m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();return TRUE;你现在浏览的是第九页,共61页7.1框架窗口框架窗口用用SetWindowPos或或MoveWindow改变窗口的大小和位置改变窗口的大小和位置 uSetWindowPos不仅可以改变窗口的大小、位置,还可以改变所有窗口在堆栈排列的次序(Z次序),这个次序是根据它们在屏幕出现的先后来确定的。u函数CWnd:MoveWindow也可用来改变窗口的大小和位置,用户必须在MoveWindow函数中指定窗口的大小。

12、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表示窗口新的大小和位置。u使用上述两个函数把主窗口移动到屏幕的(100,100)处(代码添在CEx_SdiApp:InitInstance中return TRUE语句之前)。/使用SetWindowPos函数的示例m_p

13、MainWnd-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);u改变窗口的大小和位置的CWnd成员函数还不止以上两个。例如CenterWindow函数是使窗口居于父窗口中央,就像下面的代码:CenterWindow(CWnd:GetDesktopWindow

14、();/将窗口置于屏幕中央AfxGetMainWnd()-CenterWindow();/将主框架窗口居中 你现在浏览的是第十页,共61页7.2文档及其序列化文档及其序列化 7.2.1单文档和多文档单文档和多文档 一个多文档应用程序的示例过程:(1)用MFC AppWizard创建一个多文档应用程序项目Ex_Mdi。由于向导默认创建的就是这种程序类型,因此只要在向导的Step 1对话框中单击Finish按钮即可创建一个默认的多文档应用程序。(2)打开CEx_MdiApp:InitInstance可看出与默认的单文档应用程序不同的代码是:BOOL CEx_MdiApp:InitInstance(

15、)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;

16、m_pMainWnd=pMainFrame;你现在浏览的是第十一页,共61页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),/

17、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;

18、if(!pMainFrame-LoadFrame(IDR_MAINFRAME)return FALSE;m_pMainWnd=pMainFrame;你现在浏览的是第十二页,共61页7.2文档及其序列化文档及其序列化(4)在Ex_Mdi.cpp文件的开始处,添加包含CAnotherDoc类的头文件:#include AnotherDoc.h(5)编译并运行后,如图,从中选择一个文档类型。任何时候,选择Ex_Mdi程序的“文件”菜单“新建”命令或单击“新建”工具按钮都将弹出此对话框。选定第二个文档类型后,单击确定。这时程序出现一个断言错误,这是因为在视图类中有一个GetDocument函数,它的代

19、码如下:CEx_MdiDoc*CEx_MdiView:GetDocument()/non-debug version is inlineASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CEx_MdiDoc);return(CEx_MdiDoc*)m_pDocument;创建的文档类型是CAnotherDoc时,由于两种类型的文档共用一个视图,调用的GetDocument函数是同一个函数,因此断言不成立,程序不能正常运行。(6)用ClassWizard为该项目添加一个CView类的派生类CAnotherView,并将InitInstance第二模板pAnoth

20、er中的CEx_MdiView改成CAnotherView,然后在该源文件前面添加CAnotherView的头文件AnotherView.h。(7)再次运行,上述问题得到解决。但是,图7.4的文档“新建”对话框中显示的文档类型名称应该怎么修改呢?这时就需要使用文档的字串资源。图图7.4 文档文档“新建新建”对话框对话框你现在浏览的是第十三页,共61页7.2文档及其序列化文档及其序列化7.2.2文档的字串资源文档的字串资源 通过对文档的字串资源修改可以改变文档窗口标题、文档类型以及通用文件对话框中的某些内容。例如下面的示例过程:(1)打开前面的多文档应用程序项目Ex_Mdi。(2)打开Strin

21、g Table,将IDR_EX_MDITYPE字串资源复制,复制后的ID为IDR_ANOTHERTYPE,修改这两个字串资源,结果如下表所示。如果IDR_ANOTHERTYPE的值不等于130,可在其属性对话框中直接给标识赋值,如图。(3)将InitInstance第二模板pAnother中的资源号IDR_EX_MDITYPE改成IDR_ANOTHERTYPE。图图7.5 指定标识值指定标识值你现在浏览的是第十四页,共61页7.2文档及其序列化文档及其序列化(4)重新编译并运行,如图。测试后还发现“打开”或“保存”对话框中的“文件类型”框中显示出文档字串资源定义的类型名,如图。文档资源字串的内

22、容也可在文档应用程序创建时的Advanced Options对话框中指定,如图,图中数字表示该项的含义与表中对应串号的含义相同。图图7.7 Ex_Mdi运行结果运行结果图图7.8 Advanced Options对话框对话框0456213图图7.6 “新建新建”对话框对话框你现在浏览的是第十五页,共61页7.2文档及其序列化文档及其序列化7.2.3 SDI序列化过程序列化过程创建空文档创建空文档 应用程序类的InitInstance函数在调用了AddDocTemplate函数之后,会通过CWinApp:ProcessShellCommand间接调用CWinApp的另一个非常有用的成员函数OnF

23、ileNew,并依次完成下列工作:(1)构造文档对象,但并不从磁盘中读数据。(2)构造主框架类CMainFrame的对象,并创建该主框架窗口,但不显示。(3)构造视图对象,并创建视图窗口,也不显示。(4)通过内部机制,使文档、主框架和视图“对象”之间“真正”建立联系。AddDocTemplate函数建立的是“类”之间的联系。(5)调用文档对象的CDocument:OnNewDocument虚成员函数,并调用CDocument:DeleteContents(清除文档对象的内容)虚函数。(6)调用视图对象的CView:OnInitialUpdate虚成员函数。(7)调用框架对象的CFrameWnd

24、:ActiveFrame虚成员函数,以便显示出具有菜单、工具栏、状态栏以及视图窗口的主框架窗口。MFC AppWizard为用户在文档类中自动产生OnNewDocument虚函数的重载,用户利用此函数框架可以对文档对象进行初始化。你现在浏览的是第十六页,共61页7.2文档及其序列化文档及其序列化打开文档打开文档 MFC AppWizard创建应用程序时,它会自动将“文件(File)”菜单中的“打开(Open)”命令(ID号为ID_FILE_OPEN)映射到CWinApp的OnFileOpen成员函数。这一结果可以从应用类(.cpp)的消息入口处得到验证:BEGIN_MESSAGE_MAP(CE

25、x_SdiApp,CWinApp)ON_COMMAND(ID_FILE_NEW,CWinApp:OnFileNew)ON_COMMAND(ID_FILE_OPEN,CWinApp:OnFileOpen)/Standard print setup commandON_COMMAND(ID_FILE_PRINT_SETUP,CWinApp:OnFilePrintSetup)END_MESSAGE_MAP()OnFileOpen函数还会进一步完成下列工作:(1)弹出通用“打开”对话框,供用户选择一个文件。(2)调用文档对象的CDocument:OnOpenDocument虚成员函数。该函数将打开文件

26、,并调用DeleteContents清除文档对象的内容,然后创建一个CArchive对象用于数据的读取,接着又自动调用Serialize函数。(3)调用视图对象的CView:OnInitialUpdate虚成员函数。你现在浏览的是第十七页,共61页7.2文档及其序列化文档及其序列化MFC为我们重载了Serialize函数,使得我们不必使用CFile类就可以完成相应的文档操作。例如,在文档类中有这样的代码:void CEx_SdiDoc:Serialize(CArchive&ar)if(ar.IsStoring()/TODO:add storing code here else/TODO:add

27、 loading code here只需根据ar.IsStoring()结果的“真”与“假”就可决定向文档写与读数据。例如,在此判断体中,可以增加一些代码来读取文档中的数据:void CEx_SdiDoc:Serialize(CArchive&ar)if(ar.IsStoring()else for(int i=0;im_chi;CString str;str.Format(_T(“%s”),m_ch);AfxMessageBox(str);你现在浏览的是第十八页,共61页7.2文档及其序列化文档及其序列化保存文档保存文档 MFC AppWizard创建应用程序时,会自动将“文件(File)”

28、菜单中的“保存(Save)”命令与文档类CDocument的OnFileSave函数在内部关联起来,在程序框架中看不到相应的代码。OnFileSave函数还会进一步完成下列工作:(1)弹出通用“保存”对话框,让用户提供一个文件名。(2)调用文档对象的CDocument:OnSaveDocument虚成员函数,接着又自动调用Serialize函数,将CArchive对象的内容保存在文档中。需要说明的是:需要说明的是:u只有在保存文档之前还没有存过盘或读取的文档是“只读”的,OnFileSave函数才会弹出通用“保存”对话框。否则,只执行第二步。u“文件(File)”菜单中还有一个“另存为(Sav

29、e As)”命令,它是与文档类CDocument的OnFileSaveAs函数相关联。不管文档有没有保存过,OnFileSaveAs都有会执行上述两个步骤。可以用ClassWizard来重载CDocument:OnSaveDocument函数,并可在Serialize函数体的ar.IsStorinr()为“真”的条件语句处添加代码来在文档中保存用户自己的数据,你现在浏览的是第十九页,共61页7.2文档及其序列化文档及其序列化关闭文档关闭文档试图关闭文档时,应用程序会根据文档是否修改进一步完成下列任务:若文档内容已被修改,则弹出一个消息对话框,询问用户是否需要将文档保存。若用户选择“是”,则应用

30、程序执行OnFileSave过程。调用CDocument:OnCloseDocument虚成员函数,关闭所有与该文档相关联的文档窗口及相应的视图,调用文档类CDocument的DeleteContents清除文档数据。uMFC应用程序通过CDocument的数据成员m_bModified的逻辑值来判断用户是否对文档进行修改,如果m_bModified为“真”,则表示文档被修改。uprotected类型的m_bModified标记是通过CDocument的SetModifiedFlag和IsModified成员函数被访问的。当文档创建、从磁盘中读出以及文档存盘时,文档的这个标记就被置为FALSE

31、(假);而当文档数据被修改时,必须使用SetModifiedFlag函数将该标记置为TRUE。关闭文档时,应用程序才会显示询问消息对话框。你现在浏览的是第二十页,共61页7.2文档及其序列化文档及其序列化7.2.4使用使用CFile和和CArchive类类 使用使用CFile类类(1)文件的打开和关闭在MFC中,使用CFile打开一个文件通常使用下列两个步骤:u构造一个不带指定任何参数的CFile对象;u调用成员函数Open并指定文件路径以及文件标志。Open函数的原型如下:BOOL Open(LPCTSTR lpszFileName,UINT nOpenFlags,CFileExceptio

32、n*pError=NULL);你现在浏览的是第二十一页,共61页7.2文档及其序列化文档及其序列化(2)文件的读写和定位CFile类支持文件的读、写和定位操作。它们相关函数的原型如下:uUINT Read(void*lpBuf,UINT nCount);将文件中指定大小的数据读入指定的缓冲区,返回向缓冲区传输的字节数。uvoid Write(const void*lpBuf,UINT nCount);此函数将缓冲区的数据写到文件中。uLONG Seek(LONG lOff,UINT nFrom);定位文件指针的位置,若要定位的位置是合法的,返回从文件开始的偏移量。否则,返回值是不定的且激活一个

33、CFileException对象。u函数void SeekToBegin()和DWORD SeekToEnd()分别将文件指针移动到文件开始和结尾位置,对于后者还将返回文件的大小。你现在浏览的是第二十二页,共61页7.2文档及其序列化文档及其序列化(3)获取文件的有关信息 BOOL GetStatus(CFileStatus&rStatus)const;static BOOL PASCAL GetStatus(LPCTSTR lpszFileName,CFileStatus&rStatus);若指定文件的状态信息成功获得,该函数返回TRUE,否则返回FALSE。rStatus用来存放文件状态信

34、息,是一个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:testmyfile.dat;BOOL bOpenOK;CFileStatus status;if(CFile:Get

35、Status(szFileName,status)bOpenOK=theFile.Open(szFileName,CFile:modeWrite);elsebOpenOK=theFile.Open(szFileName,CFile:modeCreate|CFile:modeWrite);你现在浏览的是第二十三页,共61页7.2文档及其序列化文档及其序列化使用CArchive类(1)CArchive类对象的创建和关闭 创建CArchive对象,有两种方法:一是通过框架隐式创建CArchive对象,另一是显式创建CArchive 对象。(2)使用“”运算符 (3)文件文本的读写CArchive提供

36、成员函数ReadString和WriteString用来从一个文件对象中读写一行文本,它们的原型如下:Bool ReadString(CString&rString);LPTSTR ReadString(LPTSTR lpsz,UINT nMax);void WriteString(LPCTSTR lpsz);你现在浏览的是第二十四页,共61页7.2文档及其序列化文档及其序列化7.2.5使用简单数组集合类使用简单数组集合类 简单数组集合类的构造及元素的添加 对简单数组集合类构造的方法都是一样的,都是使用各自的构造函数,它们的原型如下:CByteArray CByteArray();CDWord

37、Array CDWordArray();CPtrArray CPtrArray();CStringArray CStringArray();CUIntArray CUIntArray();CWordArray CWordArray();为了有效使用内存,在使用简单数组集合类之前最好调用成员函数SetSize 设置此数组的大小,与其对应的函数是GetSize,用来返回数组的大小。它们的原型如下:void SetSize(int nNewSize,int nGrowBy=-1);int GetSize()const;向简单数组集合类添加一个元素,可使用成员函数Add和Append,它们的原型如下:

38、int Add(CObject*newElement);int Append(const CObArray&src);你现在浏览的是第二十五页,共61页7.2文档及其序列化文档及其序列化访问简单数组集合类的元素访问简单数组集合类的元素 在MFC中,一个简单数组集合类元素的访问既可以使用GetAt函数,也可使用“”操作符,例如:/CObArray:operator 示例CObArray array;CAge*pa;/CAge是一个用户类array.Add(new CAge(21);/添加一个元素array.Add(new CAge(40);/再添加一个元素pa=(CAge*)array0;/获取

39、元素0ASSERT(*pa=CAge(21);array0=new CAge(30);/替换元素0;ASSERT(*(CAge*)array0=CAge(30);/CObArray:GetAt示例CObArray array;array.Add(new CAge(21);/元素 0array.Add(new CAge(40);/元素 1ASSERT(*(CAge*)array.GetAt(0)=CAge(21);你现在浏览的是第二十六页,共61页7.2文档及其序列化文档及其序列化删除简单数组集合类的元素 删除简单数组集合类中的元素一般需要进行以下几个步骤:(1)使用函数GetSize()和整数

40、下标值访问简单数组集合类中的元素。(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;你现在浏览的是第三十七页,共61页7.3视图及视图类视图及视图类(5)用ClassWizar

41、d为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_ListVi

42、ew: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_ListCtr

43、l.SetImageList(&m_ImageListSmall,LVSIL_SMALL);LV_COLUMN listCol;char*arCols4=文件名,大小,类型,修改日期;listCol.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;你现在浏览的是第三十八页,共61页7.3视图及视图类视图及视图类for(int nCol=0;nCol4;nCol+)listCol.iSubItem=nCol;listCol.pszText=arColsnCol;if(nCol=1)listCol.fmt=LVCFMT_RIGHT;elselistC

44、ol.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;SHGetFile

45、Info(str,0,&fi,sizeof(SHFILEINFO),SHGFI_ICON|SHGFI_LARGEICON|SHGFI_TYPENAME);strTypeName=fi.szTypeName;nImage=-1;你现在浏览的是第三十九页,共61页7.3视图及视图类视图及视图类 for(int i=0;im_strArray.GetSize();i+)if(m_strArrayi=strTypeName)nImage=i;break;if(nImage 1024)str.Format(%dK,dwSize/1024);elsestr.Format(%d,dwSize);m_List

46、Ctrl.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+;你现在浏览的是第四十页,共61页7.3视图及视图类视图及视图类SetCtrlStyle(m_ListCtrl.GetSafeHwnd(),LVS_REPORT);m_ListCtrl.SetColumnWidth(0,LVSCW_AUTOSIZE);/设置列

47、宽m_ListCtrl.SetColumnWidth(1,100);m_ListCtrl.SetColumnWidth(2,LVSCW_AUTOSIZE);m_ListCtrl.SetColumnWidth(3,200);(7)编译并运行,如图。图图7.11 Ex_List运行结果运行结果你现在浏览的是第四十一页,共61页7.3视图及视图类视图及视图类7.3.3树控件和树视图树控件和树视图 树形视图的风格 你现在浏览的是第四十二页,共61页7.3视图及视图类视图及视图类树控件的常用操作树控件的常用操作u函数InsertItem用来向树控件插入一个新项,操作成功后,函数返回新项的句柄,否则返回N

48、ULL。函数原型如下: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 InsertItem(LPCTSTR

49、 lpszItem,int nImage,int nSelectedImage,HTREEITEM hParent=TVI_ROOT,HTREEITEM hInsertAfter=TVI_LAST);u函数DeleteItem和DeleteAllItems分别用来删除指定的项和全部的项。它们的原型如下:BOOL DeleteAllItems();BOOL DeleteItem(HTREEITEM hItem);u函数Expand用来用来展开或收缩指定父项的所有子项,其原型如下:BOOL Expand(HTREEETEM hItem,UINT nCode);你现在浏览的是第四十三页,共61页7.

50、3视图及视图类视图及视图类树形视图控件的通知消息 树视图可以用ClassWizard映射公共控件消息和树控件消息。常用的树控件消息有:TVN_BEGINDRAG 开始拖放操作TVN_BEGINLABELEDIT 开始编辑标签TVN_BEGINRDRAG 鼠标右按钮开始拖放操作TVN_ENDLABELEDIT 标签编辑结束TVN_ITEMEXPANDED 含有子项的父项已展开或收缩TVN_ITEMEXPANDING 含有子项的父项将要展开或收缩TVN_SELCHANGED 当前选择项发生改变TVN_SELCHANGING 当前选择项将要发生改变用ClassWizard处理上述这些消息时,其消息处

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

当前位置:首页 > 生活休闲 > 资格考试

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁