📄 chap3_5.htm
字号:
<html>
<head>
<title>3.5 几种窗口类型</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
</head>
<body link="#3973DE" alink="#3973DE">
<font SIZE="5"><b><div align="center"><center>
<table border="0" width="615" cellspacing="0" cellpadding="0">
<tr>
</b><td><div align="center"><center><table border="0" width="615" cellpadding="0" cellspacing="0" height="20">
<tr>
<td width="377" bgcolor="#15397D" height="20"></td>
<td width="238" bgcolor="#000000" height="20"><p align="right"></font><span style="text-decoration: none"><a href="../../index.htm"><font color="#FFFFFF">电脑报Visual
C++网络教程</font></a></span></td>
</tr>
</table>
</center></div><font FACE="Times New Roman" SIZE="4"><b><p ALIGN="CENTER"></b></font><font color="#3973DE" FACE="Times New Roman" SIZE="4">3.5</font><font SIZE="4" color="#3973DE">
几种窗口类型</font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font color="#3973DE" FACE="Times New Roman" SIZE="3">3.5.1</font><font SIZE="3" color="#3973DE"> 框架窗口</font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">框架窗口为应用程序的用户界面提供结构框架,它是应用程序的主窗口,负责管理其包容的窗口,一个应用程序的最顶层的框架窗口是应用程序启动时创建的第一个窗口。</font><font FACE="Times New Roman" SIZE="3"></p>
<p>MFC</font><font SIZE="3">提供三种类型的框架窗口:单文档窗口,多文档窗口(</font><font FACE="Times New Roman" SIZE="3">MDI</font><font SIZE="3">),对话框。在</font><font FACE="Times New Roman" SIZE="3">AppWizard</font><font SIZE="3">的第一个对话框中,就提供了选项,让用户选择应用程序是基于单文档、多文档还是对话框的。</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">单文档窗口一次只能打开一个文档框架窗口,而</font><font FACE="Times New Roman" SIZE="3">MDI</font><font SIZE="3">应用程序运行时,在应用程序的一个实例中打开多个文档框架窗口,这些窗口称作子窗口(</font><font FACE="Times New Roman" SIZE="3">Child Window</font><font SIZE="3">)。这些文档可以是同一类型的,也可以是不同类型的。如</font><font FACE="Times New Roman" SIZE="3">Visual Studio</font><font SIZE="3">就可以打开资源文件窗口和源程序窗口等不同类型的窗口。此时,激活不同类型的</font><font FACE="Times New Roman" SIZE="3">MDI</font><font SIZE="3">子窗口,菜单也将相应变化。</font><font FACE="Times New Roman" SIZE="3"></p>
<p>MFC</font><font SIZE="3">提供了三个类</font><font FACE="Times New Roman" SIZE="3">CFrameWnd</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">CMDIFrameWnd</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">CMDIChildWnd</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">CDialog </font><font SIZE="3">分别用于支持单文档窗口、多文档窗口和对话框。</font><font FACE="Times New Roman" SIZE="3"></p>
<p>CFrameWnd</p>
<p></font><font SIZE="3">用于</font><font FACE="Times New Roman" SIZE="3">SDI</font><font SIZE="3">框架窗口,形成单个文档及其视的边框。框架窗口既是应用程序的主框架窗口,也是当前文档对应的视图的边框。</font><font FACE="Times New Roman" SIZE="3"></p>
<p>CMDIFrameWnd</p>
<p></font><font SIZE="3">用于</font><font FACE="Times New Roman" SIZE="3">MDI</font><font SIZE="3">应用程序的主框架窗口。主框架窗口是所有</font><font FACE="Times New Roman" SIZE="3">MDI</font><font SIZE="3">文档窗口的容器,并与它们共享菜单条。</font><font FACE="Times New Roman" SIZE="3">MDI</font><font SIZE="3">框架窗口是出现在桌面中的顶层窗口。</font><font FACE="Times New Roman" SIZE="3"></p>
<p>CMDIChildWnd</p>
<p></font><font SIZE="3">用于在</font><font FACE="Times New Roman" SIZE="3">MDI</font><font SIZE="3">主框架窗口中显示打开的各个文档。每个文档及其视都有一个</font><font FACE="Times New Roman" SIZE="3">MDI</font><font SIZE="3">子框架窗口,子框架窗口包含在</font><font FACE="Times New Roman" SIZE="3">MDI</font><font SIZE="3">主框架窗口中。子框架窗口看起来类似一般的框架边框窗口,但它是包含在主框架窗口中,而不是位于桌面的,并且为主窗口所裁剪。而且</font><font FACE="Times New Roman" SIZE="3">MDI</font><font SIZE="3">子窗口没有自己的菜单,它与主</font><font FACE="Times New Roman" SIZE="3">MDI</font><font SIZE="3">框架窗口共享菜单。</font><font FACE="Times New Roman" SIZE="3"></p>
<p>CDialog</p>
<p></font><font SIZE="3">对话框是一种特殊类型的窗口,它的边框一般不可以调整,而且内部包含一些控件窗口。有关对话框作为主窗口的技术可以参见下一章。</font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">要生成一个单文档窗口,主窗口就必须从</font><font FACE="Times New Roman" SIZE="3">CFrameWnd</font><font SIZE="3">派生;要生成一个多文档窗口,主窗口就必须从</font><font FACE="Times New Roman" SIZE="3">CMDIFrameWnd</font><font SIZE="3">派生,而且其中的子窗口必须从</font><font FACE="Times New Roman" SIZE="3">CMDIChildWnd</font><font SIZE="3">派生出来;而基于对话框的窗口程序就要从</font><font FACE="Times New Roman" SIZE="3">CDialog</font><font SIZE="3">派生出主窗口类。<b></p>
<p>子窗口</font><font FACE="Times New Roman" SIZE="3"></p>
<p></font></b><font SIZE="3">子窗口就是具有</font><font FACE="Times New Roman" SIZE="3">WS_CHILD</font><font SIZE="3">风格的窗口,且一定有一个父窗口。所有的控件都是子窗口。子窗口可以没有边框。子窗口被完全限制在父窗口内部。<b></p>
<p>父窗口</b></font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">父窗口就是拥有子窗口的窗口。<b></p>
<p>弹出式窗口</b></font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">具有</font><font FACE="Times New Roman" SIZE="3">WS_POPUP</font><font SIZE="3">风格,它可以没有父窗口。这种窗口几乎什么都没有,可看作一个矩形区域。</font><b><font FACE="Times New Roman" SIZE="3"></p>
<p>3.5.2</font><font SIZE="3">窗口的创建</font></b><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">窗口的创建分为两步:第一步是用</font><font FACE="Times New Roman" SIZE="3">new</font><font SIZE="3">创建一个</font><font FACE="Times New Roman" SIZE="3">C++</font><font SIZE="3">的窗口对象,但是此时只是初始化窗口的数据成员,并没有真正创建窗口(这一点与一般的对象有所不同)。</font><font FACE="Times New Roman" SIZE="3"></p>
<p>//</font><font SIZE="3">第一步:创建一个</font><font FACE="Times New Roman" SIZE="3">C++</font><font SIZE="3">对象,其中</font><font FACE="Times New Roman" SIZE="3">CMainFrame</font><font SIZE="3">是从</font><font FACE="Times New Roman" SIZE="3">CFrameWnd</font><font SIZE="3">派生的对象。</font><font FACE="Times New Roman" SIZE="3"></p>
<p>CMainFrame* pMyFrame=new CMainFrame();//</font><font SIZE="3">用</font><font FACE="Times New Roman" SIZE="3">new</font><font SIZE="3">操作符创建窗口对象</font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">或</font><font FACE="Times New Roman" SIZE="3"></p>
<p>CMainFrame MyFrame;//</font><font SIZE="3">定义一个窗口对象,自动调用其构造函数</font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">第二步是创建窗口。</font><font FACE="Times New Roman" SIZE="3">CFrameWnd</font><font SIZE="3">的</font><font FACE="Times New Roman" SIZE="3">Create</font><font SIZE="3">成员函数把窗口给做出来,并将其</font><font FACE="Times New Roman" SIZE="3">HWND</font><font SIZE="3">保存在</font><font FACE="Times New Roman" SIZE="3">C++</font><font SIZE="3">对象的公共数据成员</font><font FACE="Times New Roman" SIZE="3">m_hWnd</font><font SIZE="3">中。</font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p>//</font><font SIZE="3">第二步:创建窗口</font><font FACE="Times New Roman" SIZE="3"></p>
<p>pMyFrame->Create(NULL,</font><font SIZE="3">“</font><font FACE="Times New Roman" SIZE="3">My Frame Window</font><font SIZE="3">”</font><font FACE="Times New Roman" SIZE="3">);</p>
<p></font><font SIZE="3">或</font><font FACE="Times New Roman" SIZE="3"></p>
<p>MyFrame.Create(NULL,</font><font SIZE="3">“</font><font FACE="Times New Roman" SIZE="3">My Frame Window</font><font SIZE="3">”</font><font FACE="Times New Roman" SIZE="3">);</p>
<p>Create</font><font SIZE="3">函数的原形如下:</font><font FACE="Times New Roman" SIZE="3"></p>
<blockquote>
<blockquote>
</font><font FACE="Arial" SIZE="2"><b><p></b></font><font FACE="Times New Roman" SIZE="3">BOOL
Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle =
WS_OVERLAPPEDWINDOW, const RECT& rect = rectDefault, CWnd* pParentWnd = NULL, LPCTSTR
lpszMenuName = NULL, DWORD dwExStyle = 0, CCreateContext* pContext = NULL );</p>
</blockquote>
</blockquote>
<p>Create</font><font SIZE="3">函数第一个参数为窗口注册类名,它指定了窗口的图标和类风格。这里我们使用</font><font FACE="Times New Roman" SIZE="3">NULL</font><font SIZE="3">做为其值,表明使用缺省属性。第二个参数为窗口标题。其余几个参数指定了窗口的风格、大小、父窗口、菜单名等。</font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">这个函数看起来比较复杂,对于</font><font FACE="Times New Roman" SIZE="3">CFrameWnd</font><font SIZE="3">派生出来的窗口,我们可以使用</font><font FACE="Times New Roman" SIZE="3">LoadFrame</font><font SIZE="3">从资源文件中创建窗口,它只需要一个参数。</font><font FACE="Times New Roman" SIZE="3"></p>
<p>pMyFrame->LoadFrame(IDR_FRAME)</font><font SIZE="3">;</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">LoadFrame</font><font SIZE="3">使用该参数从资源中获取许多默认值,包括主边框窗口的标题、图标、菜单、加速键等。但是,在使用</font><font FACE="Times New Roman" SIZE="3">LoadFrame</font><font SIZE="3">时,必须确保标题字符串、图标、菜单、加速键等资源使用同一个</font><font FACE="Times New Roman" SIZE="3">ID</font><font SIZE="3">标识符(在本例中,我们使用</font><font FACE="Times New Roman" SIZE="3">IDR_FRAME</font><font SIZE="3">)。<b></p>
<p>提示:</b>在</font><font FACE="Times New Roman" SIZE="3">Hello</font><font SIZE="3">程序的</font><font FACE="Times New Roman" SIZE="3">InitInstance</font><font SIZE="3">中我们看不到创建窗口的过程。实际上,在</font><font FACE="Times New Roman" SIZE="3"></p>
<p>pDocTemplate = new CSingleDocTemplate(</p>
<p>IDR_MAINFRAME,</p>
<p>RUNTIME_CLASS(CHelloDoc),</p>
<p>RUNTIME_CLASS(CMainFrame), // main SDI frame window</p>
<p>RUNTIME_CLASS(CHelloView));</p>
<p ALIGN="JUSTIFY">AddDocTemplate(pDocTemplate); </font><font SIZE="3">程序片段中,我们看到,</font><font FACE="Times New Roman" SIZE="3">CSingleDocTemplate</font><font SIZE="3">构造函数的第二个参数就是</font><font FACE="Times New Roman" SIZE="3">IDR_MAINFRAME</font><font SIZE="3">。在构造函数内部,已经通过调用</font><font FACE="Times New Roman" SIZE="3">m_pMainWnd->LoadFrame(IDR_MAINFRAME)</font><font SIZE="3">,完成了应用程序主窗口的创建过程。</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">在</font><font FACE="Times New Roman" SIZE="3">InitInstance</font><font SIZE="3">中,创建完窗口后,窗口调用</font><font FACE="Times New Roman" SIZE="3">ShowWindow</font><font SIZE="3">成员函数来显示窗口。</font><font FACE="Times New Roman" SIZE="3">ShowWindow</font><font SIZE="3">带一个参数,指示窗口以何种方式显示(最大化、最小化或一般)。缺省方式为</font><font FACE="Times New Roman" SIZE="3">SW_SHOW</font><font SIZE="3">,但实际上我们经常希望应用程序启动时窗口最大化,此时可以将该参数该为</font><font FACE="Times New Roman" SIZE="3">SW_SHOWMAXMIZED</font><font SIZE="3">,即调用</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED)</font><font SIZE="3">;</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">在</font><font FACE="Times New Roman" SIZE="3">MainFrm.cpp</font><font SIZE="3">中,我们还看到</font><font FACE="Times New Roman" SIZE="3">CMainFrame</font><font SIZE="3">类有一个</font><font FACE="Times New Roman" SIZE="3">OnCreate</font><font SIZE="3">方法。</font><font FACE="Times New Roman" SIZE="3">OnCreate</font><font SIZE="3">成员函数定义如清单</font><font FACE="Times New Roman" SIZE="3">3.3</font><font SIZE="3">。当调用</font><font FACE="Times New Roman" SIZE="3">Create</font><font SIZE="3">或</font><font FACE="Times New Roman" SIZE="3">CreateEx</font><font SIZE="3">时,操作系统会向窗口发送一条</font><font FACE="Times New Roman" SIZE="3">WM_CREATE</font><font SIZE="3">消息。这一函数就是用来响应</font><font FACE="Times New Roman" SIZE="3">WM_CREATE</font><font SIZE="3">消息的。<b></p>
<p>清单</font><font FACE="Times New Roman" SIZE="3">3.3 OnCreate</font><font SIZE="3">成员函数定义</font></b><font FACE="Times New Roman" SIZE="3"></p>
<p>int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)</p>
<p>{</p>
<p>if (CFrameWnd::OnCreate(lpCreateStruct) == -1)</p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -