框架窗口文档和视图精选PPT.ppt
《框架窗口文档和视图精选PPT.ppt》由会员分享,可在线阅读,更多相关《框架窗口文档和视图精选PPT.ppt(61页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、框架窗口文档和视图框架窗口文档和视图第1页,此课件共61页哦7.1框架窗口框架窗口 7.1.1主窗口和文档窗口主窗口和文档窗口 主窗口是应用程序直接放置在桌面上的那个窗口,每个应用程序只能有一个主窗口,主窗口的标题栏上往往显示应用程序的名称。文档窗口对于SDI程序来说,它和主窗口是一致的,即主窗口就是文档窗口;而对于MDI程序,文档窗口是主窗口的子窗口,如图。文档窗口一般都有相应的可见边框,它的客户区是由相应的视图来构成的,因此可以说视图是文档窗口内的子窗口。文档窗口时刻跟踪当前处于活动状态的视图的变化,并将用户或系统产生的命令消息传递给当前活动视图。而主窗口负责管理各个用户交互对象并根据用户
2、操作相应地创建或更新文档窗口及其视图。图图7.1 MDI应用程序的框架窗口应用程序的框架窗口文档窗口主窗口第2页,此课件共61页哦7.1框架窗口框架窗口7.1.2窗口风格的设置窗口风格的设置 窗口风格 窗口风格通常有一般和扩展两种形式。这两种形式的窗口风格可在函数CWnd:Create或CWnd:CreateEx参数中指定,CreateEx函数可同时支持以上两种风格,而CWnd:Create只能指定窗口的一般风格。需要说明的是,对于控件和对话框这样的窗口来说,它们的窗口风格可直接通过其属性对话框来设置。需要说明的是,除了上述风格外,框架窗口还有以下三个自己的风格。它们都可以在PreCreate
3、Window重载函数中指定。uFWS_ADDTOTITLE该风格指定相关的信息如文档名添加到框架窗口标题的后面。uFWS_PREFIXTITLE 该风格使得框架窗口标题中的文档名显示在应用程序名之前。uFWS_SNAPTOBARS 该风格用来调整窗口的大小,使它刚好包含了框架窗口中的控制栏。第3页,此课件共61页哦7.1框架窗口框架窗口用用MFC AppWizard设置设置 图图7.2 MFC AppWizard的窗口风格设置的窗口风格设置第4页,此课件共61页哦7.1框架窗口框架窗口修改CREATESTRUCT结构 窗口创建之前,系统自动调用PreCreateWindow虚函数。在用MFC
4、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_CYSCREEN)/3;cs.cx
5、=: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 CMDIChildWnd:P
6、reCreateWindow(cs);第5页,此课件共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函数来进行。第6页,此课件共61页哦7.1框架窗口框架窗口例Ex_Vscroll 多文档(MDI)的子文档窗口增加垂直滚动条。(1)用MFC AppWizard创建一个多文档应用程序。(2)用ClassWizard为子文档窗口类CChildFrame添加OnCreateClient消息处理,并增加下列代码:BOOL CChildFrame:OnCreateClient(LPCREATESTRUCT lpcs,CCreateContext*pContext)ModifyStyle(0
8、,WS_VSCROLL,0);return CMDIChildWnd:OnCreateClient(lpcs,pContext);(3)编译并运行,如图。图图7.3 为文档子窗口添加垂直滚动条为文档子窗口添加垂直滚动条第7页,此课件共61页哦7.1框架窗口框架窗口设置设置TopMost窗口风格窗口风格 最顶(TopMost)窗口是指那些始终出现在桌面的最前方且不会被其他窗口覆盖的窗口。如果要创建这样的一个最顶窗口,则在运行时必须指定WS_EX_TOPMOST扩展窗口风格。此风格的设置是在CWnd:SetWindowPos函数中进行;作为技巧,我们可以先调用CWnd:GetExStyle函数来确
9、定是否已经设置了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具体的使用方法将在下一节中介绍。第8页,此课件共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_SdiApp使用这个公有型成员变量m_nCmdShow。m
11、_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();return TRUE;第9页,此课件共61页哦7.1框架窗口框架窗口用用SetWindowPos或或MoveWindow改变窗口的大小和位置改变窗口的大小和位置 uSetWindowPos不仅可以改变窗口的大小、位置,还可以改变所有窗口在堆栈排列的次序(Z次序),这个次序是根据它们在屏幕出现的先后来确定的。u函数CWnd:MoveWindow也可用来改变窗口的大小和位置,用户必须在MoveWindow函数中指定窗口的大小。void MoveWindow(int x,int y
12、,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_pMainWnd-SetWindowPos(NULL,1
13、00,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();/将窗口置于屏幕中央AfxGetMainWnd(
14、)-CenterWindow();/将主框架窗口居中 第10页,此课件共61页哦7.2文档及其序列化文档及其序列化 7.2.1单文档和多文档单文档和多文档 一个多文档应用程序的示例过程:(1)用MFC AppWizard创建一个多文档应用程序项目Ex_Mdi。由于向导默认创建的就是这种程序类型,因此只要在向导的Step 1对话框中单击Finish按钮即可创建一个默认的多文档应用程序。(2)打开CEx_MdiApp:InitInstance可看出与默认的单文档应用程序不同的代码是:BOOL CEx_MdiApp:InitInstance()CMultiDocTemplate*pDocTempla
15、te;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;第11页,此课
16、件共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),/MDI文档子窗口RUNTIME_CLASS(CEx_MdiVie
17、w);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_MAI
18、NFRAME)return FALSE;m_pMainWnd=pMainFrame;第12页,此课件共61页哦7.2文档及其序列化文档及其序列化(4)在Ex_Mdi.cpp文件的开始处,添加包含CAnotherDoc类的头文件:#include AnotherDoc.h(5)编译并运行后,如图,从中选择一个文档类型。任何时候,选择Ex_Mdi程序的“文件”菜单“新建”命令或单击“新建”工具按钮都将弹出此对话框。选定第二个文档类型后,单击确定。这时程序出现一个断言错误,这是因为在视图类中有一个GetDocument函数,它的代码如下:CEx_MdiDoc*CEx_MdiView:GetDocum
19、ent()/non-debug version is inlineASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CEx_MdiDoc);return(CEx_MdiDoc*)m_pDocument;创建的文档类型是CAnotherDoc时,由于两种类型的文档共用一个视图,调用的GetDocument函数是同一个函数,因此断言不成立,程序不能正常运行。(6)用ClassWizard为该项目添加一个CView类的派生类CAnotherView,并将InitInstance第二模板pAnother中的CEx_MdiView改成CAnotherView,然后在该源
20、文件前面添加CAnotherView的头文件AnotherView.h。(7)再次运行,上述问题得到解决。但是,图7.4的文档“新建”对话框中显示的文档类型名称应该怎么修改呢?这时就需要使用文档的字串资源。图图7.4 文档文档“新建新建”对话框对话框第13页,此课件共61页哦7.2文档及其序列化文档及其序列化7.2.2文档的字串资源文档的字串资源 通过对文档的字串资源修改可以改变文档窗口标题、文档类型以及通用文件对话框中的某些内容。例如下面的示例过程:(1)打开前面的多文档应用程序项目Ex_Mdi。(2)打开String Table,将IDR_EX_MDITYPE字串资源复制,复制后的ID为I
21、DR_ANOTHERTYPE,修改这两个字串资源,结果如下表所示。如果IDR_ANOTHERTYPE的值不等于130,可在其属性对话框中直接给标识赋值,如图。(3)将InitInstance第二模板pAnother中的资源号IDR_EX_MDITYPE改成IDR_ANOTHERTYPE。图图7.5 指定标识值指定标识值第14页,此课件共61页哦7.2文档及其序列化文档及其序列化(4)重新编译并运行,如图。测试后还发现“打开”或“保存”对话框中的“文件类型”框中显示出文档字串资源定义的类型名,如图。文档资源字串的内容也可在文档应用程序创建时的Advanced Options对话框中指定,如图,图
22、中数字表示该项的含义与表中对应串号的含义相同。图图7.7 Ex_Mdi运行结果运行结果图图7.8 Advanced Options对话框对话框0456213图图7.6 “新建新建”对话框对话框第15页,此课件共61页哦7.2文档及其序列化文档及其序列化7.2.3 SDI序列化过程序列化过程创建空文档创建空文档 应用程序类的InitInstance函数在调用了AddDocTemplate函数之后,会通过CWinApp:ProcessShellCommand间接调用CWinApp的另一个非常有用的成员函数OnFileNew,并依次完成下列工作:(1)构造文档对象,但并不从磁盘中读数据。(2)构造主
23、框架类CMainFrame的对象,并创建该主框架窗口,但不显示。(3)构造视图对象,并创建视图窗口,也不显示。(4)通过内部机制,使文档、主框架和视图“对象”之间“真正”建立联系。AddDocTemplate函数建立的是“类”之间的联系。(5)调用文档对象的CDocument:OnNewDocument虚成员函数,并调用CDocument:DeleteContents(清除文档对象的内容)虚函数。(6)调用视图对象的CView:OnInitialUpdate虚成员函数。(7)调用框架对象的CFrameWnd:ActiveFrame虚成员函数,以便显示出具有菜单、工具栏、状态栏以及视图窗口的主框
24、架窗口。MFC AppWizard为用户在文档类中自动产生OnNewDocument虚函数的重载,用户利用此函数框架可以对文档对象进行初始化。第16页,此课件共61页哦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
25、: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虚成员函数。该函数将打开文件,并调用DeleteContents清除文档对象的内容,然后创建一个CArchive对象用于数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 框架 窗口 文档 视图 精选 PPT
限制150内