?? chap3_4.htm
字號:
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">AfxWinTerm();</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">return nReturnCode;</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 應用程序執行時,Windows自動調用應用程序框架內部的WinMain函數。如清單3-1所示,WinMain函數會查找該應用程序的一個全局構造對象,這個對象是由CWinApp派生類構造的,有且只有一個。它是一個全局對象,因此在程序啟動時,它就已經被構造好了。<br>
隨后,WinMain將調用這個對象的InitApplication和InitInstance成員函數,完成應用程序實例的初<br>
始化工作。隨后,WinMain調用Run成員函數,運行應用程序的消息循環。在程序結束時,WinMain調用AfxWinTerm函數,做一些清理工作。</span></p>
<b><p ALIGN="JUSTIFY"></b><span style="font-size: 9pt"><font color="#3973DE">3.4.2
應用程序類</font></span></p>
<b><p ALIGN="JUSTIFY"></b><span style="font-size: 9pt"> 每個應用程序必須從CWinApp派生出自己的應用程序類,并定義一個全局的對象。該應用程序類包含了Windows下應用程序的初始化、運行和結束過程。基于框架建立的應用程序必須有一個(且只能有一個)從CWinApp派生的類的對象。在Hello程序中,我們從CWinApp中派生出一個CHelloApp類,并定義了一個全局對象theApp。CHelloApp類在hello.cpp中定義。<br>
要訪問應用程序類構造的對象,可以調用全局函數AfxGetApp()。AfxGetApp()返回一個指向全局對象的指針。可以通過對它進行強制類型轉換,轉換為我們派生的應用程序類。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">比如:</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">CHelloApp* pApp=(CHelloApp*)AfxGetApp();</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 在CHelloApp應用程序類中,我們還重載了CWinApp的成員函數InitInstance。InitInstance函數主要完成以下工作:設置注冊數據庫,載入標準設置(最近打開文件列表等)、注冊文檔模板。其中注冊文檔模板過程中隱含地創建了主窗口。接著,處理命令行參數,顯示窗口,然后返回、進入消息循環。下面的程序清單3.2給出了Hello程序的InitInstance函數代碼。</span></p>
<p ALIGN="JUSTIFY"><b><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">清單3.2 InitInstance函數</span></b></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// CHelloApp initialization</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">BOOL CHelloApp::InitInstance()</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">AfxEnableControlContainer();</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// Standard initialization</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// If you are not using these features and
wish to reduce the size</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// of your final executable, you should
remove from the following</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// the specific initialization routines
you do not need.</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">#ifdef _AFXDLL</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">Enable3dControls(); // Call this when
using MFC in a shared DLL</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">#else</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">Enable3dControlsStatic(); // Call this
when linking to MFC statically</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">#endif</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// Change the registry key under which our
settings are stored.</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// You should modify this string to be
something appropriate</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// such as the name of your company or
organization.</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">SetRegistryKey(_T("Local
AppWizard-Generated Applications"));</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">LoadStdProfileSettings(); // Load standard
INI file options (including MRU)</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// Register the application's document
templates. Document templates</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// serve as the connection between
documents, frame windows and views.</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">CSingleDocTemplate* pDocTemplate;</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">pDocTemplate = new CSingleDocTemplate(</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">IDR_MAINFRAME,</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">RUNTIME_CLASS(CHelloDoc),</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">RUNTIME_CLASS(CMainFrame), // main SDI
frame window</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">RUNTIME_CLASS(CHelloView));</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">AddDocTemplate(pDocTemplate);</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// Parse command line for standard shell
commands, DDE, file open</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">CCommandLineInfo cmdInfo;</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">ParseCommandLine(cmdInfo);</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// Dispatch commands specified on the
command line</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">if (!ProcessShellCommand(cmdInfo))</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">return FALSE;</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// The one and only window has been
initialized, so show and update it.</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">m_pMainWnd->ShowWindow(SW_SHOW);</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">m_pMainWnd->UpdateWindow();</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">return TRUE;</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 在CWinApp的派生類中,必須重載InitInstance函數,因為CWinApp并不知道應用程序需要什么樣的窗口,它可以多文檔窗口、單文檔窗口,也可以是基于對話框的。</span></p>
<b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">Run成員函數<br>
</b>WinMain在初始化應用程序實例后,就調用Run函數來處理消息循環。Run成員函數不斷執行消息循環,檢查消息隊列中有沒有消息。如果有消息,Run將其派遣,交由框架去處理,然后返回繼續消息循環。如果沒有消息,Run將調用OnIdle來做用戶或框架可能需要在空閑時才做的工作,象后面我們講到的用戶接口更新消息處理等。如果既沒有消息要處理,也沒有空閑時的處理工作要做,則應用程序將一直等待,直到有事件發生。當應用程序結束時,Run將調用ExitInstance。消息循環的流程圖如圖3-10所示。</span><b></p>
</b><p ALIGN="center"><span style="font-size: 9pt"><img src="T3_10.gif"
alt="T3_10.tif (197232 bytes)" WIDTH="338" HEIGHT="436"></span></p>
<p ALIGN="CENTER"><span style="font-size: 9pt">圖3-10 Run成員函數的消息循環</span></p>
<p ALIGN="CENTER"><b><span style="font-size: 9pt"> </span></p>
<p><span style="font-size: 9pt">關閉應用程序</span></p>
<p></b><span style="font-size: 9pt"> 用戶可以通過選擇File-Exit菜單或點主窗口的關閉按鈕,關閉主框架窗口,來終止應用程序。此時,應用程序類首先刪除m_pMainWnd主框架窗口對象,然后退出Run函數,進而退出WinMain,在退出WinMain后刪除TheApp對象。</span></p>
<div align="center"><center><table border="0" cellpadding="0" cellspacing="0" width="615">
<tr>
<td><span style="font-size: 9pt"><a href="chap3_3.htm">上一頁</a></span></td>
<td><p align="right"><span style="font-size: 9pt"><a href="chap3_5.htm">下一頁</a></span></td>
</tr>
</table>
</center></div><font SIZE="5"><hr noshade color="#3973DE" size="1">
<p align="center"></font><font size="2" color="#000000">本教程由<a
href="http://vcdynasty.yeah.net">Visual C++王朝(Where programmers come together)</a>協助制作<br>
未經許可,請勿以任何形式復制</font></td>
<b>
</tr>
</table>
</center></div></b>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -