新聞中心

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

        MFC和Win32技術應用分析

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

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

        Display顯示設備描述表,提供對視頻顯示設備上的繪制操作的支持

        Printer打印設備描述表,提供對打印機、繪圖儀設備上的繪制操作的支持

        Memory內存設備描述表,提供對位圖操作的支持

        Information信息設備描述表,提供對操作設備信息獲取的支持

        表2-3中的顯示設備描述表又分三種類型,如表2-4所示。

        表2-4 顯示設備描述表的分類

        名稱特點功能

        Class Device

        Contexts提供對Win16的向后兼容

        Common

        Device

        Contexts在Windows系統的高速緩沖區,數量有限Applicaion獲取設備描述表時,Windows用缺省值初始化該設備描述表,Application使用它完成繪制操作,然后釋放

        Private

        Device

        Contexts沒有數量限制,用完不需釋放一次獲取,多次使用多次使用過程中,每次設備描述表屬性的任何修改或變化都會被保存,以支持快速繪制

        (1)使用設備描述表的步驟

        要使用設備描述表,一般有如下步驟:

        獲取或者創建設備描述表;

        必要的話,改變設備描述表的屬性;

        使用設備描述表完成繪制操作;

        釋放或刪除設備描述表。

        Common設備描述表通過::GetDC,::GetDCEx,::BeginPaint來獲得一個設備描述表,用畢,用::ReleaseDC或::EndPaint釋放設備描述表;

        Printer設備描述表通過::CreateDC創建設備描述表,用::DeleteDC刪除設備描述表。

        Memory設備描述表通過::CreateCompatibleDC創建設備描述表,用::DeleteDC刪除。

        Information設備描述表通過::CreateIC創建設備描述表,用::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。

        在創建一個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)用于選入剪裁區域;

        SelectObject(CBrush *pBrush)用于選入刷子;

        SelectObject(CFont *pFont)用于選入字體;

        至于調色板,使用SelectPalette(CPalette *pPalette,BOOL bForceBackground )選入調色板到設備描述表,使用RealizePalletter()實現邏輯調色板到物理調色板的映射。

        從CDC派生出功能更具體的設備描述表

        從CDC 派生出四個功能更具體的設備描述表類。層次如圖2-3所示。

        下面,分別討論派生出的四種設備描述表。

        CCientDC

        代表窗口客戶區的設備描述表。其構造函數CClientDC(CWnd *pWin)通過::GetDC獲取指定窗口的客戶區的設備描述表HDC,并且使用成員函數Attach把它和CClientDC對象捆綁在一起;其析構函數使用成員函數Detach把設備描述表句柄HDC分離出來,并調用::ReleaseDC釋放設備描述表HDC。

        CPaintDC

        僅僅用于響應WM_PAINT消息時繪制窗口,因為它的構造函數調用了::BeginPaint獲取設備描述表HDC,并且使用成員函數Attach把它和CPaintDC對象捆綁在一起;析構函數使用成員函數Detach把設備描述表句柄HDC分離出來,并調用::EndPaint釋放設備描述表HDC,而::BeginPaint和::EndPaint僅僅在響應WM_PAINT時使用。

        CMetaFileDC

        用于生成元文件。

        CWindowDC

        代表整個窗口區(包括非客戶區)的設備描述表。其構造函數CWindowDC(CWnd *pWin)通過::GetWindowDC獲取指定窗口的客戶區的設備描述表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);



        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 临桂县| 晴隆县| 诸暨市| 陆川县| 遵义市| 虹口区| 蕉岭县| 绥中县| 区。| 山丹县| 车险| 石景山区| 铜川市| 长宁县| 英德市| 荥经县| 长顺县| 郧西县| 湘潭市| 怀宁县| 南开区| 陇西县| 鹤峰县| 五台县| 柳江县| 岳西县| 千阳县| 松阳县| 南宫市| 三门峡市| 大港区| 兴国县| 南溪县| 邢台县| 嵊泗县| 长顺县| 龙里县| 迭部县| 沙田区| 松桃| 河西区|