?? mfc教程_ mfc對象的創建.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0041)http://www.vczx.com/tutorial/mfc/mfc5.php -->
<HTML><HEAD><TITLE>MFC教程_ MFC對象的創建</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.3354" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff>
<P align=justify>
<LI><A name=_Toc445889035></A><A name=_Toc445782438></A><A
name=_Toc452640914></A><A name=_Toc457298997></A><B>MFC對象的創建</B>
<P></P>
<P
align=justify>前面幾章介紹了MFC的核心概念和思想,即介紹了MFC對Windows對象的封裝方法和特點;MFC對象的動態創建、序列化;MFC消息映射機制。</P>
<P align=justify>現在,考查MFC的應用程序結構體系,即以文檔-視為核心的編程模式。學習本章,應該弄清楚以下問題:</P>
<P align=justify>MFC中諸多MFC對象的關系:應用程序對象,文檔對象,邊框窗口對象,文檔邊框窗口對象,視對象,文檔模板對象等。</P>
<P align=justify>MFC對象的創建和銷毀:由什么對象創建或銷毀什么對象,何時創建,何時銷毀?</P>
<P align=justify>MFC提供了那些接口來支持其編程模式?</P>
<OL>
<P align=justify>
<LI><A name=_Toc445889036></A><A name=_Toc445782439></A><A
name=_Toc452640915></A><A name=_Toc457298998></A><B>MFC對象的關系</B>
<P></P>
<OL>
<P align=justify>
<LI><B><A name=_Toc445889037></A><A name=_Toc445782440></A><A
name=_Toc452640916></A><A name=_Toc457298999></A>創建關系</B>
<P></P><B><IMG height=187 hspace=12 src="MFC教程_ MFC對象的創建.files/image118.gif"
width=288 align=left> </B>
<P
align=justify>這里討論應用程序、文檔模板、邊框窗口、視、文檔等的創建關系。圖5-1大略地表示了創建順序,但表5-1更直接地顯示了創建與被創建的關系。</P>
<P align=justify> </P>
<P align=center>表5-1 MFC對象的創建關系</P>
<TABLE cellSpacing=1 cellPadding=7 width=497 border=1>
<TBODY>
<TR>
<TD vAlign=top width="47%">
<P align=justify>創建者 </P></TD>
<TD vAlign=top width="53%">
<P align=justify>被創建的對象 </P></TD></TR>
<TR>
<TD vAlign=top width="47%">
<P align=justify>應用程序對象 </P></TD>
<TD vAlign=top width="53%">
<P align=justify>文檔模板 </P></TD></TR>
<TR>
<TD vAlign=top width="47%">
<P align=justify>文檔模板 </P></TD>
<TD vAlign=top width="53%">
<P align=justify>文檔 </P></TD></TR>
<TR>
<TD vAlign=top width="47%">
<P align=justify>文檔模板 </P></TD>
<TD vAlign=top width="53%">
<P align=justify>邊框窗口 </P></TD></TR>
<TR>
<TD vAlign=top width="47%">
<P align=justify>邊框窗口 </P></TD>
<TD vAlign=top width="53%">
<P align=justify>視 </P></TD></TR></TBODY></TABLE>
<P align=center> </P>
<P align=justify></P>
<LI><A name=_Toc445889038></A><A name=_Toc445782441></A><A
name=_Toc452640917></A><A name=_Toc457299000></A><B>交互作用關系</B>
<P></P></LI></OL>
<P
align=justify>應用程序對象有一個文檔模板列表,存放一個或多個文檔模板對象;文檔模板對象有一個打開文檔列表,存放一個或多個已經打開的文檔對象;文檔對象有一個視列表,存放顯示該文檔數據的一個或多個視對象;還有一個指針指向創建該文檔的文檔模板對象;視有一個指向其關聯文檔的指針,視是一個子窗口,其父窗口是邊框窗口(或者文檔邊框窗口);文檔邊框窗口有一個指向其當前活動視的指針;文檔邊框窗口是邊框窗口的子窗口。</P>
<P align=justify>Windows 管理所有已經打開的窗口,把消息或事件發送給目標窗口。通常,命令消息發送給主邊框窗口。</P><IMG
height=249 hspace=12 src="MFC教程_ MFC對象的創建.files/image119.gif" width=393
align=left>
<P align=justify>圖5-2大略地表示了上述關系:</P>
<P align=justify></P>
<P align=justify>MFC提供了一些函數來維護這些關系。</P>
<P align=justify>表5-2列出了從一個對象得到相關對象的方法。</P>
<P align=center>表5-2 從一個對象得到另一個對象的方法</P>
<TABLE cellSpacing=1 cellPadding=7 width=497 border=1>
<TBODY>
<TR>
<TD vAlign=top width="29%">
<P align=center>本對象 </P></TD>
<TD vAlign=top width="27%">
<P align=center>要得到的對象 </P></TD>
<TD vAlign=top width="44%">
<P align=justify>使用的成員函數 </P></TD></TR>
<TR>
<TD vAlign=top width="29%" rowSpan=2>
<P align=justify>CDocument對象 </P></TD>
<TD vAlign=top width="27%">
<P align=justify>視列表 </P></TD>
<TD vAlign=top width="44%">
<P align=justify>GetFirstViewPosition</P>
<P align=justify>GetNextView </P></TD></TR>
<TR>
<TD vAlign=top width="27%">
<P align=justify>文檔模板 </P></TD>
<TD vAlign=top width="44%">
<P align=justify>GetDocTemplate </P></TD></TR>
<TR>
<TD vAlign=top width="29%" rowSpan=2>
<P align=justify>CView對象 </P></TD>
<TD vAlign=top width="27%">
<P align=justify>文檔對象 </P></TD>
<TD vAlign=top width="44%">
<P align=justify>GetDocument </P></TD></TR>
<TR>
<TD vAlign=top width="27%">
<P align=justify>邊框窗口 </P></TD>
<TD vAlign=top width="44%">
<P align=justify>GetParentFrame </P></TD></TR>
<TR>
<TD vAlign=top width="29%" rowSpan=2>
<P align=justify>CMDIChildWnd或</P>
<P align=justify>CFrameWnd對象 </P></TD>
<TD vAlign=top width="27%">
<P align=justify>活動視 </P></TD>
<TD vAlign=top width="44%">
<P align=justify>GetActiveView </P></TD></TR>
<TR>
<TD vAlign=top width="27%">
<P align=justify>活動視的文檔 </P></TD>
<TD vAlign=top width="44%">
<P align=justify>GetActiveDocument </P></TD></TR>
<TR>
<TD vAlign=top width="29%">
<P align=justify>CMDIFrameWnd對象 </P></TD>
<TD vAlign=top width="27%">
<P align=justify>活動文檔邊框窗口 </P></TD>
<TD vAlign=top width="44%">
<P align=justify>MDIGetActive </P></TD></TR></TBODY></TABLE>
<P align=center> </P>
<P align=center>表5-3 從一個對象通知另一個對象的方法:</P>
<TABLE cellSpacing=1 cellPadding=7 width=497 border=1>
<TBODY>
<TR>
<TD vAlign=top width="31%">
<P align=justify>本對象 </P></TD>
<TD vAlign=top width="30%">
<P align=justify>要通知的對象/動作 </P></TD>
<TD vAlign=top width="39%">
<P align=justify>使用的成員函數 </P></TD></TR>
<TR>
<TD vAlign=top width="31%">
<P align=justify>CView對象 </P></TD>
<TD vAlign=top width="30%">
<P align=justify>通知文檔更新所有視 </P></TD>
<TD vAlign=top width="39%">
<P align=justify>CDocument::UpdateAllViews </P></TD></TR>
<TR>
<TD vAlign=top width="31%">
<P align=justify>CDocument對象 </P></TD>
<TD vAlign=top width="30%">
<P align=justify>更新一個視 </P></TD>
<TD vAlign=top width="39%">
<P align=justify>CView::OnUpdate </P></TD></TR>
<TR>
<TD vAlign=top width="31%" rowSpan=2>
<P align=justify>CFrameWnd或</P>
<P align=justify>CMDIFrameWnd對象 </P></TD>
<TD vAlign=top width="30%">
<P align=justify>通知一個視為活動視 </P></TD>
<TD vAlign=top width="39%">
<P align=justify>CView::OnActivateView </P></TD></TR>
<TR>
<TD vAlign=top width="30%">
<P align=justify>設置一個視為活動視 </P></TD>
<TD vAlign=top width="39%">
<P align=justify>SetActivateView </P></TD></TR></TBODY></TABLE>
<P align=justify></P>
<P
align=justify>可以通過表5-2得到相關對象,再調用表5-3中相應的函數。例如:視在接受了新數據或者數據被修改之后,使用表5-2中的函數GetDocument得到關聯文檔對象,然后調用表5-3中的文檔函數UpdateAllViews更新其他和文檔對象關聯的視。</P>
<P
align=justify>在表5-2和表5-3中,CView對象指CView或派生類的實例;成員函數列中如果沒有指定類屬,就是第一列對象的類的成員函數。</P>
<P align=justify></P>
<LI><A name=_Toc445889039></A><A name=_Toc445782442></A><A
name=_Toc452640918></A><A name=_Toc457299001></A><B>MFC提供的接口</B>
<P></P>
<P
align=justify>MFC編程就是把一些應用程序特有的東西填入MFC框架。MFC提供了兩種填入的方法:一種就是使用前一章論述的消息映射,消息映射給應用程序的各種對象處理各種消息的機會;另一種就是使用虛擬函數,MFC在實現許多功能或者處理消息、事件的過程中,調用了虛擬函數來完成一些任務,這樣就給了派生類覆蓋這些虛擬函數實現特定處理的機會。</P>
<P
align=justify>下面兩節將列出兩類接口,有兩個目的:一是為了讓讀者獲得整體印象,二是后文將涉及到或者討論其中的許多函數時,不顯得突兀。</P>
<OL>
<P align=justify>
<LI><A name=_Toc445889040></A><A name=_Toc445782443></A><A
name=_Toc452640919></A><A name=_Toc457299002></A><B>虛擬函數接口</B>
<P></P>
<P
align=justify>幾乎每一個MFC類都定義和使用了虛擬成員函數,程序員可以在派生類中覆蓋它們。一般,MFC提供了這些函數的缺省實現,所以覆蓋函數應該調用基類的實現。這里給出一個MFC常用虛擬函數的總覽表(見表5-4),更詳細的信息或它們的缺省實現動作參見MFC文檔。由于基類的虛擬函數被派生類繼承,所以在派生類中不作重復說明。</P>
<P
align=justify>覆蓋基類的虛擬函數可以通過ClassWizard進行,不過,并非所有的函數都可以這樣,有的必須手工加入函數聲明和實現。</P>
<P align=center>表5-4 常見MFC類的虛擬函數接口</P>
<TABLE cellSpacing=1 cellPadding=7 width=497 border=1>
<TBODY>
<TR>
<TD vAlign=top width="23%">
<P align=justify>類 </P></TD>
<TD vAlign=top width="34%">
<P align=justify>虛擬函數 </P></TD>
<TD vAlign=top width="44%">
<P align=justify>覆蓋的目的和功能 </P></TD></TR>
<TR>
<TD vAlign=top width="23%" rowSpan=2>
<P align=justify>CCmdTarget </P></TD>
<TD vAlign=top width="34%">
<P align=justify>OnCmdMsg </P></TD>
<TD vAlign=top width="44%">
<P align=justify>發送、派發命令消息 </P></TD></TR>
<TR>
<TD vAlign=top width="34%">
<P align=justify>OnFinalRelease </P></TD>
<TD vAlign=top width="44%">
<P align=justify>OLE用途,引用為0時作清理工作 </P></TD></TR>
<TR>
<TD vAlign=top width="23%" rowSpan=8>
<P align=justify>CWinThread </P></TD>
<TD vAlign=top width="34%">
<P align=justify>ExitInstance </P></TD>
<TD vAlign=top width="44%">
<P align=justify>在線程退出時作清理工作 </P></TD></TR>
<TR>
<TD vAlign=top width="34%">
<P align=justify>InitInstance </P></TD>
<TD vAlign=top width="44%">
<P align=justify>在線程開始時作初始化 </P></TD></TR>
<TR>
<TD vAlign=top width="34%">
<P align=justify>OnIdle </P></TD>
<TD vAlign=top width="44%">
<P align=justify>執行thread-specific idle-time處理 </P></TD></TR>
<TR>
<TD vAlign=top width="34%">
<P align=justify>PreTranslateMessage </P></TD>
<TD vAlign=top width="44%">
<P align=justify>在消息送給Windows函數TranslateMessage and
DispatchMessage.之前進行消息過濾 </P></TD></TR>
<TR>
<TD vAlign=top width="34%">
<P align=justify>IsIdleMessage </P></TD>
<TD vAlign=top width="44%">
<P align=justify>檢查是否是某個特別的消息 </P></TD></TR>
<TR>
<TD vAlign=top width="34%">
<P align=justify>ProcessWndProcException </P></TD>
<TD vAlign=top width="44%">
<P align=justify>截獲線程消息/命令處理中的例外 </P></TD></TR>
<TR>
<TD vAlign=top width="34%">
<P align=justify>ProcessMessageFilter </P></TD>
<TD vAlign=top width="44%">
<P align=justify>線程消息過濾 </P></TD></TR>
<TR>
<TD vAlign=top width="34%">
<P align=justify>Run </P></TD>
<TD vAlign=top width="44%">
<P align=justify>實現線程特定的消息循環 </P></TD></TR>
<TR>
<TD vAlign=top width="23%" rowSpan=2>
<P align=justify>CWinApp </P></TD>
<TD vAlign=top width="34%">
<P align=justify>HideApplication </P></TD>
<TD vAlign=top width="44%">
<P align=justify>關閉所有的窗口之前隱藏應用程序 </P></TD></TR>
<TR>
<TD vAlign=top width="34%">
<P align=justify>CloseAllDocument </P></TD>
<TD vAlign=top width="44%">
<P align=justify>退出程序之前關閉所有文檔 </P></TD></TR>
<TR>
<TD vAlign=top colSpan=3>
<P align=justify>轉下頁 </P></TD></TR></TBODY></TABLE>
<P align=justify></P>
<P align=justify> </P>
<TABLE cellSpacing=1 cellPadding=7 width=497 border=1>
<TBODY>
<TR>
<TD vAlign=top colSpan=3>
<P align=justify>續表 </P></TD></TR>
<TR>
<TD vAlign=top width="24%" rowSpan=5> </TD>
<TD vAlign=top width="31%">
<P align=justify>SaveModifiedDocument </P></TD>
<TD vAlign=top width="45%">
<P align=justify>框架窗口關閉時用來保存文檔 </P></TD></TR>
<TR>
<TD vAlign=top width="31%">
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -