?? chap3_5.htm
字號(hào):
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 在MainFrm.cpp中,我們還看到CMainFrame類有一個(gè)OnCreate方法。OnCreate成員函數(shù)定義如清單3.3。當(dāng)調(diào)用Create或CreateEx時(shí),操作系統(tǒng)會(huì)向窗口發(fā)送一條WM_CREATE消息。這一函數(shù)就是用來響應(yīng)WM_CREATE消息的。</span><b></p>
<p><span style="font-size: 9pt">清單3.3 OnCreate成員函數(shù)定義</span></b></p>
<p><span style="font-size: 9pt">int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)</span></p>
<p><span style="font-size: 9pt">{</span></p>
<p><span style="font-size: 9pt">if (CFrameWnd::OnCreate(lpCreateStruct) == -1)</span></p>
<p><span style="font-size: 9pt">return -1;</span></p>
<p><span style="font-size: 9pt"> </span></p>
<p><span style="font-size: 9pt">if (!m_wndToolBar.Create(this) ||</span></p>
<p><span style="font-size: 9pt">!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))</span></p>
<p><span style="font-size: 9pt">{</span></p>
<p><span style="font-size: 9pt">TRACE0("Failed to create toolbar\n");</span></p>
<p><span style="font-size: 9pt">return -1; // fail to create</span></p>
<p><span style="font-size: 9pt">}</span></p>
<p><span style="font-size: 9pt">if (!m_wndStatusBar.Create(this) ||</span></p>
<p><span style="font-size: 9pt">!m_wndStatusBar.SetIndicators(indicators,</span></p>
<p><span style="font-size: 9pt">sizeof(indicators)/sizeof(UINT)))</span></p>
<p><span style="font-size: 9pt">{</span></p>
<p><span style="font-size: 9pt">TRACE0("Failed to create status bar\n");</span></p>
<p><span style="font-size: 9pt">return -1; // fail to create</span></p>
<p><span style="font-size: 9pt">}</span></p>
<p><span style="font-size: 9pt">// TODO: Remove this if you don't want tool tips or a
resizeable toolbar</span></p>
<p><span style="font-size: 9pt">m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |</span></p>
<p><span style="font-size: 9pt">CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);</span></p>
<p><span style="font-size: 9pt">// TODO: Delete these three lines if you don't want the
toolbar to</span></p>
<p><span style="font-size: 9pt">// be dockable</span></p>
<p><span style="font-size: 9pt">m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);</span></p>
<p><span style="font-size: 9pt">EnableDocking(CBRS_ALIGN_ANY);</span></p>
<p><span style="font-size: 9pt">DockControlBar(&m_wndToolBar);</span></p>
<p><span style="font-size: 9pt">return 0;</span></p>
<p><span style="font-size: 9pt">}</span></p>
<p><span style="font-size: 9pt"> 在OnCreate函數(shù)中,首先調(diào)用CFrameWnd的缺省處理方法OnCreate完成窗口創(chuàng)建工作。后面是應(yīng)用程序主窗口的特定工作,在上面程序中,創(chuàng)建了工具條和狀態(tài)欄(有關(guān)工具條和狀態(tài)欄編程參見下一章有關(guān)內(nèi)容)。可以在此處加入一些初始化工作,如從INI文件中載入設(shè)置,顯示Splash
Window(啟動(dòng)畫面)等。 </span></p>
<b><p></b><span style="font-size: 9pt"><font color="#3973DE">3.5.3 注冊窗口</font></span></p>
<p><span style="font-size: 9pt"> 在傳統(tǒng)的Windows C程序中,送給一個(gè)窗口的所有消息是在它的窗口函數(shù)中處理的。把一個(gè)窗口同它的窗口函數(shù)聯(lián)系起來的過程稱為注冊窗口類。注冊窗口包括對窗口指定一個(gè)窗口函數(shù)(給出窗口函數(shù)的指針)以及設(shè)定窗口的光標(biāo)、背景刷子等內(nèi)容。一個(gè)注冊窗口類可以被多個(gè)窗口共享。注冊窗口通過調(diào)用API函數(shù)RegisterClass來完成。<br>
在MFC下,框架提供了缺省的自動(dòng)窗口注冊過程。框架仍然使用傳統(tǒng)的注冊類,而且提供了幾個(gè)標(biāo)準(zhǔn)的注冊類,它們在標(biāo)準(zhǔn)的應(yīng)用程序初始化函數(shù)中注冊。調(diào)用AfxRegisterWndClass全局函數(shù)就可以注冊附加的窗口類,然后把已經(jīng)注冊的類傳給CWnd的Create成員函數(shù)。用戶可以定制自己的注冊過程,以提供一些附加的特性。比如設(shè)置窗口的圖標(biāo)、背景、光標(biāo)等。下面是注冊窗口的例子。</span></p>
<p><span style="font-size: 9pt">BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)</span></p>
<p><span style="font-size: 9pt">{</span></p>
<p><span style="font-size: 9pt">// TODO: Modify the Window class or styles here by
modifying</span></p>
<p><span style="font-size: 9pt">// the CREATESTRUCT cs</span></p>
<p><span style="font-size: 9pt">UINT ClassStyle=CS_VREDRAW|CS_HREDRAW;</span></p>
<p><span style="font-size: 9pt">cs.style=cs.style&(~FWS_ADDTOTITLE);</span></p>
<p><span style="font-size: 9pt">cs.lpszClass = AfxRegisterWndClass(ClassStyle,</span></p>
<p><span style="font-size: 9pt">AfxGetApp()->LoadStandardCursor(IDC_ARROW), </span></p>
<p><span style="font-size: 9pt">(HBRUSH)(COLOR_WINDOW+1),//for brush</span></p>
<p><span style="font-size: 9pt">AfxGetApp()->LoadIcon(IDR_MAINFRAME));</span></p>
<p><span style="font-size: 9pt">return TRUE;</span></p>
<p><span style="font-size: 9pt">}</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 注冊窗口在CFrameWnd的PreCreateWnd方法中完成。從成員函數(shù)名字PreCreateWindow中就可以看出來,注冊窗口的工作必須在調(diào)用Create函數(shù)創(chuàng)建窗口之前完成。其中cs.style=cs.style&(~FWS_ADDTOTITLE)指定窗口標(biāo)題風(fēng)格,關(guān)閉自動(dòng)添加文檔標(biāo)題的功能。AfxRegisterWndClass指定窗口使用箭頭光標(biāo)、背景刷子使用比窗口顏色標(biāo)號(hào)大一的顏色、圖標(biāo)使用IDR_MAINFRAME標(biāo)識(shí)符指定的圖標(biāo)(當(dāng)然也可以使用其它圖標(biāo))。用上面的程序段替換Hello程序MainFrm.cpp中的PreCreateWindow成員函數(shù)定義,并重新編譯和運(yùn)行程序。此時(shí),窗口標(biāo)題變成了Hello,原來令人討厭的“Untitled-”沒有了,因?yàn)榇翱陲L(fēng)格中關(guān)閉自動(dòng)添加當(dāng)前文件名的風(fēng)格。</span><b></p>
<p></b><span style="font-size: 9pt"><font color="#3973DE">3.5.4 關(guān)閉和銷毀窗口</font></span></p>
<p><span style="font-size: 9pt"> 框架窗口不僅維護(hù)窗口的創(chuàng)建,還管理著窗口的關(guān)閉和銷毀過程。關(guān)閉窗口時(shí),操作系統(tǒng)依次向被關(guān)閉的窗口發(fā)送WM_CLOSE和WM_DESTROY消息。WM_CLOSE消息的缺省處理函數(shù)OnClose將調(diào)用DestroyWindow,來銷毀窗口;最后,框架調(diào)用窗口的析構(gòu)函數(shù)作清理工作并刪除C++窗口對象。<br>
不要使用C++的delete操作符來銷毀框架窗口,而應(yīng)當(dāng)采用CWnd的DestroyWindow成員函數(shù)來銷毀。DestroyWindow首先刪除子窗口,再刪除窗口本身。若窗口以變量方式產(chǎn)生(即在堆棧上分配內(nèi)存),該窗口對象會(huì)被自動(dòng)清除。若對象是用new操作符創(chuàng)建的(也就是在堆上分配內(nèi)存的),則需要用戶自己處理。有關(guān)DestroyWindow問題在第五章對話框技術(shù)中還要作進(jìn)一步解釋。</span></p>
<p><span style="font-size: 9pt">OnClose()常用功能:保存窗口的一些狀態(tài)、工具條狀態(tài),提示保存未保存的數(shù)據(jù)等等。</span></p>
<p><span style="font-size: 9pt">void CMainFrame::OnClose()</span></p>
<p><span style="font-size: 9pt">{</span></p>
<p><span style="font-size: 9pt">SaveBarState( "MyDockState" );//保存工具條狀態(tài)</span></p>
<p><span style="font-size: 9pt">CFrameWnd::OnClose();</span></p>
<p><span style="font-size: 9pt">}</span></p>
<b><p></b><span style="font-size: 9pt"><font color="#3973DE">3.5.5 窗口激活</font></span></p>
<p><span style="font-size: 9pt"> 活動(dòng)窗口必定是一個(gè)沒有父窗口的頂層窗口,包括框架窗口和對話框。當(dāng)頂層窗口被激活時(shí),Windows向窗口發(fā)送WM_ACTIVATE消息,對此消息的缺省處理是將活動(dòng)窗口設(shè)為有輸入焦點(diǎn)。<br>
輸入焦點(diǎn)用于表示哪個(gè)窗口有資格接收鍵盤輸入消息。帶有輸入焦點(diǎn)的窗口或是一個(gè)活動(dòng)窗口,或者是該活動(dòng)窗口的子窗口。當(dāng)一個(gè)頂層窗口獲得輸入焦點(diǎn)時(shí),Windows向該窗口發(fā)送WM_SETFOCUS消息,此窗口可將輸入焦點(diǎn)重定位到它的子窗口上。子窗口不會(huì)自動(dòng)獲得輸入焦點(diǎn)。失去輸入焦點(diǎn)的窗口會(huì)收到WM_KILLFOCUS消息。當(dāng)子窗口擁有輸入焦點(diǎn)時(shí),父窗口就不會(huì)處理鍵盤輸入了。</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_4.htm">上一頁</a></span></td>
<td><p align="right"><span style="font-size: 9pt"><a href="chap3_6.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>協(xié)助制作<br>
未經(jīng)許可,請勿以任何形式復(fù)制</font></td>
<b>
</tr>
</table>
</center></div></b>
</body>
</html>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -