第五章:圖形設備接口(GDI)、顏色及字體
1,任何時候當程序需要直接在屏幕或打印機上繪圖的時候,都需要調用GDI函數,GDI函數包含了一些用於繪制圖形、位圖以及文本的函數。
2,Windows的設備環境是GDI的關鍵元素,它代表了物理設備。每一個C++設備環境對象都有與之對應的Windows設備環境,並且通過一個32位類型的HDC句柄來標識。
3,MFC庫設備環境類基類CDC包含了繪圖所需要的所有成員函數,並且幾乎所有派生類只有構造函數和析構函數不同(CMetaFileDC類除外)。
對於顯示器來說,常用的派生類有CClIEntDC 和 CWindowDC,而對其它設備(如打印機或內存緩沖區),則可以構造一個基類CDC的對象。
對於顯示器和打印機設備環境對象來說,應用程序框架會直接將句柄附在對象上;而對其它設備環境(如內存設備環境),為了將對象與句柄相聯系,在構造完對象之後,還必須調用一個成員函數(進行初試化)。
4,CClIEntDC類 和 CWindowDC類
CClIEntDC( CWnd* pWnd );
//Constructs a CClIEntDC object that Accesses the clIEnt area of the CWnd pointed to by pWnd. The constructor calls the Windows function GetDC.
CWindowDC( CWnd* pWnd );
//Constructs a CWindowDC object that Accesses the entire screen area (both client and nonclIEnt) of the CWnd object pointed to by pWnd. The constructor calls the Windows function GetWindowDC.
如果構造CClIEntDC對象,則設備環境的映射區域限於客戶區域,不能在客戶區域外繪圖。原點(0,0)在客戶區左上角。
《 如果創建CWindowDC對象,則設備環境的映射區域為整個窗口(包括標題欄、狀態欄、窗口邊框等)。原點(0,0)在整個窗口的左上角。》
注意:
1)視圖窗口沒有非客戶區域.
2)視圖窗口覆蓋在框架窗口之上。
3)在《》中的內容,是我根據測試所理解的。翻譯原文中映射區域是整個顯示屏幕,原點(0,0)在整個屏幕的左上角。這顯然是不對的。
5,在創建了一個CDC對象後,一定要注意在完成任務後將其刪除。(如果用CClientDC 或 CWindowDC來在堆棧中構造一個DC對象,則不需要我們顯式的刪除它,CClIEntDC或CWindowDC對象會在它的生命周期結束的時候自動調用析構函數來完成刪除工作)
例如:
CDC *pDC=GetDC();
...
RealeaseDC(pDC);
說明:
CDC* GetDC( );//CWnd::GetDC 獲得與當前窗口相關聯的CDC對象指針(映射窗口客戶區域)
int ReleaseDC( CDC* pDC );//CWnd::ReleaseDC 釋放與當前窗口相關聯的設備環境
注意:
在MFC程序中,千萬不能自己添加代碼刪除作為參數以指針形式傳遞給OnDraw(CDC* pDC)函數的CDC對象,應用程序會自動控制它的刪除。
6,當利用CDC對象繪圖的時候,所繪制的圖形都要依賴於設備環境的狀態:如畫筆、
[1] [2] [3] 下一頁