MFC和Win32技術應用分析
Drawing modeR2_COPYPEN
FontSYSTEM_FONT (SYSTEM_FIXED_FONT for applications written to run with Windows versions 3.0 and earlier)
Intercharacter spacing0
Mapping modeMM_TEXT
PenBLACK_PEN
Polygon-fill modeALTERNATE
Stretch modeBLACKONWHITE
Text colorText color setting from Control Panel (typically, black)
Viewport extent(1,1)
Viewport origin(0,0)
Window extent(1,1)
Window origin(0,0)
表2-3 設備描述表的分類
Display顯示設備描述表,提供對視頻顯示設備上的繪制操作的支持
Printer打印設備描述表,提供對打印機、繪圖儀設備上的繪制操作的支持
Memory內存設備描述表,提供對位圖操作的支持
Information信息設備描述表,提供對操作設備信息獲取的支持
表2-3中的顯示設備描述表又分三種類型,如表2-4所示。
表2-4 顯示設備描述表的分類
名稱特點功能
Class Device
Contexts提供對Win16的向后兼容
Common
Device
Contexts在Windows系統(tǒng)的高速緩沖區(qū),數量有限Applicaion獲取設備描述表時,Windows用缺省值初始化該設備描述表,Application使用它完成繪制操作,然后釋放
Private
Device
Contexts沒有數量限制,用完不需釋放一次獲取,多次使用多次使用過程中,每次設備描述表屬性的任何修改或變化都會被保存,以支持快速繪制
(1)使用設備描述表的步驟
要使用設備描述表,一般有如下步驟:
獲取或者創(chuàng)建設備描述表;
必要的話,改變設備描述表的屬性;
使用設備描述表完成繪制操作;
釋放或刪除設備描述表。
Common設備描述表通過::GetDC,::GetDCEx,::BeginPaint來獲得一個設備描述表,用畢,用::ReleaseDC或::EndPaint釋放設備描述表;
Printer設備描述表通過::CreateDC創(chuàng)建設備描述表,用::DeleteDC刪除設備描述表。
Memory設備描述表通過::CreateCompatibleDC創(chuàng)建設備描述表,用::DeleteDC刪除。
Information設備描述表通過::CreateIC創(chuàng)建設備描述表,用::DeleteDC刪除。
(2)改變設備描述表屬性的途徑
要改變設備描述表的屬性,可通過以下途徑:
用::SelectObject選入新的除調色板以外的GDI Object到設備描述表中;
對于調色板,使用::SelectPalette函數選入邏輯調色板,并使用::RealizePalette把邏輯調色板的入口映射到物理調色板中。
用其他API函數改變其他屬性,如::SetMapMode改變映射模式。
設備描述表在MFC中的實現
MFC提供了CDC類作為設備描述表類的基類,它封裝了Windows的HDC設備描述表對象和相關函數。
CDC類
CDC類包含了各種類型的Windows設備描述表的全部功能,封裝了所有的Win32 GDI 函數和設備描述表相關的SDK函數。在MFC下,使用CDC的成員函數來完成所有的窗口繪制工作。
CDC 類的結構示意圖2-2所示。
CDC類有兩個成員變量:m_hDC,m_hAttribDC,它們都是Windows設備描述表句柄。CDC的成員函數作輸出操作時,使用m_Hdc;要獲取設備描述表的屬性時,使用m_hAttribDC。
在創(chuàng)建一個CDC類實例時,缺省的m_hDC等于m_hAttribDC。如果需要的話,程序員可以分別指定它們。例如,MFC框架實現CMetaFileDC類時,就是如此:CMetaFileDC從物理設備上讀取設備信息,輸出則送到元文件(metafile)上,所以m_hDC和m_hAttribDC是不同的,各司其責。還有一個類似的例子:打印預覽的實現,一個代表打印機模擬輸出,一個代表屏幕顯示。
CDC封裝::SelectObject(HDC hdc,HGDIOBJECT hgdiobject)函數時,采用了重載技術,即它針對不同的GDI對象,提供了名同而參數不同的成員函數:
SelectObject(CPen *pen)用于選入筆;
SelectObject(CBitmap* pBitmap)用于選入位圖;
SelectObject(CRgn *pRgn)用于選入剪裁區(qū)域;
SelectObject(CBrush *pBrush)用于選入刷子;
SelectObject(CFont *pFont)用于選入字體;
至于調色板,使用SelectPalette(CPalette *pPalette,BOOL bForceBackground )選入調色板到設備描述表,使用RealizePalletter()實現邏輯調色板到物理調色板的映射。
從CDC派生出功能更具體的設備描述表
從CDC 派生出四個功能更具體的設備描述表類。層次如圖2-3所示。
下面,分別討論派生出的四種設備描述表。
CCientDC
代表窗口客戶區(qū)的設備描述表。其構造函數CClientDC(CWnd *pWin)通過::GetDC獲取指定窗口的客戶區(qū)的設備描述表HDC,并且使用成員函數Attach把它和CClientDC對象捆綁在一起;其析構函數使用成員函數Detach把設備描述表句柄HDC分離出來,并調用::ReleaseDC釋放設備描述表HDC。
CPaintDC
僅僅用于響應WM_PAINT消息時繪制窗口,因為它的構造函數調用了::BeginPaint獲取設備描述表HDC,并且使用成員函數Attach把它和CPaintDC對象捆綁在一起;析構函數使用成員函數Detach把設備描述表句柄HDC分離出來,并調用::EndPaint釋放設備描述表HDC,而::BeginPaint和::EndPaint僅僅在響應WM_PAINT時使用。
CMetaFileDC
用于生成元文件。
CWindowDC
代表整個窗口區(qū)(包括非客戶區(qū))的設備描述表。其構造函數CWindowDC(CWnd *pWin)通過::GetWindowDC獲取指定窗口的客戶區(qū)的設備描述表HDC,并使用Attach把它和CWindowDC對象捆綁在一起;其析構函數使用Detach把設備描述表HDC分離出來,調用::ReleaseDC釋放設備描述表HDC。
MFC設備描述表類的使用
使用CPaintDC、CClientDC、CWindowDC的方法
首先,定義一個這些類的實例變量,通常在棧中定義。然后,使用它。
例如,MFC中CView對WM_PAINT消息的實現方法如下:
void CView::OnPaint()
{
// standard paint routine
CPaintDC dc(this);
OnPrepareDC(dc);
評論