关于移动滚动条时,Draw所发生的错误

icegirl914 2005-08-12 05:14:27
void CDRAWView::OnDraw(CDC* pDC)
{
CDC MemDC; //定义一个显示设备对象
CBitmap MemBitmap; //定义一个位图对象
CRect reClip; //操作区域
int nWidth; //宽度
int nHeight; //高度

CDRAWDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

GetClientRect(&reClip); //得到区域矩形
nWidth = reClip.right - reClip.left; //得到区域宽度
nHeight = reClip.bottom - reClip.top;//得到区域高度

MemDC.CreateCompatibleDC(NULL); //建立与屏幕显示兼容的内存显示设备
//建立一个与屏幕显示兼容的位图
MemBitmap.CreateCompatibleBitmap(pDC, nWidth, nHeight); //将位图选入到内存显示设备中
CBitmap *pOldBit = MemDC.SelectObject(&MemBitmap); //用背景色将位图清除
MemDC.FillSolidRect(0, 0, nWidth, nHeight, m_BackColor);

pDoc->Draw(&MemDC, 0, 0, m_BackColor, pDoc->m_fBlc); //画图
//将内存中的图拷贝到屏幕上显示
pDC->BitBlt(0, 0, nWidth, nHeight, &MemDC, 0, 0, SRCCOPY);
MemDC.SelectObject(pOldBit);
MemBitmap.DeleteObject(); //清除位图对象
MemDC.DeleteDC(); //清除设备对象
}

这是我用双缓冲来绘图的,但是我发现当我的一个图元超过一个屏幕时,我拉动滚动条,会出来二个有重叠的图元,请问这是怎么回事,应该如何来解决?
...全文
144 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
chenzunshi3 2005-08-22
http://www.somade.com/是个很专业的技术社区,去那里找找吧,或许有你要的答案~
回复
icegirl914 2005-08-22
我用以下语句试了一下,还是不行:
pDC->BitBlt(0, 0, nWidth, nHeight, &MemDC, scrollPos.x, scrollPos.y, SRCCOPY); //将内存中的图拷贝到屏幕上显示
难道没有办法解决了吗?
回复
icegirl914 2005-08-22
谢谢chenzunshi3(),我看了那个网站,没有我想要的资料
回复
willwl 2005-08-17
OnPrepareDc()重置了视口原点
但设备点(0,0)始终位于客户区左上角
回复
icegirl914 2005-08-15
明白了,谢谢ChenJF206,我试试
回复
colme 2005-08-15
难道不是OnPrepareDc()可以自动调整偏移量的啊?
回复
ChenJF206 2005-08-12
根据滚动条滑块的位置获得偏移量,比如向下滑动了50px,则绘制的时候Y值要-50px;也就是说你的绘制代码里面要加入偏移量来计算,同时重载滚动条的响应函数来获得偏移量
回复
icegirl914 2005-08-12
对不起,能不能说的清楚一点
回复
ChenJF206 2005-08-12
记录偏移量,绘制的时候根据偏移量计算准确的绘制位置
回复
发帖
界面
创建于2007-09-28

1.5w+

社区成员

VC/MFC 界面
申请成为版主
帖子事件
创建了帖子
2005-08-12 05:14
社区公告
暂无公告