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物件從裝置環境中分離出來。