




已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
找家教,到陽光 陽光家教網(wǎng) 全國最大家教平臺MFC應用程序框架入門摘要: 本文主要對VC+ 6.0的MFC編程方法及MFC應用程序框架進行簡要介紹。關鍵詞: VC+6.0;MFC;程序框架1 MFC概述顧名思意,MFC應用程序框架是以MFC作為框架基礎的,以此程序框架模式搭建起來的應用程序在程序結構組織上是完全不同于以前的Win32 SDK編程方式的。自20世紀90年代初問世以來,MFC一直試圖把Windows API函數(shù)封裝到類庫中個各個邏輯類中。MFC的這種封裝并非簡單地對API函數(shù)進行分組與打包,而是更多地通過類來試圖實現(xiàn)全部的系統(tǒng)策略。隨著越來越多系統(tǒng)功能的加入,MFC的規(guī)模也在不斷拓展,目前已包括有200多個類,涵蓋了通用Windows 類、文檔/視框架、OLE、數(shù)據(jù)庫、Internet以及分布式功能等多方面的基本內容。這樣一個堅實的程序開發(fā)基礎無疑從很大程度上方便了程序設計人員對Windows 程序的開發(fā)。MFC提供了相當多不同功能的類以適合盡可能廣泛的需求。這里絕大多數(shù)的MFC類都是直接或間接從CObject類派生出來的,CObject類為其派生類提供了三個重要的特性支持:持久性(Serialization)支持、運行時(Run-time)類信息支持和診斷(Diagnostic)調試支持等。其中持久性是以流的方式將某個類對象中的持久性數(shù)據(jù)輸出或輸入到外部存儲介質如磁盤文件等的過程;運行時類信息(Run-time Class Information,RTCI)則可以重新獲取一個對象的類名及其他一些有關對象在運行時的信息。RTCI也是C+中除運行時類型信息(Run-time Type Information,RTTI)機制外的另一個重要工具;診斷和調試支持作為CObject類的一個組成部分,可以在實現(xiàn)CObject派生類時執(zhí)行有效性檢查并可向調試窗口輸出狀態(tài)信息。并非MFC提供的所有函數(shù)都是類成員函數(shù),MFC也提供了一系列以Afx為前綴的全局函數(shù)。類成員函數(shù)只能在其所屬類對象所在的上下文中使用,但是這些AFX函數(shù)卻可以在任何時候的任何地方直接使用。下表列出的是幾個比較重要AFX函數(shù):函數(shù)名函數(shù)說明AfxAbout無條件終止一個應用程序;通常在發(fā)生無法回復的錯誤時使用AfxBeginThread創(chuàng)建一個新的線程并開始執(zhí)行AfxEndThread 終止當前正在執(zhí)行的線程AfxMessageBox顯示一個Windows 消息窗口AfxGetApp 返回一個指向應用程序對象的指針AfxGetAppName返回應用程序名AfxGetMainWnd返回一個指向應用程序主窗口的指針AfxGetInstanceHandle返回一個標識當前應用程序實例的句柄AfxRegisterWndClass 為一個MFC應用程序注冊一個用戶自定義的窗口類2 MFC對API函數(shù)的封裝如果讀者曾經有過SDK的開發(fā)經歷,一定會對其煩瑣的編程方式和大量的Win32 API函數(shù)調用深有感觸。所有不同功能的API函數(shù)均是以全局函數(shù)的形式放在一起的,由于API函數(shù)數(shù)目比較龐大,因此無論是學習還是使用都是有一定難度的。相比而言,建立在API函數(shù)基礎之上的MFC類庫則通過把相關API函數(shù)的分類封裝而可以大大簡化編程的難度,用MFC類編寫的Windows 應用程序完成相同的任務只需要進行少量的工作。眾多的API函數(shù)根據(jù)功能的不同而被MFC封裝到200多個類中,這些類基本涵蓋了進行Windows 編程大部分可能用到的功能。由于封裝后的MFC類太多,這里不能一一介紹,下面就以其中比較重要的CObject類和CWnd類為例對API函數(shù)的封裝情況做一簡要介紹。CObject類是MFC中最主要也是最基本的類之一,該類不支持多重繼承,派生的類只能有一個CObject基類。CObject類是位于類層次結構最頂層的,絕大多數(shù)MFC類都是從CObject類派生出來的。CObject類包含了所有MFC類必須具備的幾個基本功能:持久性支持、運行時類信息支持和診斷調試支持。其中持久性支持功能由成員函數(shù)IsSerializable()和Serialize()提供。前者用于檢測對象是否支持序列化。如果一個類能夠被序列化,就必須在聲明時包含DECLARE_SERIAL宏、在實現(xiàn)時包含IMPLEMENT_SERIAL宏。Serialize()函數(shù)則可以將對象寫入檔案文件(Archive)或從檔案文件讀出對象。成員函數(shù)GetRuntimeClass()可以獲取到一個指向CruntimeClass類對象的指針,通過該指針可以得到對象的運行時類信息。CObject類在診斷調試支持方面提供了成員函數(shù)AssertValid()和Dump(),前者可對對象內存狀態(tài)的有效性進行檢查,后者負責將對象的內容轉儲到一個CdumpContext對象中,并可以提供診斷服務及一些有用的調試信息。在MFC中,CWnd類提供了所有窗口類的基本功能,是一個非常重要的類,大約三分之一的MFC類都是以此為基類。該類主要對創(chuàng)建、操縱窗口類的API函數(shù)進行了封裝,而且通過消息映射機制隱藏了SDK編程中使用相當不便的窗口處理函數(shù),是消息的分發(fā)處理更加方便。CWnd類最重要的一個封裝是對API函數(shù)CreateWindow()的封裝,該函數(shù)被封裝為CWnd類成員函數(shù)Create()。從VC提供的MFC源文件WinCore.cpp中可以清楚看出CWnd類對CreateWindow()函數(shù)的封裝過程,下面給出相關部分的實現(xiàn)清單:BOOL CWnd:Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)/ cant use for desktop or pop-up windows (use CreateEx instead)ASSERT(pParentWnd != NULL);ASSERT(dwStyle & WS_POPUP) = 0);return CreateEx(0, lpszClassName, lpszWindowName, dwStyle | WS_CHILD, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, pParentWnd-GetSafeHwnd(), (HMENU)nID, (LPVOID)pContext);可以看出,主要工作是在CreateEx()成員函數(shù)中完成的,而該函數(shù)又是對API函數(shù)CreateWindowEx()的封裝。封裝后的代碼在調用CreateWindowEx()前構造并填充了一個非常類似于WNDCLASS結構的CREATESTRUCT結構,并調用了PreCreateWindow()。BOOL CWnd:CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam)/ allow modification of several common create parametersCREATESTRUCT cs;cs.dwExStyle = dwExStyle;cs.lpszClass = lpszClassName;cs.lpszName = lpszWindowName;cs.style = dwStyle;cs.x = x;cs.y = y;cs.cx = nWidth;cs.cy = nHeight;cs.hwndParent = hWndParent;cs.hMenu = nIDorHMenu;cs.hInstance = AfxGetInstanceHandle();cs.lpCreateParams = lpParam;if (!PreCreateWindow(cs)PostNcDestroy();return FALSE;AfxHookWindowCreate(this);HWND hWnd = :CreateWindowEx(cs.dwExStyle, cs.lpszClass, cs.lpszName, cs.style, cs.x, cs.y, cs.cx, cs.cy, cs.hwndParent, cs.hMenu, cs.hInstance, cs.lpCreateParams);#ifdef _DEBUGif (hWnd = NULL)TRACE1(Warning: Window creation failed: GetLastError returns 0x%8.8Xn, GetLastError();#endifif (!AfxUnhookWindowCreate()PostNcDestroy(); / cleanup if CreateWindowEx fails too soonif (hWnd = NULL)return FALSE;ASSERT(hWnd = m_hWnd); / should have been set in send msg hookreturn TRUE;看上去經過封裝的窗口創(chuàng)建函數(shù)要比原API函數(shù)復雜許多,但這并不說明MFC的封裝將導致編程的效率低下,恰恰相反,由于CWnd在絕大多數(shù)場合中是以基類的形式出現(xiàn)的,因此可在派生類中添加代碼完成對CWnd:Create()的調用而比較方便的實現(xiàn)對派生類窗口的創(chuàng)建。3 MFC應用程序框架 MFC應用程序框架可以看作是MFC基本類庫的一個超集(Superset),類庫是眾多可在任何程序中使用的類的集合,而應用程序框架則定義了程序自身的結構。下面給出一個使用了MFC應用程序框架的簡單例子,通過這段例程可以比較清楚地了解MFC應用程序框架的一般結構。/ Sample01.h文件/ 應用程序類class CSample01App : public CWinApppublic:virtual BOOL InitInstance();/ 框架窗口類class CSample01Frame : public CFrameWndpublic:CSample01Frame();protected:afx_msg void OnPaint();DECLARE_MESSAGE_MAP();/ Sample01.cpp文件#include #include Sample01.h/ 應用程序對象CSample01App theApp; / 初始化應用程序實例BOOL CSample01App:InitInstance()m_pMainWnd = new CSample01Frame();m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();return TRUE;/ 消息映射 BEGIN_MESSAGE_MAP(CSample01Frame, CFrameWnd)ON_WM_PAINT()END_MESSAGE_MAP()/ 構造函數(shù)CSample01Frame:CSample01Frame()Create(NULL, MFC應用程序框架程序);/ WM_PAINT消息響應函數(shù)void CSample01Frame:OnPaint()CPaintDC dc(this);dc.TextOut(100, 100, Hello World!); 仍象編寫Sample00程序一樣建立一個Win32應用程序工程Sample01(配套程序見光盤配套程序Sample01),然后分別向工程添加頭文件Sample01.h和源文件Sample01.cpp,并將上述代碼寫入相應的文件。為了能順利編譯,還需要修改一下編譯命令,通過Alt+F7快捷鍵呼出【Project Settings】對話框,在【Preprocessor definitions】欄的最后添加選項_AFXDLL,前面用逗號分隔。接下來還需要在【Project Options】欄的最后添加命令行/MD,用空格同其他命令行參數(shù)進行分隔。編譯運行,可以看出效果同SDK方式編寫的Sample00程序是一樣的,但在代碼實現(xiàn)上更加結構化,編寫過程也更加簡單。接下來,對上述應用程序框架代碼進行分析。首先從MFC應用程序的核心-CWinApp類的派生類CSample01App談起。CWinApp類提供了可以獲取消息并將獲取到的消息分發(fā)到應用程序窗口的消息循環(huán)和一些關鍵的虛函數(shù),通過對這些虛函數(shù)的重載可使開發(fā)人員對應用程序的一些固有行為進行擴展。當把頭文件Afxwin.h包含進來后,就可以在程序中使用包括CWinApp在內的一些MFC類了。一個MFC應用程序有且只能有一個應用程序對象而且必須被以全局方式進行聲明,所以該對象自程序開始運行起就一直駐留在內存。由于使用了MFC應用程序框架的程序在本質上仍是Windows 應用程序,因此必然需要在程序中存在作為Windows 應用程序入口的WinMain()函數(shù)。在前面的示例代碼中之所以沒有看到WinMain()函數(shù)是由于該函數(shù)已經通過封裝的手段隱藏到應用程序框架中了。除WinMain()外,CWinApp類成員函數(shù)Run()也是隱含執(zhí)行的,這個函數(shù)也是非常重要的,它負責把消息放進應用程序窗口的消息循環(huán)中,由WinMain()函數(shù)完成對Run()的調用 。當WinMain()函數(shù)尋找到應用程序對象后將立即調用CWinApp類的虛函數(shù)InitInstance()。由于CWinApp基類是不知道究竟需要何種主框架窗口的,因此在使用時必須在CWinApp的派生類中對InitInstance()函數(shù)進行重載。InitInstance()函數(shù)是在應用程序已經開始運行但窗口尚未創(chuàng)建時被調用的,若非由InitInstan
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商業(yè)贈送活動方案
- 咖啡比賽近期活動方案
- 團結團員活動方案
- 團委進校園開展活動方案
- 品茶交友活動方案
- 四亮四強模范活動方案
- 2024-2025學年山東省青島市萊西市六年級上學期期中生物試卷
- 子宮肌瘤培訓課件
- 2024-2025學年下學期初中語文統(tǒng)編版八年級期末必刷??碱}之文言文閱讀
- 認知行為仿真-洞察及研究
- 保潔學校管理制度
- 招聘渠道ROI評估模型-洞察及研究
- 2025春季學期國開電大本科《人文英語4》一平臺機考真題及答案(第六套)
- 第七單元1認識小數(shù)(課件)-三年級數(shù)學下冊(人教版)
- 2025年河北省中考麒麟卷生物(二)及答案
- 2024年民族出版社招聘事業(yè)編制專業(yè)技術人員真題
- 2025年食品安全管理員考試試題及答案
- 2025-2030骨科植入器材產業(yè)市場深度分析及發(fā)展趨勢與投資戰(zhàn)略研究報告
- T/SHPTA 071.1-2023高壓電纜附件用橡膠材料第1部分:絕緣橡膠材料
- 湖北省浠水縣聯(lián)考2025年七下數(shù)學期末質量檢測試題含解析
- 生產基層管理培訓課程
評論
0/150
提交評論