?? 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 + -