1. 程式人生 > >MFC畫圖(畫線、畫矩形、畫刷畫筆的使用)

MFC畫圖(畫線、畫矩形、畫刷畫筆的使用)

繪製任意線條:

1、建立基於單文件工程:Draw

CDrawView類中新增成員變數:

CPoint m_ptOrigin;

BOOL m_bDraw;

2、CDrawView()中初始化:

m_ptOrigin = point;

m_bDraw = false;

3、新增訊息響應函式:

WM_LBUTTONDOWN    WM_LBUTTONUP  WM_MOUSEMOVE

4、左鍵按下時:

m_ptOrigin = point;

m_bDraw = true;

5、左鍵擡起:

m_bDraw = false;

6、滑鼠移動時:

    //畫連續線條

CClientDC dc(this);

if(m_bDraw)

    {

       dc.MoveTo(m_ptOrigin);

       dc.LineTo(point);

       m_ptOrigin = point;

    }

    //畫扇形線條

CClientDC dc(this);

    if(m_bDraw)

    {

       dc.MoveTo(m_ptOrigin);

       dc.LineTo(point);

    }

    //畫帶外包線的扇形線條

析:畫帶外包線的扇形線條,不光記錄初始位置,還要記錄滑鼠移動上一位置。

新增成員變數:

CPoint m_ptOld;

在滑鼠左鍵按下時初始化:

m_ptOld = point;

在滑鼠移動時進行改變:

CClientDC dc(this);

    if(m_bDraw)

    {

       dc.MoveTo(m_ptOrigin);

       dc.LineTo(m_ptOld);

       dc.MoveTo(m_ptOld);

       dc.LineTo(point);

       m_ptOld = point;

    }

畫矩形:

畫無邊框的矩形

方法說明:利用FillRect函式填充矩形。填充內容為畫刷的內容,即畫刷物件的指標。

     CBrush brush(RGB(5,255,255));

     CClientDC dc(this);

     dc.FillRect(CRect(m_ptOrigin,point),&brush);

以點陣圖作為畫刷的資源

     CBitmap bitmap;

     bitmap.LoadBitmap(IDB_BITMAP1); 

     CBrush brush(&bitmap);

     CClientDC dc(this);

     dc.FillRect(CRect(m_ptOrigin,point),&brush);

畫有邊框的矩形

方法說明:利用Rectangle方法來畫矩形。其中CBrush與CPen類分別負責矩形內部和矩形邊框的屬性

     //畫中心為白色的矩形

     CClientDC dc(this);

     dc.Rectangle(CRect(m_ptOrigin,point));

     //畫中心為透明的矩形

     CClientDC dc(this);

CBrush *pBrush=CBrush::FromHandle((HBRUSH)

GetStockObject(NULL_BRUSH));

     CBrush *pOldBrush=dc.SelectObject(pBrush);

     dc.Rectangle(CRect(m_ptOrigin,point));

     pOldBrush=pBrush;

//畫中心為透明邊為任意顏色的矩形

     CClientDC dc(this);

     CPen pen(PS_SOLID,1,RGB(234,23,53));

     CPen *pOldPen=dc.SelectObject(&pen);

     CBrush *pBrush=CBrush::FromHandle((HBRUSH)

GetStockObject(NULL_BRUSH))

     CBrush *pOldBrush=dc.SelectObject(pBrush);

     dc.Rectangle(CRect(m_ptOrigin,point));

     dc.SelectObject(pOldPen);

     dc.SelectObject(pOldBrush);

使用畫筆、畫刷

在OnLButtonUp函式中:

/////////////////////////////////////////////////////////////////

CPen pen(PS_SOLID,1,RGB(234,23,53));

//定義一個CPen類物件,並利用RGB巨集改變其顏色

CClientDC dc(this);

CPen *pOldPen=dc.SelectObject(&pen); //將其選入裝置表

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);

dc.SelectObject(pOldPen); 

/////////////////////////////////////////////////////////////////

CBrush brush(RGB(0,255,0)); 

CClientDC dc(this); 

CRect rect(m_ptOrigin,point); 

dc.FillRect(&rect,&brush); 

/////////////////////////////////////////////////////////////////

使用點陣圖建立畫刷:

插入->資源->點陣圖->引入,可以引入點陣圖,初始一般命名為:IDB_BITMAP1

CBitmap bitmap; 

bitmap.LoadBitmap(IDB_BITMAP1); 

CBrush brush(&bitmap); 

CClientDC dc(this); 

CRect rect(m_ptOrigin,point); 

dc.FillRect(&rect,&brush);

/////////////////////////////////////////////////////////////////

CBrush *brush; 

brush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));

CClientDC dc(this); 

CBrush *pOldBrush =dc.SelectObject(brush) ;  

dc.Rectangle(CRect(m_ptOrigin,point)); 

dc.SelectObject(pOldBrush) ; 

注:

常用的繪圖裝置類物件的建立和將其引入到裝置環境中的方法

在選擇繪圖裝置類物件(GDI物件)進行繪圖時,一般可按下列步驟進行:

(1)定義一個GDI物件,然後呼叫相應的函式(如CreatePen、CreateSolidBrush等)建立此GDI物件。

(2)將已構造出的GDI物件利用裝置環境類物件的成員函式SelectObject選入到當前環境中,並同時將原來的GDI物件儲存起

來。

(3)繪圖結束後,恢復當前裝置環境中原來的GDI物件。

注意:在Windows系統中包含了一些庫存的GDI物件,在第(3)步中可直接利用裝置環境類(CDC)的成員函式

SelectStockObject將一個Windows庫存的GDI物件選入,系統可自動將原來選入的GDI物件從裝置環境中分離出來。