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