一.MFC中與GDI有關的類
為了支援GDI繪圖,MFC提供了兩種重要的類:裝置環境DC(Device Context)類,用于設定繪圖屬性和繪制圖形;繪圖對象類,封裝了各種GDI繪圖對象,包括畫筆、刷子、字型、位圖、調色闆和區域。
二.MFC中GDI繪圖
GDI繪圖包括以下步驟:擷取裝置環境,設定坐标映射,建立繪圖工具,調用DC繪圖函數繪圖。
1、在MFC中,MFC提供了不同類型的DC類。
<1> CPaintDC構造函數:CPaintDC(CWnd* pWnd); 構造一個CPaintDC對象(pWnd指向一個CPaintDC對象所屬的CWnd對象),準備用于繪畫的應用程式視窗。
void CView::OnPaint()
{
CPaintDC dc(this);
// TODO: Add your message handler code here
OnPrepareDC(&dc);
OnDraw(&dc)
}
<2>CClientDC構造函數:CClientDC(CWnd* pWnd); 構造一個CClientDC對象,它将存取pWnd指向的CWnd的客戶區。
// 滑鼠左鍵事件處理
void CExView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息處理程式代碼和/或調用預設值
CClientDC dc(this);//定義客戶區裝置環境
dc.LineTo(point);//繪制線段
}
<3>CWindowDC構造函數:CWindowDC( CWnd* pWnd );構造一個CWindowDC對象,它可以通路pWnd指向的CWnd對象的整個螢幕區域(包括客戶區和非客戶區)。比如我們在做螢幕保護程式時,一般以整個螢幕區域作為繪制區域。
2、設定坐标映射
3、建立繪圖工具并選入DC
MFC對GDI對象進行了很好的封裝,提供了封裝GDI對象的類,如CPen、CBrush、CFont、CBitmap和CPalette等,這些類都是GDI對象類CGdiObject的派生類。
例:
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、調用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類庫詳解--------------------------- |
摘自部落格網址:http://blog.csdn.net/phunxm/article/details/5083119