使用ScrollView,拖动滚动条,图形重叠的问题?

djhdu 2004-11-22 04:02:36
我使用ScrollView,然后使用双缓存的方式画图,当我拖动滚动条的时候,图形重叠到
一块了,这个问题如何解决呢?
下面是我的代码,请帮帮我!

CTestView::CTestView()
{
// TODO: add construction code here
m_pMemoryDC=new CDC;
m_pBitmap=new CBitmap;
}

/////////////////////////////////////////////////////////////////////////////
// CTestView drawing

void 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);
}
...全文
502 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
净天宇 2004-12-10
  • 打赏
  • 举报
回复
UP
djhdu 2004-11-24
  • 打赏
  • 举报
回复
谢谢,问题解决了,下面是我的OnDraw里面的代码

CDC MemDC; //首先定义一个显示设备对象
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滚动有问题的朋友可以考虑使用这种方法,

谢谢大家的回答!

djhdu 2004-11-23
  • 打赏
  • 举报
回复
谁来帮帮我啊?
djhdu 2004-11-23
  • 打赏
  • 举报
回复
我现在就是在OnDraw里面画图,使用m_pMemoryDC->CreateCompatibleDC(pDC)产生的m_pMemoryDC,该如何改呢?
handwolf 2004-11-23
  • 打赏
  • 举报
回复
//坐标变换需要看你要做什么而定的,现在很难猜测怎么变换,再试试这个
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();

}
djhdu 2004-11-23
  • 打赏
  • 举报
回复
谢谢,不过我测试了一下,还是那种情况阿,还是不行!
handwolf 2004-11-23
  • 打赏
  • 举报
回复
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);

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();

}
djhdu 2004-11-23
  • 打赏
  • 举报
回复
如何转换呢,不要说一半阿,本人对画图部分比较生,请高手说的清楚一点!
UDX协议 2004-11-23
  • 打赏
  • 举报
回复
是坐标的问题。
拖动以后转成物理坐标,重画就ok
I_Love_CPP 2004-11-22
  • 打赏
  • 举报
回复
在你涉及画图的地方调用:
OnPrepareDC(&dc);

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧