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