繪制任意線條:
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對象從設備環境中分離出來。