GDI 對象:
- Windows GDI提供了一些繪圖對象,程序通過這些GDI對象設置繪圖的工具和風格,這裏的對象是指Windows數據結構,而不是C++類的對象。
- GDI對象是Windows圖形設備接口的抽象繪圖工具。除了畫筆和畫刷,其它GDI對象還包括字體、位圖和調色板。
- MFC對GDI對象進行了很好的封裝,提供了封裝GDI對象的類,如CPen、CBrush、CFont、CBitmap和CPalette等,這些類都是GDI對象類CGdiObject的派生類。
================================================================
選擇一個GDI對象:
1. CDC類提供了成員函數SelectObject()選擇用戶自己創建的GDI對象,該函數有多種重載形式,
用戶可以選擇已定製好的畫筆、畫刷、字體和位圖等不同類型的GDI對象
CPen* SelectObject( CPen* pPen );
CBrush* SelectObject( CBrush* pBrush );
virtual CFont* SelectObject( CFont* pFont );
CBitmap* SelectObject( CBitmap* pBitmap );
int SelectObject( CRgn* pRgn );
CGdiObject* SelectObject(CGdiObject* pObject );
函數參數是一個指向用戶已定製好的GDI對象的指針,選擇操作成功函數將返回以前GDI對象的指針,否則返回NULL。
2. 在選擇繪圖設備類對象(GDI對象)進行繪圖時,一般可按下列步驟進行:
(1)定義一個GDI對象,然後調用相應的函數(如CreatePen、CreateSolidBrush等)創建此GDI對象。
(2)將已構造出的GDI對象利用設備環境類對象的成員函數SelectObject選入到當前環境中,並同時將原來的GDI對象保存起來。
(3)繪圖結束後,恢復當前設備環境中原來的GDI對象。
注意:
在Windows系統中包含了一些庫存的GDI對象,在第(3)步中可直接利用設備環境類(CDC)的成員函數SelectStockObject將一個Windows庫存的GDI對象選入,系統可自動將原來選入的GDI對象從設備環境中分離出來。
================================================================
圖形設備接口、GDI類:
CGdiObject類
CGdiObject類派生於CObject類,它是CGdiObject、CPen、CBrush、Cfont和CBitmap等的基類。
用戶不能直接生成一個CGdiObject類,而必須在它的某種設備繼承類中生成一個CGdiObject類的派生類。
CPen類
CPen類是CGdiObject類的一個派生類,它封裝了Windows圖形設備接口(GDI)中有關畫筆的操作。
創建CPen對象:
創建一個CPen對象可以有以下幾種方法:
(1)定義一個CPen對象,用其成員函數CreatePen或CreatePenIndirect對其進行初始化。
如:
CPen pen;
Pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
(2)定義一個CPen對象,並一次性地初始化它的所有參數。
如:
CPen pen(PS_SOLID,1,RGB(255,0,RGB(255,0,0));
(3)動態地創建一個CPen對象。
如:
CPen *pen;
Pen = new CPen(PS_SOLID,1,RGB(255,0,0));
.......
delete pen;
在一個函數中多次創建一個CPen對象時可以採用這種方法。
應用這種方法時,特別注意操作完畢後要刪除分配的CPen對象,即:delete pen;
CBrush類
CBrush類是CGdiObject類的一個派生類,它封裝了Windows圖形設備界面(GDI)中有關畫刷的操作。
CBrush類的用法與CPen類似。
創建CBrush對象:
利用CBrush類的構造函數可創建Cbrush對象。
1. 實心畫刷
用實心畫刷進行圖形填充時,以這種畫刷的顏色實心填充。其創建方法如下:
(1)定義CBrush對象,用函數CreateSolidBrush對對象進行初始化。
CBrush brush;
brush.CreateSolidBrush(RGB(255,0,0));
(2)定義CBrush類對象,並利用構造函數對對象的參數進行初始化。
CBrush brush(RGB(255,0,0));
(3)動態創建。用這種方法定義時,在操作完成後要刪除創建的CBrush對象。
CBrush *brush;
Brush=new CBrush(RGB(255,0,0));
……
delete brush;
2. 影線畫刷
影線畫刷不是用畫刷的顏色實心填充圖形,而是用不同的陰影圖案來填充。
影線畫刷的創建方法同實心畫刷一樣:
(1)定義對象,用函數初始化。
如:
CBrush brush;
brush.CreateSolidBrush(PS_SOLID,RGB(255,0,0));
(2)一次性創建。
如:
CBrush brush(HS_HORIZONTAL,RGB(255,0,0));
(3)動態創建。
如:
用這種方法創建的CBrush對象,在操作完成後要刪除CBrush對象。
CBrush * brush;
Brush = new CBrush(HS_HORIZONTAL,RGB(255,0,0));
……
delete brush;
3. 位圖畫刷
位圖畫刷是用位圖圖像來填充圖形的。
函數CreatPatternBrush用來初始化一個位圖畫刷。
以下代碼創建一個位圖畫刷(其中,pBitmap指向一個位圖對象):
CBrush brush;
brush.CreatPatternBrush(pBitmap);
CFont類
CFont類是CGdiObject類的一個派生類,它封裝了邏輯字體及方法。
創建CFont對象:
CFont類只有一個構造函數,在定義了一個CFont類對象之後,必須用成員函數CreateFont或CreateFontIndirect來初始化CFont對象的參數。
CreateFont函數的參數非常多,可查閱MSDN。
CBitmap類
CBitmap類和Cpen、CBrush類一樣,是CGdiObject類的派生類,它封裝了使用Windows GDI進行圖形繪製中關於位圖的操作。
在CBitmap類中重載了兩個LoadBitmap函數,用於加載位圖資源:
BOOL LoadBitmap( LPCTSTR lpszResourceName );
BOOL LoadBitmap( UINT nIDResource );