新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > MFC和Win32技術應用分析

MFC和Win32技術應用分析

作者: 時間:2018-09-05 來源:網絡 收藏

本文引用地址:http://m.butianyuan.cn/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 設備描述表的分類

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



關鍵詞:

評論


相關推薦

技術專區(qū)

關閉