新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > MFC和Win32技術(shù)應(yīng)用分析

MFC和Win32技術(shù)應(yīng)用分析

作者: 時(shí)間:2018-09-05 來(lái)源:網(wǎng)絡(luò) 收藏

本文引用地址:http://2s4d.com/article/201809/388505.htm

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);



關(guān)鍵詞:

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉