2009-9-2
===========================
《深入解析MFC》筆記 2. MFC基礎(chǔ)
===========================
基本的MFC應(yīng)用程序組件:
CWinApp:應(yīng)用程序?qū)ο?br> · 保存了一些傳遞給WinMain()的命令行參數(shù),包括當(dāng)前實例的句柄(m_hInstance)、前一個實例的句柄(m_hPrevInstance)、命令行參數(shù)(m_lpCmdLine)以及顯示窗口標(biāo)志(m_nCmdShow)。
· CWinApp在m_pszAppName中保存了應(yīng)用程序名字的拷貝。
· m_pszExeName(指向可執(zhí)行文件名字的指針)、m_pszHelpFilePath(指向應(yīng)用程序幫助文件路徑的指針)、以及指向應(yīng)用程序配置文件(profile)名字的指針
· CCommandLineInfo結(jié)構(gòu)用來保存命令行參數(shù)
· MFC中,實例的初始化有CWinApp::InitInstance()完成。
· 關(guān)閉程序和清除資源由ExitInstance()完成。
· 調(diào)用CWinApp::Run()會啟動標(biāo)準(zhǔn)的GetMessage()...DispatchMessage()循環(huán)
· 每當(dāng)消息隊列為空時,CWinApp::Run()會調(diào)用OnIdle()。
CWnd:窗口基類
包裝Windows API
m_hWnd成員變量表示API級的窗口句柄(HWND)。
將窗口句柄轉(zhuǎn)化成窗口對象
CHandleMap:沒有文檔說明的窗口句柄映射表類
將窗口句柄映射成MFC的Windows對象。
CMapPtrToPtr m_permanentMap: 表示永久映射表,保存程序運行過程中句柄/對象映射表。
每當(dāng)創(chuàng)建一個CWnd的派生類,MFC都會再永久目錄下插入一條映射記錄。調(diào)用CWnd::OnNcDestroy()時就會從永久目錄下刪除一條映射記錄。
CMapPtrToPtr m_temporaryMap:表示臨時映射表,僅在消息存在的過程中存在。
除CWnd派生對象與HWND之間的映射外,還有4個從MFC類到本地窗口句柄的映射。
AFX_MODULE_THREAD_STATE結(jié)構(gòu)
· m_pmapHWND: 窗口句柄與CWnd對象之間的映射表
· m_pmapHMENU: 菜單句柄到CMenu對象的映射表。
· m_pmapHDC: 設(shè)備環(huán)境句柄到CDC對象的映射表。
· m_pmapHGDIOBJ: GDI對象句柄到CGDI對象的映射表。
· m_pmapHIMAGELIST: 圖象鏈表句柄到CImageList對象的映射表
每個參與了句柄映射方案的MFC類都包括一個FromHandle函數(shù),該函數(shù)將CHandleMap::FromHandle()包裝了起來,CHandleMap::FromHandle()完成了查找,并將一個本地句柄與一個C++對象相關(guān)聯(lián)。CWnd::FromHandle()會返回一個適當(dāng)類型的對象。
關(guān)聯(lián)窗口句柄和分離窗口句柄
CWnd::Attach() 將CWnd::m_hWnd賦值為已有的窗口句柄,并將這隊關(guān)系存放在MFC的永久窗口句柄映射表中。
CWnd::Detach() 將窗口關(guān)系和CWnd派生對象之間的關(guān)系從窗口句柄映射表匯總刪除,將CWnd::m_hWnd的值設(shè)為NULL.
MFC狀態(tài)信息
AFX_MODULE_STATE:沒有文檔說明的狀態(tài)信息
· m_pCurrentWinApp—— 一個紙箱CWinApp的指針
· m_hCurrentInstanceHandle —— 該模塊的實例句柄
· m_hCurrentResourceHandel —— 代表保存了模塊資源的實例句柄
· m_lpszCurrentAppName —— 指向應(yīng)用程序名稱的指針
· m_bDLL —— 表示模塊是一個動態(tài)鏈接庫還是一個可執(zhí)行文件
· m_classList—— 指向應(yīng)用程序的CRuntimeClass結(jié)構(gòu)鏈表中的第一個運行時類的指針。
· m_factoryList —— 紙箱應(yīng)用程序的 COleObjectFactory結(jié)構(gòu)鏈表中的第一個運行時類的指針
· m_nObjectCount—— OLE服務(wù)器的引用計數(shù),表示服務(wù)器是否有未完成的COM對象
· m_bUserCtrl —— 表示擁護(hù)是否在使用OLE服務(wù)器的標(biāo)志。
· m_szUnregisterList[4096]——維護(hù)一個注冊了的窗口類的鏈表,以便結(jié)束時的注銷
· m_pfnAfxWndProc —— 指向MFC的標(biāo)準(zhǔn)窗口過程
· m_fRegisteredClasses——表示哪些MFC窗口類已經(jīng)注冊了。
多數(shù)成員可以通過類似AfxGetInstanceHandle()來訪問。
MFC對GDI的支持
CDC類內(nèi)部
HDC成員變量,表示一個實際設(shè)備環(huán)境的句柄。
m_hAttribDC,
CDC析構(gòu)函數(shù)調(diào)用DeleteDC()。
CDC派生類
· CPaintDC —— CPaintDC的構(gòu)造函數(shù)需要一個指向CWnd的指針,他會調(diào)用BeginPaint()而創(chuàng)建一個設(shè)備環(huán)境,然后寫入設(shè)備環(huán)境映射表。CPaintDC的析構(gòu)函數(shù)是EndPaint()。
· CWindowDC —— 表示窗口內(nèi)的整個屏幕區(qū)域(包括用戶區(qū)和框)。CWindowDC的構(gòu)造函數(shù)需要一個指向CWnd的指針,調(diào)用GetWindowDC()來為整個窗口創(chuàng)建一個設(shè)備環(huán)境。CWindowDC的析構(gòu)函數(shù)是ReleaseDC()。
· CClientDC——用戶區(qū)。構(gòu)造函數(shù)也需要一個指向CWnd的指針。GetClientDC()、ReleaseDC().
· CMetaFileDC —— Windows的元文件有一個GDI命令序列,利用這個命令序列可以重新畫出圖像。創(chuàng)建一個元文件DC:構(gòu)造CMetaFileDC(在棧中分配一個或聲明一個),然后調(diào)用CMetaFile::Create()來創(chuàng)建一個元文件并初始化CMetaFile的成員變量,析構(gòu)函數(shù):DeleteMetaFile()。
圖形對象
Device context 保存了在Windows繪畫所需要的所有信息,包括映射模式等等。還保存了關(guān)于在設(shè)備上繪畫所使用的工具的信息。
CGDIObject
所有GDI對象的基類。m_hObject是GDI對象的句柄。
CPen
CBrush
CFont
CBitmap
Cpalette
CRgn
posted on 2010-03-15 23:00
Euan 閱讀(786)
評論(0) 編輯 收藏 引用 所屬分類:
windows