📄 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" background="../../bg.gif">
<font SIZE="5"><b><div align="center"><center>
<table border="0" width="85%" cellspacing="0" cellpadding="0" bgcolor="#FFFFFF">
<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><a
href="../../vc.htm"><span style="text-decoration: none"><font color="#FFFFFF">电脑报Visual
C++网络教程</font></span></a></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><span style="font-size: 9pt"><font color="#3973DE">3.5.1 框架窗口</font></span></p>
<p><span style="font-size: 9pt"> 框架窗口为应用程序的用户界面提供结构框架,它是应用程序的主窗口,负责管理其包容的窗口,一个应用程序的最顶层的框架窗口是应用程序启动时创建的第一个窗口。<br>
MFC提供三种类型的框架窗口:单文档窗口,多文档窗口(MDI),对话框。在AppWizard的第一个对话框中,就提供了选项,让用户选择应用程序是基于单文档、多文档还是对话框的。MFC单文档窗口一次只能打开一个文档框架窗口,而MDI应用程序运行时,在应用程序的一个实例中打开多个文档框架窗口,这些窗口称作子窗口(Child
Window)。这些文档可以是同一类型的,也可以是不同类型的。如Visual
Studio就可以打开资源文件窗口和源程序窗口等不同类型的窗口。此时,激活不同类型的MDI子窗口,菜单也将相应变化。<br>
MFC提供了三个类CFrameWnd、CMDIFrameWnd、CMDIChildWnd和CDialog
分别用于支持单文档窗口、多文档窗口和对话框。</span></p>
<p><span style="font-size: 9pt">CFrameWnd<br>
用于SDI框架窗口,形成单个文档及其视的边框。框架窗口既是应用程序的主框架窗口,也是当前文档对应的视图的边框。</span></p>
<p><span style="font-size: 9pt">CMDIFrameWnd<br>
用于MDI应用程序的主框架窗口。主框架窗口是所有MDI文档窗口的容器,并与它们共享菜单条。MDI框架窗口是出现在桌面中的顶层窗口。</span></p>
<p><span style="font-size: 9pt">CMDIChildWnd<br>
用于在MDI主框架窗口中显示打开的各个文档。每个文档及其视都有一个MDI子框架窗口,子框架窗口包含在MDI主框架窗口中。子框架窗口看起来类似一般的框架边框窗口,但它是包含在主框架窗口中,而不是位于桌面的,并且为主窗口所裁剪。而且MDI子窗口没有自己的菜单,它与主MDI框架窗口共享菜单。</span></p>
<p><span style="font-size: 9pt">CDialog<br>
对话框是一种特殊类型的窗口,它的边框一般不可以调整,而且内部包含一些控件窗口。有关对话框作为主窗口的技术可以参见下一章。</span></p>
<p><span style="font-size: 9pt"> 要生成一个单文档窗口,主窗口就必须从CFrameWnd派生;要生成一个多文档窗口,主窗口就必须从CMDIFrameWnd派生,而且其中的子窗口必须从CMDIChildWnd派生出来;而基于对话框的窗口程序就要从CDialog派生出主窗口类。</span><b></p>
<p><span style="font-size: 9pt">子窗口<br>
</b>子窗口就是具有WS_CHILD风格的窗口,且一定有一个父窗口。所有的控件都是子窗口。子窗口可以没有边框。子窗口被完全限制在父窗口内部。</span><b></p>
<p><span style="font-size: 9pt">父窗口</b><br>
父窗口就是拥有子窗口的窗口。</span></p>
<b><p><span style="font-size: 9pt">弹出式窗口</b><br>
<b> </b>具有WS_POPUP风格,它可以没有父窗口。这种窗口几乎什么都没有,可看作一个矩形区域。</span></p>
<b><p><span style="font-size: 9pt">3.5.2窗口的创建</span></b></p>
<p><span style="font-size: 9pt">窗口的创建分为两步:第一步是用new创建一个C++的窗口对象,但是此时只是初始化窗口的数据成员,并没有真正创建窗口(这一点与一般的对象有所不同)。</span></p>
<p><span style="font-size: 9pt">//第一步:创建一个C++对象,其中CMainFrame是从CFrameWnd派生的对象。</span></p>
<p><span style="font-size: 9pt">CMainFrame* pMyFrame=new CMainFrame();//用new操作符创建窗口对象</span></p>
<p><span style="font-size: 9pt">或</span></p>
<p><span style="font-size: 9pt">CMainFrame MyFrame;//定义一个窗口对象,自动调用其构造函数</span></p>
<p><span style="font-size: 9pt">第二步是创建窗口。CFrameWnd的Create成员函数把窗口给做出来,并将其HWND保存在C++对象的公共数据成员m_hWnd中。</span></p>
<p><span style="font-size: 9pt">//第二步:创建窗口</span></p>
<p><span style="font-size: 9pt">pMyFrame->Create(NULL,“My Frame Window”);</span></p>
<p><span style="font-size: 9pt">或</span></p>
<p><span style="font-size: 9pt">MyFrame.Create(NULL,“My Frame Window”);</span></p>
<p><span style="font-size: 9pt">Create函数的原形如下:</span></p>
<blockquote>
<blockquote>
<b><p></b><span style="font-size: 9pt">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 );</span></p>
</blockquote>
</blockquote>
<p><span style="font-size: 9pt"> Create函数第一个参数为窗口注册类名,它指定了窗口的图标和类风格。这里我们使用NULL做为其值,表明使用缺省属性。第二个参数为窗口标题。其余几个参数指定了窗口的风格、大小、父窗口、菜单名等。</span></p>
<p><span style="font-size: 9pt"> 这个函数看起来比较复杂,对于CFrameWnd派生出来的窗口,我们可以使用LoadFrame从资源文件中创建窗口,它只需要一个参数。</span></p>
<p><span style="font-size: 9pt">pMyFrame->LoadFrame(IDR_FRAME);</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">LoadFrame使用该参数从资源中获取许多默认值,包括主边框窗口的标题、图标、菜单、加速键等。但是,在使用LoadFrame时,必须确保标题字符串、图标、菜单、加速键等资源使用同一个ID标识符(在本例中,我们使用IDR_FRAME)。</span><b></p>
<p><span style="font-size: 9pt">提示:</b>在Hello程序的InitInstance中我们看不到创建窗口的过程。实际上,在</span></p>
<p><span style="font-size: 9pt">pDocTemplate = new CSingleDocTemplate(</span></p>
<p><span style="font-size: 9pt">IDR_MAINFRAME,</span></p>
<p><span style="font-size: 9pt">RUNTIME_CLASS(CHelloDoc),</span></p>
<p><span style="font-size: 9pt">RUNTIME_CLASS(CMainFrame), // main SDI frame window</span></p>
<p><span style="font-size: 9pt">RUNTIME_CLASS(CHelloView));</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> AddDocTemplate(pDocTemplate);
程序片段中,我们看到,CSingleDocTemplate构造函数的第二个参数就是IDR_MAINFRAME。在构造函数内部,已经通过调用m_pMainWnd->LoadFrame(IDR_MAINFRAME),完成了应用程序主窗口的创建过程。<br>
在InitInstance中,创建完窗口后,窗口调用ShowWindow成员函数来显示窗口。ShowWindow带一个参数,指示窗口以何种方式显示(最大化、最小化或一般)。缺省方式为SW_SHOW,但实际上我们经常希望应用程序启动时窗口最大化,此时可以将该参数该为SW_SHOWMAXMIZED,即调用</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);</span></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -