让CDC输出的图形具有保持功能的三种方法-3
时间:2010-11-19 来源:Repository
思路首先利用当前绘制DC来创建一个兼容DC,创建完成之后
兼容DC相当于一个与它关联的DC的引用,好比一块画布,用户在这块画布上作图。当窗体重绘时,直接把这块画布上图形拷贝到当前DC,这样就达到了保持图形的功能。刚刚说到 一块画布,其实兼容DC采用一块和当前客户区域同样大小的位图作为画布。
具体代码如下:
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
dc.SelectObject(pBrush);
//如果已经创建兼容DC,则不再创建
if(!m_dcCompatible.m_hDC)
{
m_dcCompatible.CreateCompatibleDC(&dc);
CRect rect;
GetClientRect(&rect);
CBitmap bitmap;、
//构建一个和当前客户区大小一样的位图
bitmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
m_dcCompatible.SelectObject(&bitmap);
m_dcCompatible.BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);
m_dcCompatible.SelectObject(pBrush);
}
switch(m_nDrawType)
{
case 1:
m_dcCompatible.SetPixel(point,RGB(0,0,0));
break;
case 2:
m_dcCompatible.MoveTo(m_ptOrigin);
m_dcCompatible.LineTo(point);
break;
case 3:
m_dcCompatible.Rectangle(CRect(m_ptOrigin,point));
break;
case 4:
m_dcCompatible.Ellipse(CRect(m_ptOrigin,point));
break;
}
CScrollView::OnLButtonUp(nFlags, point);
}
当窗口需要重绘时,重新得用兼容DC来构建图形,代码如下:
void CGraphicView::OnDraw(CDC* pDC){
CGraphicDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect;
GetClientRect(&rect);
//使用拷贝的方式来重新绘制图形
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&m_dcCompatible,0,0,SRCCOPY);
}
这种方式比较简单,且通俗易懂。
这三个方法总算写完了,算是对自己学习的一种总结吧!
相关阅读 更多 +