[讨论]为什么我的双缓存不能正确运行?

larntin2002 2005-01-07 10:11:41
在晚上找了一些资料,也下了一些程序,看过一些FAQ,之后自己动手写了一下,发现按照经典的步骤:
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象

//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画 ^_^
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);

//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);

//先用背景色将位图清除干净,这里我用的是白色作为背景
//你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));

//绘图
MemDC.MoveTo(……);
MemDC.LineTo(……);

//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);

//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();

之后又重载了:WM_ERASEBKGND消息

我自己的程序:
void CSlidView::OnPaint()
{
CPaintDC dc(this);
CRect clientRect;
GetClientRect( &clientRect );
CDC MemDC;
CBitmap Membitmap;
Membitmap.CreateCompatibleBitmap( &dc, clientRect.Width(), clientRect.Height() );
MemDC.CreateCompatibleDC( &dc );
CBitmap *pOldBitmap = MemDC.SelectObject( &Membitmap );
MemDC.FillSolidRect( 0, 0, clientRect.Width(), clientRect.Height(), RGB( 255, 255, 255 ) );
MemDC.Ellipse( &clientRect );
dc.BitBlt( 0, 0, clientRect.Width(), clientRect.Height(), &MemDC, 0, 0, SRCCOPY );
MemDC.DeleteDC();
Membitmap.DeleteObject();
}

BOOL CSlidView::OnEraseBkgnd(CDC* pDC)
{
return CView::OnEraseBkgnd(pDC);
}
...全文
169 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
KevinWon 2005-01-09
  • 打赏
  • 举报
回复
借贵宝地问一下 其实重载OnPaint 和重载OnDraw有些什么不同呢?需要注意些什么?
pomelowu 2005-01-09
  • 打赏
  • 举报
回复
OnPaint是对WM_PAINT消息的直接响应,而OnDraw则是在OnPaint中调用的。
小李匪盗 2005-01-07
  • 打赏
  • 举报
回复
已经有一个pDC了,为什么还要CPaintDC dc(this);
pomelowu 2005-01-07
  • 打赏
  • 举报
回复
在OnDraw里就好好的用系统提供的pDC
pomelowu 2005-01-07
  • 打赏
  • 举报
回复
void CSlidView::OnDraw(CDC* pDC)
{
CSDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

CRect clientRect;
GetClientRect( &clientRect );
CDC MemDC;
CBitmap Membitmap;
Membitmap.CreateCompatibleBitmap( pDC, clientRect.Width(), clientRect.Height() );
MemDC.CreateCompatibleDC( pDC );
CBitmap *pOldBitmap = MemDC.SelectObject( &Membitmap );
MemDC.FillSolidRect( 0, 0, clientRect.Width(), clientRect.Height(), RGB( 255, 255, 255 ) );
MemDC.Ellipse( &clientRect );
pDC->BitBlt( 0, 0, clientRect.Width(), clientRect.Height(), &MemDC, 0, 0, SRCCOPY );
Membitmap.DeleteObject();
MemDC.DeleteDC();
}
larntin2002 2005-01-07
  • 打赏
  • 举报
回复
void CSlidView::OnDraw(CDC* pDC)
{
CSlidDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

CPaintDC dc(this);
CRect clientRect;
GetClientRect( &clientRect );
CDC MemDC;
CBitmap Membitmap;
Membitmap.CreateCompatibleBitmap( &dc, clientRect.Width(), clientRect.Height() );
MemDC.CreateCompatibleDC( &dc );
CBitmap *pOldBitmap = MemDC.SelectObject( &Membitmap );
MemDC.FillSolidRect( 0, 0, clientRect.Width(), clientRect.Height(), RGB( 255, 255, 255 ) );
MemDC.Ellipse( &clientRect );
dc.BitBlt( 0, 0, clientRect.Width(), clientRect.Height(), &MemDC, 0, 0, SRCCOPY );
MemDC.DeleteDC();
Membitmap.DeleteObject();
}

多谢两位的指点^_^
如果我没有理解错的话,我把重载的OnPaint函数删掉,放到OnDraw之后,应该是这样吧?
这下连椭圆都没有了......
快乐鹦鹉 2005-01-07
  • 打赏
  • 举报
回复
你把双缓存的程序放到OnPaint函数中,当然什么用处也没有了。本身用双缓存的方法就是为了替换OnPaint来消除抖动的。
将双缓存程序另建一个函数。在需要刷新的地方调用这个函数,而不是去调用OnPaint。
pomelowu 2005-01-07
  • 打赏
  • 举报
回复
汗~~在View类里边请重载OnDraw
在Dialog类里边才是重载OnPaint

不信的话,你可以新建一个空白的MFC Dialog based程序,把你这里的OnPaint贴到这个程序的OnPaint中,就能看到效果了。
samsun2000 2005-01-07
  • 打赏
  • 举报
回复
使用双缓存的程序效果应该是什么样?
larntin2002 2005-01-07
  • 打赏
  • 举报
回复
发现自己的程序运行后,和没有使用双缓存的程序效果是一样的,郁闷ing
pomelowu 2005-01-07
  • 打赏
  • 举报
回复
在界面(如果没记错的话)版搜“双缓存”,有不少介绍如何防止抖动的帖子。
hyamw 2005-01-07
  • 打赏
  • 举报
回复
抖动的话,在OnEraseBkgnd()里面
return TRUE;
larntin2002 2005-01-07
  • 打赏
  • 举报
回复
TO:pomelowu(羽战士)

哈哈,说的对啊......我在继续研究,等到我搞定双缓存了,就结帖啊^_^

顺便说一句,你给的程序段我试过了......还是抖动

19,468

社区成员

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

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