用CDC的Rectangle函数绘制一个矩形,代码为
m_downPoint为CDrawView类的CPoint类型的私有成员,在OnLButtonDown函数中保存了鼠标左键按下的位置
void CDrawView::OnLButtonUp(UINT nFlags,CPoint point)
{
//创建并获得设备描述表
CClientDC dc(this);
//绘制矩形
dc.Rectangle(CRect(m_downPoint,point));
CView::OnLButtonUp(nFlags,point);
}
运行Draw程序,在程序窗口中绘制矩形,但是当绘制两个相互重叠的矩形时,后绘制的矩形遮盖住了先绘制的矩形。原因在于设备描述表中有一个默认的白色画刷,在绘图时会利用这个画刷填充矩形内部。
GetStockObject函数可以获取一个透明画刷。但是这个函数获取的是一个画刷句柄,而我们在进行绘制操作时需要的是一个画刷对象。如何从画刷句柄转化为一个画刷对象?利用CBrush类提供的FromeHandle函数可以实现这个功能。
void CDrawView::OnLButtonUp(UINT nFlags,CPoint point)
{
//创建并获得设备描述表
CClientDC dc(this);
//得到透明画刷句柄
HBRUSH hb = (HBRUSH) GetStockObject(NULL_BRUSH);
//把画刷句柄转化为画刷对象
CBrush* brush = CBrush::FromHandle(hb);
//将透明画刷选入设备描述表
CBrush *pOldBrush = dc.SelectObject(brush);
//绘制矩形
dc.Rectangle(CRect(m_downPoint,point));
//回复先前的画刷
dc.SelectObject(pOldBrush);
CView::OnLButtonUp(nFlags,point);
}
注意:
1.FromeHandle函数原型为 static CBrush* PASCAL FromHandle( HBRUSH hBrush );是一个静态函数,所以用CBrush::FromHandle(hb)调用方式!
2.GetStockObject函数原型为HGDIOBJ GetStockObject( int fnObject ),返回类型为HGDIOBj,所以需要一个强制类型转换,将其转换为HBRUSH类型的
3.FileRect和Rectangle函数都能绘制矩形,但是FileRect函数在参数中提供了绘制使用的画刷,因此他就直接利用此画刷填充矩形,并不需要先把需要的画刷选入设备描述表中。而Rectangle并没有提供这个参数,因此先要把需要的画刷选入设备描述表中,然后再调用此函数来绘制矩形。
m_downPoint为CDrawView类的CPoint类型的私有成员,在OnLButtonDown函数中保存了鼠标左键按下的位置
void CDrawView::OnLButtonUp(UINT nFlags,CPoint point)
{
//创建并获得设备描述表
CClientDC dc(this);
//绘制矩形
dc.Rectangle(CRect(m_downPoint,point));
CView::OnLButtonUp(nFlags,point);
}
运行Draw程序,在程序窗口中绘制矩形,但是当绘制两个相互重叠的矩形时,后绘制的矩形遮盖住了先绘制的矩形。原因在于设备描述表中有一个默认的白色画刷,在绘图时会利用这个画刷填充矩形内部。
GetStockObject函数可以获取一个透明画刷。但是这个函数获取的是一个画刷句柄,而我们在进行绘制操作时需要的是一个画刷对象。如何从画刷句柄转化为一个画刷对象?利用CBrush类提供的FromeHandle函数可以实现这个功能。
void CDrawView::OnLButtonUp(UINT nFlags,CPoint point)
{
//创建并获得设备描述表
CClientDC dc(this);
//得到透明画刷句柄
HBRUSH hb = (HBRUSH) GetStockObject(NULL_BRUSH);
//把画刷句柄转化为画刷对象
CBrush* brush = CBrush::FromHandle(hb);
//将透明画刷选入设备描述表
CBrush *pOldBrush = dc.SelectObject(brush);
//绘制矩形
dc.Rectangle(CRect(m_downPoint,point));
//回复先前的画刷
dc.SelectObject(pOldBrush);
CView::OnLButtonUp(nFlags,point);
}
注意:
1.FromeHandle函数原型为 static CBrush* PASCAL FromHandle( HBRUSH hBrush );是一个静态函数,所以用CBrush::FromHandle(hb)调用方式!
2.GetStockObject函数原型为HGDIOBJ GetStockObject( int fnObject ),返回类型为HGDIOBj,所以需要一个强制类型转换,将其转换为HBRUSH类型的
3.FileRect和Rectangle函数都能绘制矩形,但是FileRect函数在参数中提供了绘制使用的画刷,因此他就直接利用此画刷填充矩形,并不需要先把需要的画刷选入设备描述表中。而Rectangle并没有提供这个参数,因此先要把需要的画刷选入设备描述表中,然后再调用此函数来绘制矩形。