关于双缓冲问题  有代码  请前辈帮看看

liujiandong972329 2008-12-11 10:36:10
 我在一幅矢量图上定时画东西,我用到了双缓冲,但是运行的时候,当定时启动画东西时,
一直有一个白框闪,遮住了矢量图,不知哪写得不对,我是新手,最好有代码,请前辈们帮帮忙!!
在CmyView::OnDraw(CDC *pDC)中调入的自己画东西的函数:
  
  部分代码如下:
    在画东西的函数中:

    CDC MemDC;
CBitmap MemBitmap;

MemDC.CreateCompatibleDC(pDC);
    CRect rect;
GetClientRect(&rect);
MemBitmap.CreateCompatibleBitmap(pDC,rect.Width()-200,rect.Height());
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,rect.Width()-200,rect.Height(),RGB(255,255,255));
MemDC.SetBkMode(TRANSPARENT);

.... 这段是我画东西的代码 略
 
   pDC->BitBlt(0,0,rect.Width()-200,rect.Height(),&MemDC,0,0,SRCCOPY);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
  







...全文
72 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
littlefangMFC 2008-12-12
  • 打赏
  • 举报
回复
第一步:在视类中添加响应函数OnEraseBkgnd(CDC* pDC);(是添加,不是自己写)
在其中禁用背景刷新:
BOOL CTrackerView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return TRUE;

//return CView::OnEraseBkgnd(pDC);
}
第二步:在OnDraw函数中调用上面的函数
OnEraseBkgnd(pDC);
第三步: /////////防闪烁程序段1开始/////////////////////////////////
CRect myrect;
GetClientRect(&myrect);
CDC dcMem; //用于缓冲作图的内存DC
CDC* pMem=&dcMem;
CBitmap bmp; //内存中承载临时图象的位图
dcMem.CreateCompatibleDC(pDC); //依附窗口DC创建兼容内存DC
bmp.CreateCompatibleBitmap(pDC,myrect.Width(),myrect.Height());//创建兼容位图
dcMem.SelectObject(&bmp); //将位图选择进内存DC
//按原来背景填充客户区,不然会是黑色
dcMem.FillSolidRect(myrect,pDC->GetBkColor());
/////////防闪烁程序段1结束/////////////////////////////////

此处加入自己要绘的图的程序,CDC指针要用pMem;

/////////防闪烁程序段2开始/////////////////////////////////
pDC->BitBlt(0,0,myrect.Width(),myrect.Height(), &dcMem,0,0,SRCCOPY);//将内存DC上的图象拷贝到前台
dcMem.DeleteDC(); //删除DC
bmp.DeleteObject(); //删除位图
/////////防闪烁程序段2结束/////////////////////////////////

19,464

社区成员

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

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