首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

MFC 双缓冲画橡皮条线段,只好画一条?

2013-01-13 
MFC 双缓冲画橡皮条线段,只能画一条???双缓冲画橡皮条线段,画完一条以后,再画的话就覆盖前面的,请问怎么解

MFC 双缓冲画橡皮条线段,只能画一条???
双缓冲画橡皮条线段,画完一条以后,再画的话就覆盖前面的,请问怎么解决这个?先谢谢了
[解决办法]
这是我曾经做过的一个 希望对你有帮助


void CCMetaFileTestView::OnMouseMove(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
/*if(m_bFlagDown == TRUE)
{
m_dcMetaFile.SetPixel(point,RGB(0,0,0));
switch(m_nType)
{
case 1:
m_dcMetaFile.SetROP2(R2_NOT);
m_dcMetaFile.MoveTo(m_srcPoint);
m_dcMetaFile.LineTo(m_destPoint);
m_dcMetaFile.MoveTo(m_srcPoint);
m_dcMetaFile.LineTo(point);
m_destPoint = point;
Invalidate();
break;
case 2:
m_dcMetaFile.SetROP2(R2_NOTXORPEN);
m_dcMetaFile.Rectangle(CRect(m_srcPoint,m_destPoint));
m_destPoint = point;
Invalidate();
break;
}
}
*/
if(m_bFlagDown == TRUE)
{
if(!m_dcMem.m_hDC)
{
CClientDC dc(this);
m_dcMem.CreateCompatibleDC(&dc);
CRect rct;
GetClientRect(&rct);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc,rct.Width(),rct.Height());
m_dcMem.SelectObject(&bitmap);
m_dcMem.BitBlt(0,0,rct.Width(),rct.Height(),&dc,0,0,SRCCOPY);
m_dcMem.SetPixel(point,RGB(0,0,0));
}
switch(m_nType)
{
case 1:
m_dcMem.SetROP2(R2_NOTXORPEN);
m_dcMem.MoveTo(m_srcPoint);
m_dcMem.LineTo(m_destPoint);
m_dcMem.MoveTo(m_srcPoint);
m_dcMem.LineTo(point);
m_destPoint = point;
Invalidate();
break;
case 2:
m_dcMem.SetROP2(R2_NOTXORPEN);
m_dcMem.Rectangle(CRect(m_srcPoint,m_destPoint));
m_dcMem.Rectangle(CRect(m_srcPoint,point));
m_destPoint = point;
Invalidate();
break;

}
}
CScrollView::OnMouseMove(nFlags, point);
}

BOOL CCMetaFileTestView::OnEraseBkgnd(CDC* pDC) 
{
// TODO: Add your message handler code here and/or call default
return TRUE;
return CScrollView::OnEraseBkgnd(pDC);
}

void CCMetaFileTestView::OnDraw(CDC* pDC)
{
CCMetaFileTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

CRect rect;
GetClientRect(&rect);
pDC->FillSolidRect(&rect,RGB(255,255,255));
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&m_dcMem,0,0,SRCCOPY);
// TODO: add draw code for native data here
}
[解决办法]

void CDynamicDrawLineView::OnLButtonDown(UINT nFlags, CPoint point) 
{
m_start = point;
CView::OnLButtonDown(nFlags, point);
}

void CDynamicDrawLineView::OnMouseMove(UINT nFlags, CPoint point) 
{
 if (nFlags & MK_LBUTTON && m_memDC != NULL)

m_end=point;
CRect rc;
GetClientRect(&rc);
CDC* pDC = GetDC();
pDC->BitBlt(0, 0, rc.Width(), rc.Height(), m_memDC, 0, 0, SRCCOPY);
pDC->MoveTo(m_start);
pDC->LineTo(m_end);
}
CView::OnMouseMove(nFlags, point);
}

void CDynamicDrawLineView::OnLButtonUp(UINT nFlags, CPoint point) 


{
m_end = point;
CRect rc;
GetClientRect(&rc);
m_memDC->MoveTo(m_start);
m_memDC->LineTo(m_end);
Invalidate();
CView::OnLButtonUp(nFlags, point);
}

void CDynamicDrawLineView::OnPaint() 
{
CPaintDC dc(this); // device context for painting
if(m_memDC == NULL)
{
CRect rc;
GetClientRect(&rc);
m_memDC = new CDC();
m_memDC->CreateCompatibleDC(this->GetDC());
CBitmap bm;
bm.CreateCompatibleBitmap(this->GetDC(),rc.Width(),rc.Height());
CBitmap *oldbm=m_memDC->SelectObject(&bm);
m_memDC->FillSolidRect(0, 0, rc.Width(), rc.Height(), RGB(255, 255, 255));
}
CRect rc;
GetClientRect(&rc);
dc.BitBlt(0,0,rc.Width(),rc.Height(),m_memDC,0,0,SRCCOPY);
}


要不然你可以这么做,不用一条一条线条保存。当mousemove的时候直接在显示DC上bitblt(memDC),然后绘制直线,只有当OnLButtonUp的时候将绘制在memDC上面,这样下一次mousemove的时候用的memDC就是画了之前那些线段的图像了

热点排行