我使用ScrollView,然后使用双缓存的方式画图,当我拖动滚动条的时候,图形重叠到
一块了,这个问题如何解决呢?
下面是我的代码,请帮帮我!CTestView::CTestView()
{
// TODO: add construction code here
m_pMemoryDC=new CDC;
m_pBitmap=new CBitmap;
}/////////////////////////////////////////////////////////////////////////////
// CTestView drawingvoid CTestView::OnDraw(CDC* pDC)
{
CSize sizeTotal;
sizeTotal.cx=1000;
sizeTotal.cy=5000;
SetScrollSizes(MM_TEXT, sizeTotal);
CRect rect;
CPoint ScrollPoint=GetScrollPosition();
TRACE("滚动位置:x=%d,y=%d\n",ScrollPoint.x,ScrollPoint.y);
GetClientRect(&rect);
m_pMemoryDC->CreateCompatibleDC(pDC);
m_pBitmap->CreateCompatibleBitmap(pDC,rect.right+1,rect.bottom+1);
CBitmap * pOldbmp=m_pMemoryDC->SelectObject(m_pBitmap);
m_pMemoryDC->SelectStockObject(WHITE_BRUSH);
m_pMemoryDC->Rectangle(0,0,rect.right,rect.bottom);
m_pMemoryDC->SelectStockObject(NULL_BRUSH); m_pMemoryDC->MoveTo(0,0);
m_pMemoryDC->LineTo(1000,5000);
pDC->BitBlt(ScrollPoint.x,ScrollPoint.y,
ScrollPoint.x+rect.right,
ScrollPoint.y+rect.bottom,
m_pMemoryDC,0,0,SRCCOPY);
m_pMemoryDC->SelectObject(pOldbmp);
m_pBitmap->DeleteObject();
m_pMemoryDC->DeleteDC();}
BOOL CTestView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return CScrollView::OnEraseBkgnd(pDC);
}void CTestView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}void CTestView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}
一块了,这个问题如何解决呢?
下面是我的代码,请帮帮我!CTestView::CTestView()
{
// TODO: add construction code here
m_pMemoryDC=new CDC;
m_pBitmap=new CBitmap;
}/////////////////////////////////////////////////////////////////////////////
// CTestView drawingvoid CTestView::OnDraw(CDC* pDC)
{
CSize sizeTotal;
sizeTotal.cx=1000;
sizeTotal.cy=5000;
SetScrollSizes(MM_TEXT, sizeTotal);
CRect rect;
CPoint ScrollPoint=GetScrollPosition();
TRACE("滚动位置:x=%d,y=%d\n",ScrollPoint.x,ScrollPoint.y);
GetClientRect(&rect);
m_pMemoryDC->CreateCompatibleDC(pDC);
m_pBitmap->CreateCompatibleBitmap(pDC,rect.right+1,rect.bottom+1);
CBitmap * pOldbmp=m_pMemoryDC->SelectObject(m_pBitmap);
m_pMemoryDC->SelectStockObject(WHITE_BRUSH);
m_pMemoryDC->Rectangle(0,0,rect.right,rect.bottom);
m_pMemoryDC->SelectStockObject(NULL_BRUSH); m_pMemoryDC->MoveTo(0,0);
m_pMemoryDC->LineTo(1000,5000);
pDC->BitBlt(ScrollPoint.x,ScrollPoint.y,
ScrollPoint.x+rect.right,
ScrollPoint.y+rect.bottom,
m_pMemoryDC,0,0,SRCCOPY);
m_pMemoryDC->SelectObject(pOldbmp);
m_pBitmap->DeleteObject();
m_pMemoryDC->DeleteDC();}
BOOL CTestView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return CScrollView::OnEraseBkgnd(pDC);
}void CTestView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}void CTestView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}
OnPrepareDC(&dc);
{
CSize sizeTotal;
sizeTotal.cx=1000;
sizeTotal.cy=5000;
SetScrollSizes(MM_TEXT, sizeTotal);//在这里调用是不合理的 OnPrepareDC(m_pMemoryDC);//增加这一句 CRect rect;
CPoint ScrollPoint=GetScrollPosition();
TRACE("滚动位置:x=%d,y=%d\n",ScrollPoint.x,ScrollPoint.y);
GetClientRect(&rect); m_pMemoryDC->LPtoDP(rect);//增加这一句
m_pMemoryDC->CreateCompatibleDC(pDC);
m_pBitmap->CreateCompatibleBitmap(pDC,rect.right+1,rect.bottom+1);
CBitmap * pOldbmp=m_pMemoryDC->SelectObject(m_pBitmap);
m_pMemoryDC->SelectStockObject(WHITE_BRUSH);
m_pMemoryDC->Rectangle(0,0,rect.right,rect.bottom);
m_pMemoryDC->SelectStockObject(NULL_BRUSH); m_pMemoryDC->MoveTo(0,0);
m_pMemoryDC->LineTo(1000,5000);//这里也可能要转一下
pDC->BitBlt(ScrollPoint.x,ScrollPoint.y,
ScrollPoint.x+rect.right,
ScrollPoint.y+rect.bottom,
m_pMemoryDC,0,0,SRCCOPY);
m_pMemoryDC->SelectObject(pOldbmp);
m_pBitmap->DeleteObject();
m_pMemoryDC->DeleteDC();}
void CTestView::OnDraw(CDC* pDC)
{
CSize sizeTotal;
sizeTotal.cx=1000;
sizeTotal.cy=5000;
SetScrollSizes(MM_TEXT, sizeTotal);//在这里调用是不合理的 OnPrepareDC(m_pMemoryDC);//增加这一句 CRect rect;
CPoint ScrollPoint=GetScrollPosition();
TRACE("滚动位置:x=%d,y=%d\n",ScrollPoint.x,ScrollPoint.y);
GetClientRect(&rect); m_pMemoryDC->LPtoDP(rect);//增加这一句
m_pMemoryDC->CreateCompatibleDC(pDC);
m_pBitmap->CreateCompatibleBitmap(pDC,rect.right+1,rect.bottom+1);
CBitmap * pOldbmp=m_pMemoryDC->SelectObject(m_pBitmap);
m_pMemoryDC->SelectStockObject(WHITE_BRUSH);
m_pMemoryDC->Rectangle(0,0,rect.right,rect.bottom);
m_pMemoryDC->SelectStockObject(NULL_BRUSH); CPoint ptStart(0,0),ptEnd(1000,5000);
m_pMemoryDC->LPtoDP(ptStart);//增加这一句
m_pMemoryDC->LPtoDP(ptEnd);//增加这一句
m_pMemoryDC->MoveTo(ptStart);//更改
m_pMemoryDC->LineTo(ptEnd);//更改 pDC->BitBlt(ScrollPoint.x,ScrollPoint.y,
ScrollPoint.x+rect.right,
ScrollPoint.y+rect.bottom,
m_pMemoryDC,0,0,SRCCOPY);
m_pMemoryDC->SelectObject(pOldbmp);
m_pBitmap->DeleteObject();
m_pMemoryDC->DeleteDC();}
CBitmap MemBitmap;//定义一个位图对象
MemDC.CreateCompatibleDC(pDC);
MemBitmap.CreateCompatibleBitmap(pDC,1000,5000);
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,1000,5000,RGB(0,20,255));
MemDC.Rectangle(100,100,200,200);
MemDC.Rectangle(800,3000,900,3100);
pDC->BitBlt(0,0,
1000,
5000,
&MemDC,0,0,SRCCOPY);
//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();然后把OnEraseBkgnd改为return TRUE我的想法是创建的内存图片大小是设置的滚动视图的大小,而不是屏幕的大小
然后再画图过程中,我可以随便画在超出屏幕大小的范围,然后使用Bitblt拷贝的时候,要拷贝滚动试图的大小,而不是窗口的大小,这样我就不需要判断当前滚动条的位置了,当然,这种方法比较浪费资源,不过我觉得条理还是比较清晰的,如果使用ScrollView滚动有问题的朋友可以考虑使用这种方法,谢谢大家的回答!