?? chap2_4.htm
字號(hào):
<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">電腦報(bào)網(wǎng)絡(luò)學(xué)院Visual
C++網(wǎng)絡(luò)教程</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">微軟基礎(chǔ)類庫(kù)(MFC:Microsoft
Foundation Class)是微軟為Windows程序員提供的一個(gè)面向?qū)ο蟮腤indows編程接口,它大大簡(jiǎn)化了Windows編程工作。使用MFC類庫(kù)的好處是:首先,MFC提供了一個(gè)標(biāo)準(zhǔn)化的結(jié)構(gòu),這樣開(kāi)發(fā)人員不必從頭設(shè)計(jì)創(chuàng)建和管理一個(gè)標(biāo)準(zhǔn)Windows應(yīng)用程序所需的程序,而是“站在巨人肩膀上”,從一個(gè)比較高的起點(diǎn)編程,故節(jié)省了大量的時(shí)間;其次,它提供了大量的代碼,指導(dǎo)用戶編程時(shí)實(shí)現(xiàn)某些技術(shù)和功能。MFC庫(kù)充分利用了Microsoft開(kāi)發(fā)人員多年開(kāi)發(fā)Windows程序的經(jīng)驗(yàn),并可以將這些經(jīng)驗(yàn)融入到你自己開(kāi)發(fā)的應(yīng)用程序中去。</span></p>
<p><span style="font-size: 9pt">對(duì)用戶來(lái)說(shuō),用MFC開(kāi)發(fā)的最終應(yīng)用程序具有標(biāo)準(zhǔn)的、熟悉的Windows界面,這樣的應(yīng)用程序易學(xué)易用;另外,新的應(yīng)用程序還能立即支持所有標(biāo)準(zhǔn)Windows特性,而且是用普通的、明確定義的形式。事實(shí)上,也就是在Windows應(yīng)用程序界面基礎(chǔ)上定義了一種新的標(biāo)準(zhǔn)——MFC標(biāo)準(zhǔn)。</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">開(kāi)始,Microsoft建立了一個(gè)AFX小組,AFX代表Application
Framework,即應(yīng)用程序框架。據(jù)說(shuō)創(chuàng)建該小組原意是為了發(fā)布一個(gè)Borland
C++的OWL的競(jìng)爭(zhēng)性產(chǎn)品,因?yàn)槟菚r(shí)侯Borland 公司的應(yīng)用程序框架OWL(object
Windows Language)已經(jīng)做的相當(dāng)成功。AFX小組象OWL那樣,提出了一個(gè)高度抽象Windows
API的一個(gè)類庫(kù)。</span></p>
<p><span style="font-size: 9pt">他們采用自頂向下的設(shè)計(jì)方法,逐步將對(duì)象抽象出來(lái),并施加到Windows上。然后,他們?cè)囍藥讉€(gè)月時(shí)間用這個(gè)類庫(kù)來(lái)編寫(xiě)應(yīng)用程序,結(jié)果發(fā)現(xiàn)這個(gè)類庫(kù)偏離Windows
API實(shí)在太遠(yuǎn),過(guò)分抽象并沒(méi)有太大的實(shí)用性,相反大大降低了應(yīng)用程序的效率。</span></p>
<p><span style="font-size: 9pt">于是,他們干脆放棄了整個(gè)AFX類庫(kù),對(duì)類庫(kù)進(jìn)行重新設(shè)計(jì)。這次,他們采用了自底向上的方法,從已有的Windows
API著手,將類建立在Windows API對(duì)象基礎(chǔ)上,設(shè)計(jì)出后來(lái)成為MFC1.0的一個(gè)類庫(kù)。但是,你現(xiàn)在仍然可以看到AFX時(shí)期的痕跡,許多源程序文件有afx前綴,如afxabort.cpp,afxmem.cpp。MFC延用了許多AFX類庫(kù)的宏,因此我們經(jīng)常會(huì)看到以AFX開(kāi)頭的宏。</span></p>
<p><span style="font-size: 9pt">AFX小組實(shí)際上做了兩件工作:MFC類庫(kù)和對(duì)MFC的IDE支持(即資源編譯器和操作向?qū)?。在1994年4月份之后,AFX的名字停止使用,該小組成員成為Visual
C++開(kāi)發(fā)組的一部分,即現(xiàn)在的MFC小組。</span></p>
<p><span style="font-size: 9pt">MFC1.0版于1992年同Microsoft C/C++7.0同時(shí)發(fā)布。它提供了對(duì)Windows
API簡(jiǎn)單的抽象和封裝,還沒(méi)有我們現(xiàn)在常用的文檔/視結(jié)構(gòu)特性。但它引入了CObject,通過(guò)CArchive的持續(xù)化和其他一些MFC中仍然使用的特性,從而奠定了MFC的基礎(chǔ)。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">MFC2.0在MFC1.0基礎(chǔ)上增加了文檔/視結(jié)構(gòu)框架、OLE1.0類、消息映射和公用對(duì)話框類,廢棄了1.0版中的CModalDialog類并將它的功能移入到CDialog中,并增加了工具條、對(duì)話條、分割視窗的支持。MFC2.1隨同Visual
C++ 1.1 for NT發(fā)布,它把MFC2.0移植到了Win32上。MFC2.5隨同Visual C++1.5一起發(fā)布,它引入了OLE
2.0和ODBC類。它是最后的官方的16位發(fā)行版,于93年12月發(fā)布。目前,在開(kāi)發(fā)16位Windows程序時(shí),Visual
C++1.5和MFC 2.5仍然有大量的用戶。隨后的MFC2.51、2.52糾正了MFC.25中的一些錯(cuò)誤,增加了標(biāo)簽式對(duì)話框、WinSock和MAPI(Microsoft
電子郵件應(yīng)用程序接口)支持。MFC3.1同Visual C++2.1一起于1995年1月份發(fā)布,它引入了Windows95公共控件(包括動(dòng)畫(huà)、熱鍵、圖象列表、工具條提示等等)。MFC4.0于1995年12月份同Visual
C++4.0一起發(fā)布。Microsoft直接從Visual C++2.0一下子跳過(guò)一個(gè)版本號(hào),升級(jí)到了4.0,以保持MFC版本號(hào)和Visual
C++版本號(hào)的一致性,但這種一致性又在Visual C++5.0中打破了。在MFC4.0中增加了CSynchronize,CMutex,CEvent,CMultiLock,CShellNew以更好的支持多線程以及Windows
95的其他一些特性。Visual C++還引入了Component Gallery(組件畫(huà)廊)、STL支持和大量的新特性。MFC4.1最重要的特性是支持Win32s。許多MFC開(kāi)發(fā)者一直都在使用該版本。MFC4.1修正了4.0的一些錯(cuò)誤并增加了Internet特性。MFC4.2增加了ISAPI和OCX容器支持。</span></p>
<p><span style="font-size: 9pt">MFC4.21于1997年3月19日同Visual C++5.0一起發(fā)布,它是目前最新和最完善的MFC版本。它只增加了對(duì)微軟的IntelliMouse(智能鼠標(biāo)器)的支持。現(xiàn)在MFC版本號(hào)又不與Visual
C++匹配了。</span></p>
<p><span style="font-size: 9pt">MFC發(fā)行版列表如下:</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 簡(jiǎn)單的 封裝Windows</span></p>
<p><span style="font-size: 9pt">2.0 1.0 16 增加了文檔/視結(jié)構(gòu)</span></p>
<p><span style="font-size: 9pt">2.1 1.1 for NT 32 第一個(gè)NT的發(fā)行版 </span></p>
<p><span style="font-size: 9pt">2.5 1.5 16 OLE/ODBC,最后一個(gè)</span></p>
<p><span style="font-size: 9pt">16位版本</span></p>
<p><span style="font-size: 9pt">2.51 2.0 16 修正錯(cuò)誤 </span></p>
<p><span style="font-size: 9pt">2.52 2.1 16 增加標(biāo)簽式對(duì)話框</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 標(biāo)簽式對(duì)話框、可停泊工具條</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 修正錯(cuò)誤, ISAPI classes</span></p>
<p> </p>
<p> </p>
<p><span style="font-size: 9pt">4.2b internet dl 32 修正錯(cuò)誤</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類庫(kù)概念和組成</font></span></p>
<p><span style="font-size: 9pt">類庫(kù)是一個(gè)可以在應(yīng)用中使用的相互關(guān)聯(lián)的C++類的集合。類庫(kù)有些隨編譯器提供,如Borland
C++ Turbo Vision等;有的是由其他軟件公司銷售,如用于數(shù)據(jù)庫(kù)開(kāi)發(fā)的CodeBase;有的則是由用戶自己開(kāi)發(fā)的。比如圖象處理類庫(kù)完成圖象顯示、格式轉(zhuǎn)換、量化等;串行通信類庫(kù)用于支持串行口輸入輸出。有些情況下用戶可以直接利用類庫(kù)中包含的類定義應(yīng)用程序所需的變量,有時(shí)則需要從類庫(kù)所提供的類中派生出新的類,這依賴于類庫(kù)的設(shè)計(jì)和具體的應(yīng)用程序。</span></p>
<p><span style="font-size: 9pt">Microsoft提供了一個(gè)基礎(chǔ)類庫(kù)MFC,其中包含用來(lái)開(kāi)發(fā)C++和C++
Windows應(yīng)用程序的一組類。基礎(chǔ)類庫(kù)的核心是以C++形式封裝了大部分的Windows
API。類庫(kù)表示窗口、對(duì)話框、設(shè)備上下文、公共GDI對(duì)象如畫(huà)筆、調(diào)色板、控制框和其他標(biāo)準(zhǔn)的Windows部件。這些類提供了一個(gè)面向Windows中結(jié)構(gòu)的簡(jiǎn)單的C++成員函數(shù)的接口。</span></p>
<p><span style="font-size: 9pt">MFC可分為兩個(gè)主要部分:(1)基礎(chǔ)類(2)宏和全程函數(shù)。</span></p>
<p> </p>
<p><b> </p>
<p><span style="font-size: 9pt">MFC基礎(chǔ)類</span></b></p>
<p><span style="font-size: 9pt">MFC中的類按功能來(lái)分可劃分為以下幾類:</span></p>
<blockquote>
<p><span style="font-size: 9pt">基類</span></p>
<p><span style="font-size: 9pt">應(yīng)用程序框架類</span></p>
<p><span style="font-size: 9pt">應(yīng)用程序類</span></p>
<p><span style="font-size: 9pt">命令相關(guān)類</span></p>
<p><span style="font-size: 9pt">文檔/視類</span></p>
<p><span style="font-size: 9pt">線程類</span></p>
<p><span style="font-size: 9pt">可視對(duì)象類</span></p>
<p><span style="font-size: 9pt">窗口類</span></p>
<p><span style="font-size: 9pt">視類</span></p>
<p><span style="font-size: 9pt">對(duì)話框類</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">設(shè)備描述表</span></p>
<p><span style="font-size: 9pt">繪畫(huà)對(duì)象類</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 可視編輯服務(wù)器程序類</span></p>
<p><span style="font-size: 9pt">OLE數(shù)據(jù)傳輸類</span></p>
<p><span style="font-size: 9pt">OLE對(duì)話框類</span></p>
<p><span style="font-size: 9pt">其他OLE類</span></p>
<p><span style="font-size: 9pt">數(shù)據(jù)庫(kù)類</span></p>
<b>
</blockquote>
<p> </p>
<p><span style="font-size: 9pt">宏和全局函數(shù)</span></b></p>
<p><span style="font-size: 9pt">若某個(gè)函數(shù)或變量不是某個(gè)類的一個(gè)成員,那么它是一個(gè)全程函數(shù)或變量。</span></p>
<p><span style="font-size: 9pt">Microsoft基本宏和全程函數(shù)提供以下功能:</span></p>
<blockquote>
<blockquote>
<p><span style="font-size: 9pt">數(shù)據(jù)類型</span></p>
<p><span style="font-size: 9pt">運(yùn)行時(shí)刻對(duì)象類型服務(wù)</span></p>
<p><span style="font-size: 9pt">診斷服務(wù)</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">應(yīng)用消息和管理</span></p>
<p><span style="font-size: 9pt">對(duì)象連接和嵌入(OLE)服務(wù)</span></p>
<p><span style="font-size: 9pt">標(biāo)準(zhǔn)命令和Windows IDs</span></p>
</blockquote>
</blockquote>
<p><b> </p>
<p><span style="font-size: 9pt">約定</b>:全程函數(shù)以“Afx”為前綴,所有全程變量都是以“afx”為前綴,宏不帶任何特別前綴,但是全部大寫(xiě)。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">常見(jiàn)的全局函數(shù)和宏有:AfxGetApp,AfxGetMainWnd,AfxMessageBox,DEBUG_NEW等,我們會(huì)在后面的章節(jié)中用到并對(duì)它們進(jìn)行介紹。</span></p>
<p><span style="font-size: 9pt">從繼承關(guān)系來(lái)看,又可將MFC中的類分成兩大類:大多數(shù)的MFC類是從CObject繼承下來(lái);另外一些類則不是從CObject類繼承下來(lái),這些類包括:字符串類CString,日期時(shí)間類CTime,矩形類CRect,點(diǎn)CPoint等,它們提供程序輔助功能。</span></p>
<p><span style="font-size: 9pt">由于MFC中大部分類是從CObject繼承下來(lái)的,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>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -