?? chap2_4.htm
字號:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<title>MFC編程</title>
</head>
<body link="#3973DE" alink="#000000" 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="13">
<tr>
<td width="363" bgcolor="#15397D" height="13"></td>
<td width="252" bgcolor="#000000" height="13"><p align="right"></font><small><span
style="text-decoration: none"><a href="../index.htm"><font color="#FFFFFF">電腦報網絡學院Visual
C++網絡教程</font></a></span></small></td>
</tr>
</table>
</center></div><font FACE="Times New Roman" SIZE="3"><p align="center"></font><font
color="#3973DE"><font FACE="Times New Roman" size="4">2.4 MFC</font><font size="4">編程</font></font><font
FACE="Times New Roman" size="4"></p>
<p ALIGN="JUSTIFY"></font><span style="font-size: 9pt">微軟基礎類庫(MFC:Microsoft
Foundation Class)是微軟為Windows程序員提供的一個面向對象的Windows編程接口,它大大簡化了Windows編程工作。使用MFC類庫的好處是:首先,MFC提供了一個標準化的結構,這樣開發人員不必從頭設計創建和管理一個標準Windows應用程序所需的程序,而是“站在巨人肩膀上”,從一個比較高的起點編程,故節省了大量的時間;其次,它提供了大量的代碼,指導用戶編程時實現某些技術和功能。MFC庫充分利用了Microsoft開發人員多年開發Windows程序的經驗,并可以將這些經驗融入到你自己開發的應用程序中去。</span></p>
<p><span style="font-size: 9pt">對用戶來說,用MFC開發的最終應用程序具有標準的、熟悉的Windows界面,這樣的應用程序易學易用;另外,新的應用程序還能立即支持所有標準Windows特性,而且是用普通的、明確定義的形式。事實上,也就是在Windows應用程序界面基礎上定義了一種新的標準——MFC標準。</span></p>
<p><span style="font-size: 9pt">為了更好的理解MFC,我們有必要了解一下MFC的歷史。</span><b></p>
<p></b><span style="font-size: 9pt">2.4.1 MFC歷史</span></p>
<p><span style="font-size: 9pt">開始,Microsoft建立了一個AFX小組,AFX代表Application
Framework,即應用程序框架。據說創建該小組原意是為了發布一個Borland
C++的OWL的競爭性產品,因為那時侯Borland 公司的應用程序框架OWL(object
Windows Language)已經做的相當成功。AFX小組象OWL那樣,提出了一個高度抽象Windows
API的一個類庫。</span></p>
<p><span style="font-size: 9pt">他們采用自頂向下的設計方法,逐步將對象抽象出來,并施加到Windows上。然后,他們試著花了幾個月時間用這個類庫來編寫應用程序,結果發現這個類庫偏離Windows
API實在太遠,過分抽象并沒有太大的實用性,相反大大降低了應用程序的效率。</span></p>
<p><span style="font-size: 9pt">于是,他們干脆放棄了整個AFX類庫,對類庫進行重新設計。這次,他們采用了自底向上的方法,從已有的Windows
API著手,將類建立在Windows API對象基礎上,設計出后來成為MFC1.0的一個類庫。但是,你現在仍然可以看到AFX時期的痕跡,許多源程序文件有afx前綴,如afxabort.cpp,afxmem.cpp。MFC延用了許多AFX類庫的宏,因此我們經常會看到以AFX開頭的宏。</span></p>
<p><span style="font-size: 9pt">AFX小組實際上做了兩件工作:MFC類庫和對MFC的IDE支持(即資源編譯器和操作向導)。在1994年4月份之后,AFX的名字停止使用,該小組成員成為Visual
C++開發組的一部分,即現在的MFC小組。</span></p>
<p><span style="font-size: 9pt">MFC1.0版于1992年同Microsoft C/C++7.0同時發布。它提供了對Windows
API簡單的抽象和封裝,還沒有我們現在常用的文檔/視結構特性。但它引入了CObject,通過CArchive的持續化和其他一些MFC中仍然使用的特性,從而奠定了MFC的基礎。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">MFC2.0在MFC1.0基礎上增加了文檔/視結構框架、OLE1.0類、消息映射和公用對話框類,廢棄了1.0版中的CModalDialog類并將它的功能移入到CDialog中,并增加了工具條、對話條、分割視窗的支持。MFC2.1隨同Visual
C++ 1.1 for NT發布,它把MFC2.0移植到了Win32上。MFC2.5隨同Visual C++1.5一起發布,它引入了OLE
2.0和ODBC類。它是最后的官方的16位發行版,于93年12月發布。目前,在開發16位Windows程序時,Visual
C++1.5和MFC 2.5仍然有大量的用戶。隨后的MFC2.51、2.52糾正了MFC.25中的一些錯誤,增加了標簽式對話框、WinSock和MAPI(Microsoft
電子郵件應用程序接口)支持。MFC3.1同Visual C++2.1一起于1995年1月份發布,它引入了Windows95公共控件(包括動畫、熱鍵、圖象列表、工具條提示等等)。MFC4.0于1995年12月份同Visual
C++4.0一起發布。Microsoft直接從Visual C++2.0一下子跳過一個版本號,升級到了4.0,以保持MFC版本號和Visual
C++版本號的一致性,但這種一致性又在Visual C++5.0中打破了。在MFC4.0中增加了CSynchronize,CMutex,CEvent,CMultiLock,CShellNew以更好的支持多線程以及Windows
95的其他一些特性。Visual C++還引入了Component Gallery(組件畫廊)、STL支持和大量的新特性。MFC4.1最重要的特性是支持Win32s。許多MFC開發者一直都在使用該版本。MFC4.1修正了4.0的一些錯誤并增加了Internet特性。MFC4.2增加了ISAPI和OCX容器支持。</span></p>
<p><span style="font-size: 9pt">MFC4.21于1997年3月19日同Visual C++5.0一起發布,它是目前最新和最完善的MFC版本。它只增加了對微軟的IntelliMouse(智能鼠標器)的支持?,F在MFC版本號又不與Visual
C++匹配了。</span></p>
<p><span style="font-size: 9pt">MFC發行版列表如下:</span><b></p>
<p><span style="font-size: 9pt">MFC Release MSVC Release 16位或32位 備注 </span></b></p>
<p><span style="font-size: 9pt">1.0 16 簡單的 封裝Windows</span></p>
<p><span style="font-size: 9pt">2.0 1.0 16 增加了文檔/視結構</span></p>
<p><span style="font-size: 9pt">2.1 1.1 for NT 32 第一個NT的發行版 </span></p>
<p><span style="font-size: 9pt">2.5 1.5 16 OLE/ODBC,最后一個</span></p>
<p><span style="font-size: 9pt">16位版本</span></p>
<p><span style="font-size: 9pt">2.51 2.0 16 修正錯誤 </span></p>
<p><span style="font-size: 9pt">2.52 2.1 16 增加標簽式對話框</span></p>
<p><span style="font-size: 9pt">2.52b 2.2 16</span></p>
<p><span style="font-size: 9pt">2.5c 4.0 16</span></p>
<p><span style="font-size: 9pt">3.0 2.0 32 標簽式對話框、可停泊工具條</span></p>
<p><span style="font-size: 9pt">3.1 2.1 32 Winsock/MAPI, Windows公共控 制 </span></p>
<p><span style="font-size: 9pt">3.2 2.2 32</span></p>
<p><span style="font-size: 9pt">4.0 4.0 32 Win 95, 線程類, OCX 容器 </span></p>
<p><span style="font-size: 9pt">4.1 4.1 32 sweeper (WinInet) classes</span></p>
<p><span style="font-size: 9pt">**以上是最后支持Win32s的版本</span></p>
<p><span style="font-size: 9pt">4.2 4.2 32 修正錯誤, ISAPI classes</span></p>
<p> </p>
<p> </p>
<p><span style="font-size: 9pt">4.2b internet dl 32 修正錯誤</span></p>
<p><span style="font-size: 9pt">4.21 5.0 32 IntelliMouse&trade; support.</span></p>
<p> </p>
<b><p></b><span style="font-size: 9pt"><font color="#3973DE">2.4.2 MFC類庫概念和組成</font></span></p>
<p><span style="font-size: 9pt">類庫是一個可以在應用中使用的相互關聯的C++類的集合。類庫有些隨編譯器提供,如Borland
C++ Turbo Vision等;有的是由其他軟件公司銷售,如用于數據庫開發的CodeBase;有的則是由用戶自己開發的。比如圖象處理類庫完成圖象顯示、格式轉換、量化等;串行通信類庫用于支持串行口輸入輸出。有些情況下用戶可以直接利用類庫中包含的類定義應用程序所需的變量,有時則需要從類庫所提供的類中派生出新的類,這依賴于類庫的設計和具體的應用程序。</span></p>
<p><span style="font-size: 9pt">Microsoft提供了一個基礎類庫MFC,其中包含用來開發C++和C++
Windows應用程序的一組類?;A類庫的核心是以C++形式封裝了大部分的Windows
API。類庫表示窗口、對話框、設備上下文、公共GDI對象如畫筆、調色板、控制框和其他標準的Windows部件。這些類提供了一個面向Windows中結構的簡單的C++成員函數的接口。</span></p>
<p><span style="font-size: 9pt">MFC可分為兩個主要部分:(1)基礎類(2)宏和全程函數。</span></p>
<p> </p>
<p><b> </p>
<p><span style="font-size: 9pt">MFC基礎類</span></b></p>
<p><span style="font-size: 9pt">MFC中的類按功能來分可劃分為以下幾類:</span></p>
<blockquote>
<p><span style="font-size: 9pt">基類</span></p>
<p><span style="font-size: 9pt">應用程序框架類</span></p>
<p><span style="font-size: 9pt">應用程序類</span></p>
<p><span style="font-size: 9pt">命令相關類</span></p>
<p><span style="font-size: 9pt">文檔/視類</span></p>
<p><span style="font-size: 9pt">線程類</span></p>
<p><span style="font-size: 9pt">可視對象類</span></p>
<p><span style="font-size: 9pt">窗口類</span></p>
<p><span style="font-size: 9pt">視類</span></p>
<p><span style="font-size: 9pt">對話框類</span></p>
<p><span style="font-size: 9pt">屬性表 </span></p>
<p><span style="font-size: 9pt">控制類</span></p>
<p><span style="font-size: 9pt">菜單類</span></p>
<p><span style="font-size: 9pt">設備描述表</span></p>
<p><span style="font-size: 9pt">繪畫對象類</span></p>
<p><span style="font-size: 9pt">通用類</span></p>
<p><span style="font-size: 9pt">文件</span></p>
<p><span style="font-size: 9pt">診斷</span></p>
<p><span style="font-size: 9pt">異常</span></p>
<p><span style="font-size: 9pt">收集</span></p>
<p><span style="font-size: 9pt">模板收集</span></p>
<p><span style="font-size: 9pt">其他支持類</span></p>
<p><span style="font-size: 9pt">OLE2類</span></p>
<p><span style="font-size: 9pt">OLE基類</span></p>
<p><span style="font-size: 9pt">OLE可視編輯包裝程序類</span></p>
<p><span style="font-size: 9pt">OLE 可視編輯服務器程序類</span></p>
<p><span style="font-size: 9pt">OLE數據傳輸類</span></p>
<p><span style="font-size: 9pt">OLE對話框類</span></p>
<p><span style="font-size: 9pt">其他OLE類</span></p>
<p><span style="font-size: 9pt">數據庫類</span></p>
<b>
</blockquote>
<p> </p>
<p><span style="font-size: 9pt">宏和全局函數</span></b></p>
<p><span style="font-size: 9pt">若某個函數或變量不是某個類的一個成員,那么它是一個全程函數或變量。</span></p>
<p><span style="font-size: 9pt">Microsoft基本宏和全程函數提供以下功能:</span></p>
<blockquote>
<blockquote>
<p><span style="font-size: 9pt">數據類型</span></p>
<p><span style="font-size: 9pt">運行時刻對象類型服務</span></p>
<p><span style="font-size: 9pt">診斷服務</span></p>
<p><span style="font-size: 9pt">異常處理</span></p>
<p><span style="font-size: 9pt">CString格式化及信息框顯示</span></p>
<p><span style="font-size: 9pt">消息映射</span></p>
<p><span style="font-size: 9pt">應用消息和管理</span></p>
<p><span style="font-size: 9pt">對象連接和嵌入(OLE)服務</span></p>
<p><span style="font-size: 9pt">標準命令和Windows IDs</span></p>
</blockquote>
</blockquote>
<p><b> </p>
<p><span style="font-size: 9pt">約定</b>:全程函數以“Afx”為前綴,所有全程變量都是以“afx”為前綴,宏不帶任何特別前綴,但是全部大寫。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">常見的全局函數和宏有:AfxGetApp,AfxGetMainWnd,AfxMessageBox,DEBUG_NEW等,我們會在后面的章節中用到并對它們進行介紹。</span></p>
<p><span style="font-size: 9pt">從繼承關系來看,又可將MFC中的類分成兩大類:大多數的MFC類是從CObject繼承下來;另外一些類則不是從CObject類繼承下來,這些類包括:字符串類CString,日期時間類CTime,矩形類CRect,點CPoint等,它們提供程序輔助功能。</span></p>
<p><span style="font-size: 9pt">由于MFC中大部分類是從CObject繼承下來的,CObject類描述了幾乎所有的MFC中其他類的一些公共特性,因此我們有必要理解CObject類。
</span></p>
<p><span style="font-size: 9pt">我們首先查看一下CObject類的定義,CObject類定義如下清單2.1所示:</span></p>
<p><b> </p>
<p><span style="font-size: 9pt">清單2.1CObject類的定義</span></b></p>
<p><span style="font-size: 9pt">// class CObject is the root of all compliant objects</span></p>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -