天天看點

MFC中GDI繪圖

一.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

繼續閱讀