《MFC窗口与单文档应用程序》由会员分享,可在线阅读,更多相关《MFC窗口与单文档应用程序(10页珍藏版)》请在金锄头文库上搜索。
1、MFC:窗口与单文档应用程序:窗口与单文档应用程序高级语言程序设计与实践2VCVC的的MFCMFC库支库支持三种不同持三种不同的应用程序的应用程序单文档界面单文档界面(SDI)多文档界面多文档界面(MDI)基于对话框的应用程序基于对话框的应用程序SDI的应用程序的应用程序只有一个窗口只有一个窗口MDI的应用程序每次的应用程序每次可以读写多个文件或可以读写多个文件或文档,可同时对多个文档,可同时对多个文档进行操作,可以文档进行操作,可以有多个子窗口有多个子窗口主主要要差差别别在创建在创建SDI界面的应用程序时,不生成界面的应用程序时,不生成CChildFrame类,类,CMainFrame类的基
2、类的基类为类为CFrameWnd在创建在创建MDI界面的应用程序时,界面的应用程序时,CMainFrame类的基类为类的基类为CMDIFrameWnd使用使用AppWizard创创建建SDI和和MDI界面的界面的应用程序的过程几应用程序的过程几乎完全一样乎完全一样2.1窗口窗口框架窗口框架窗口 框架窗口可分为两类:一类是应用程序主窗口,另一类是文档框架窗口可分为两类:一类是应用程序主窗口,另一类是文档窗口。窗口。主窗口和文档窗口主窗口和文档窗口 主框架窗口是应用程序直接放置在桌面主框架窗口是应用程序直接放置在桌面(DeskTop)上的那个窗口上的那个窗口,每个应用程序只能有一个主框架窗口,主框
3、架窗口的标题栏,每个应用程序只能有一个主框架窗口,主框架窗口的标题栏上往往显示应用程序的名称。上往往显示应用程序的名称。2.1.1窗口风格窗口风格 窗口窗口风风格既可以通格既可以通过过MFC AppWizard来来设设置,也可以在置,也可以在主窗口或文档窗口主窗口或文档窗口类类的的PreCreateWindow函数中修改函数中修改CREATESTRUCT结结构,或是可以构,或是可以调调用用CWnd类类的成的成员员函数函数ModifyStyle和和ModifyStyleEx来更改来更改。2.1.1窗口风格窗口风格2. 用用MFC AppWizard设置设置 MFC AppWizard 有一个有一
4、个高级高级按扭按扭(在创建单文档或多文档应用程序过程的第四在创建单文档或多文档应用程序过程的第四步中步中),允许用户指定有关,允许用户指定有关SDI和和MDI框架窗口的属性,框架窗口的属性,Advanced Options对话框的对话框的Window Styles页面页面2.1.2 窗口状态的改变窗口状态的改变1. 用用ShowWindow改变窗口的显示状态改变窗口的显示状态 当应用程序运行时,当应用程序运行时,Windows会自动调用应用程序框架内部的会自动调用应用程序框架内部的WinMain函数,并自动查找该应用程序类的全局变量函数,并自动查找该应用程序类的全局变量theApp,然后自动调
5、用用户应用程序类的虚函数,然后自动调用用户应用程序类的虚函数InitInstance,该函,该函数会进一步调用相应的函数来完成主窗口的构造和显示工作数会进一步调用相应的函数来完成主窗口的构造和显示工作BOOL CEx_SDIApp:InitInstance() m_pMainWnd-ShowWindow(SW_SHOW); / 显显示窗口示窗口m_pMainWnd-UpdateWindow();/ 更新窗口更新窗口return TRUE;2.1.2 改变窗口的大小和位置改变窗口的大小和位置 CWnd中的中的SetWindowPos是一个非常有用的函数;它不仅可是一个非常有用的函数;它不仅可以改
6、变窗口的大小、位置,而且还可以改变所有窗口在堆栈排以改变窗口的大小、位置,而且还可以改变所有窗口在堆栈排列的次序列的次序(Z次序次序),这个次序是根据它们在屏幕出现的先后来确,这个次序是根据它们在屏幕出现的先后来确定的。定的。 void MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE ); void MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE );m_pMainWnd-GetWindowRect(rcWindow);m_pMainWnd-Move
7、Window(100,100,rcWindow.Width(),rcWindow.Height(),TRUE);2.3 拆分窗口拆分窗口1.在在MainFrame类当中声名一个类当中声名一个CSpilitterWnd对象;对象;2.在在MainFrame类的类的OnCreateClient成员函数当中调用成员函数当中调用CSplitterWnd对象的对象的CreateStatic函数确定拆分函数确定拆分样式;样式;3.对对每个子窗口调用每个子窗口调用CSplitterWnd的的CreateView函数用来创建函数用来创建视图。视图。Demo:BOOL CMainFrame:OnCreateCl
8、ient(LPCREATESTRUCT lpcs, CCreateContext* pContext)if (!m_SplitterWnd.CreateStatic(this,1,2) | !m_SplitterWnd.CreateView(0,0,RUNTIME_CLASS(CExplorerView),CSize(192,0),pContext) | !m_SplitterWnd.CreateView(0,1,RUNTIME_CLASS(CFileView),CSize(0,0),pContext) return FALSE;return TRUE;2.2 单文档应用程序单文档应用程序2.
9、2 单文档中文档与视图的创建单文档中文档与视图的创建BOOL CEx_SDIApp:InitInstance()CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,/ 资源资源IDRUNTIME_CLASS(CEx_SDIDoc), / 文档类文档类RUNTIME_CLASS(CMainFrame), / 主框架窗口类主框架窗口类RUNTIME_CLASS(CEx_SDIView);/ 视图类视图类AddDocTemplate(pDocTemplate);return TRUE; 单文档中文档和视图的创建通常是在单文档中文档和视图的创建通常是在CwinApp类的成员函数类的成员函数BOOL InitInstance( )中,通过创建文档模板实现的中,通过创建文档模板实现的