4.3.1简单画刷
MFC中提供了一个CBrush类,可以用来创建画刷对象。
void CTestView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CBrush brush(RGB(255,0,0));
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush);
CView::OnLButtonUp(nFlags, point);
}
4.3.2位图画刷
CBrush类有这样一种构造函数:
CBrush( CBitmap* pBitmap );
CBitmap是一个位图类。创建CBitmap对象时,还需要利用LoadBitmap函数来加载一幅位图。
BOOL LoadBitmap( LPCTSTR lpszResourceName );
BOOL LoadBitmap( UINT nIDResource );
第一种以位图名形式加载,第二种是以资源ID形式加载。
第二种需要以资源ID来加载位图,首先为程序增加一个位图资源:
Insert菜单下->Resource->Bitmap资源,单击New,即可创建一个IDB_BITMAP1的位图资源,双击位图资源就可以利用位图编辑器来编辑位图。
另一种为程序增加位图资源的方法:
就是利用工具栏上面的资源工具栏按钮。
void CTestView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//CBrush brush(RGB(255,0,0));
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CBrush brush(&bitmap);
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush);
CView::OnLButtonUp(nFlags, point);
}
4.3.3透明画刷
之前我们创造的画刷,会覆盖其他的,因此我们创建一个透明画刷(非白色画刷)
GetStockObject获取一个画刷句柄,返回类型是HGDIOBJECT,需要进行强制类型转换;进行绘制要求一个画刷对象,所以需要调用FromHandle函数将画刷句柄转变成画刷对象。
void CTestView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
//将空画刷选入设备描述表,因为之前是指针类,所以前面不用加&
CBrush *pOldBrush=dc.SelectObject(pBrush);
//画一个矩形
dc.Rectangle(CRect(m_ptOrigin,point));
//恢复之前的画刷
dc.SelectObject(pOldBrush);
CView::OnLButtonUp(nFlags, point);
}
4.3.4静态成员函数
静态成员函数与静态成员变量属于类本身,可以通过类名::函数名或者类名::变量名,非静态成员变量和非静态成员函数,通过类的对象去引用。
4.4连续绘制线条
首先为CTestView添加鼠标移动消息(WM_MOUSEMOVE)的响应函数。
然后添加一个类成员变量(BOOL类型),鼠标左键按下为真,弹起来为假。在CTestView类的构造函数中先设置为假。
void CTestView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
if(m_bDraw==true)
{
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
m_ptOrigin=point;
}
CView::OnMouseMove(nFlags, point);
}
该函数的第二个参数就是当前鼠标的坐标,最开始是左键按下的位置。