3、創建繪圖工具並選入DC
有了畫布,要繪圖我們必須有畫筆畫刷。在Windows中有HPEN、HBRUSH等GDI對象,MFC對GDI對象進行了很好的封裝,提供了封裝GDI對象的類,如CPen、CBrush、CFont、CBitmap和CPalette等,這些類都是GDI對象類CGdiObject的派生類。
一般先創建畫筆(刷),然後調用CDC::SelectObject函數將畫筆(刷)選入設備環境最爲當前繪圖工具,繪圖完畢恢復設備環境以前的畫筆(刷)對象,最後調用CGdiObject::DeleteObject函數刪除畫筆(刷)對象。
這裏需要注意的是,CGdiObject::DeleteObject函數徹底刪除底層GDI對象(CPen和CBrush類的基類)。在MFC中,當對象銷燬時會調用對象的析構函數自動刪除對象,一般不必調用CGdiObject::DeleteObject刪除GDI對象,因爲如果設備環境還在使用一個GDI對象時,將引起應用程序崩潰或出現難以理解的運行錯誤。
(1)創建畫筆
BOOL CPen::CreatePen( int nPenStyle, int nWidth, COLORREF cfColor );
nPenStyle 指定畫筆的風格。其可能取值的列表,請參見CPen構造函數中的nPenStyle參數。
nWidth 指定畫筆的寬度。如果這個值爲0,則不管是什麼映射模式,以設備單位表示的寬度總是一個像素。
crColor 包含畫筆的一個RGB顏色,爲COLORREF結構。
此外,可通過CDC::SelectStockObject函數來調用系統預定義的庫存筆對應的CGdiObject對象。
pOldPen = (Cpen*)pDC->SelectStockObject(BLACK_PEN);
(2)創建畫刷
BOOL CBrush::CreateSolidBrush ( COLORREF crColor );
BOOL CBrush::CreateHatchBrush( int nIndex, COLORREF crColor );
參數: nIndex 指定畫刷的陰影線風格。可取的值如下:
HS_HORIZONTAL /* ==== */
HS_VERTICAL /* ||||| */
HS_FDIAGONAL /* \\\\\ */
HS_BDIAGONAL /* ///// */
HS_CROSS /* +++++ */
HS_DIAGCROSS /* xxxxx */
返回值:調用成功時返回非零值,否則爲0。
此外,可通過CDC::SelectStockObject函數來調用系統預定義的庫存畫刷對應的CGdiObject對象。
pOldBrush = (CBrush*)pDC->SelectStockObject(BLACK_BRUSH);
(3)將畫筆(刷)選入設備環境。
以下爲MFC中默認映射方式下的GDI繪圖的模塊:
//先獲取設備環境pDC
CPen *pOldPen,newPen;
CBrush *pOldBrush,newBrush1,newBrush2;
//創建寬度爲pixel的白色實線畫筆
newPen.CreatePen(PS_SOLID,1,RGB(0,0,0));
//創建紅色實線畫刷
newBrush1.CreateSolidBrush(RGB(255,0,0));
//創建紅色實線度的向下(從右到左)影線的陰影畫刷
newBrush2.CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0));
//將newPen畫筆和newBrush1畫刷對象選入設備環境
pOldPen = pDC->SelectObject(&newPen);
pOldBrush = pDC->SelectObject(&newBrush1);
//調用DC繪圖函數繪圖
//……
//繪圖完畢,恢復原來畫筆、畫刷
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
//刪除創建的畫筆、畫刷
// newPen.DeleteObject();
// newBrush1.DeleteObject();
// newBrush2.DeleteObject();
(4)當繪製文本Text時,一般可以通過調用CDC::SetBkColor函數來設置背景顏色,調用CDC::SetTextColor函數來設置文字顏色,調用CDC::SetTextAlign函數設置文本對齊標記。
4、調用DC繪圖函數繪圖
GDI爲提供了繪製基本圖形的成員函數,在MFC中這些函數封裝在CDC類中。
注意:繪圖函數使用的座標都是邏輯座標。
常用CDC繪圖函數 |
|
函數 |
功能 |
線輸出函數 |
|
GetCurrentPosition |
獲取筆的當前位置(以邏輯座標表示) |
MoveTo |
移動當前位置 |
LineTo |
從當前位置到一點畫直線,但不包括那個點 |
Arc |
畫一段橢圓弧 |
ArcTo |
畫一段橢圓弧。除了更新當前位置以外,這個函數與Arc類似 |
PolyPolyline |
畫多組相連線段。這個函數不使用也不更新當前位置 |
PolylineTo |
畫一條或多條直線,並把當前位置移到最後一條直線的終點 |
PolyBezier |
畫一條或多條Bezier樣條。不使用也不更新當前位置 |
PolyBezierTo |
畫一條或多條Bezier樣條,並把當前位置移到最後一條Bezier樣條的終點 |
|
|
橢圓和多邊形函數 |
|
Chord |
繪製橢圓弧(橢圓和一條線段相交圍成的閉合圖形) |
DrawFocusRect |
繪製用於表示焦點的風格的矩形 |
Ellipse |
繪製橢圓 |
Pie |
繪製餅形圖 |
Polygon |
繪製多邊形,包含由線段連接的一個或多個點(頂點) |
PolyPolygon |
創建使用當前多邊形填充模式的兩個或多個多邊形,多邊形可以相互分開或疊加 |
Polyline |
繪製多邊形,包含連接指定點的一組線段 |
Rectangle |
使用當前筆繪製矩形,用當前畫刷填充 |
RoundRect |
使用當前筆繪製圓角矩形,用當前畫刷填充 |
位圖函數 |
|
BitBlt |
從指定設備上下文拷貝位圖 |
StretchBlt |
把位圖由源矩形和設備移動到目標矩形,必要時拉伸或壓縮位圖以適合目標矩形的維數 |
GetPixel |
獲取指定點像素的RGB顏色值 |
SetPixel |
設置指定點像素爲最接近指定色的近似值 |
文本函數 |
|
TextOut |
用當前選取字體在指定位置寫字符串 |
ExtTextOut |
用當前選取字體在矩形區域寫字符串 |
TabbedTextOut |
在指定位置寫字符串,製表符擴展爲製表符停止位置數組中指定值 |
DrawText |
在指定矩形內繪製格式化文本 |
-------------------詳情參考MSDN、MFC類庫詳解----------------- |
--------------------To be continued------------------