求 有关图形有双缓冲问题(送分)

ljdyp 2004-12-13 01:55:59
急求有关图形有双缓冲方面的源码.主要目的是解决在图形有给制中有闪烁的现象.万分感谢!!!!
...全文
223 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
中级伴读 2005-01-28
  • 打赏
  • 举报
回复
先在内存DC上画一个白板(或者说背景吧)
qrlvls 2005-01-21
  • 打赏
  • 举报
回复
其实思想非常简单,就是内存DC当作屏幕DC一样的绘制,绘制完成后使用BitBlt复制到屏幕DC

CDC dcMem;
CBitmap bmpMem;
CBitmap *pOldBitmap;

dcMem.CreateCompatibleDC(&dc); // 创建与屏幕DC兼容的DC,这样BitBlt过去才是一样的坐标系
bmpMem.CreateCompatibleBitmap(&dc, rcBound); // 创建与屏幕DC颜色等兼容的位图
pOldBitmap = dcMem.SelectObject(&bmpMem); // 选择进内存DC,这样才能画在兼容位图上

... // 把dcMem 当作为 dc 一样的绘图

dc.BitBlt(rcBound.left, rcBound.top, rcBound.Width(), rcBound.Height(), &dcMem,
0, 0, SRCCOPY); // 将内存DC中的内容画到屏幕DC上
dcMem.SelectObject(pOldBitmap);
Featured 2005-01-20
  • 打赏
  • 举报
回复
这个太常见了啊。
alphakiller 2005-01-20
  • 打赏
  • 举报
回复
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();
bobob 2005-01-20
  • 打赏
  • 举报
回复
还有呀,就是Invaildate(false)
酒红绿叶 2005-01-20
  • 打赏
  • 举报
回复
^_^。注意申请的Rect大小。另外,吧EraseBKGround好像是这个函数屏蔽掉。不然白用。
送分的帖子就是人多。哈
evlon 2005-01-20
  • 打赏
  • 举报
回复
当然还要注意资源的释放
evlon 2005-01-20
  • 打赏
  • 举报
回复
就是,先创建一个和屏幕一样的内存DC
memDC.CreateCompatibleDC(pDC);
然后生成一张位图,要不在哪里画呀?
CBitmap memBmp;
pMemOldBMP = memDC.SelectObject(&memBMP);

在内存的DC上画东西

memDC.Draw()

最后把整个位图拷到屏幕上

pDC->BitBlt(rc.left, rc.top, bitmap.bmWidth, bitmap.bmHeight, &memDC, 0, 0, SRCCOPY);

xxduan 2005-01-20
  • 打赏
  • 举报
回复
双缓冲技术的主旨是在内存DC上把图画好,然后一次性贴到屏幕dc上,以解决快速重画造成的闪烁.
myling 2005-01-11
  • 打赏
  • 举报
回复
楼主不是指用DX实现吧……
powerbamboo 2005-01-11
  • 打赏
  • 举报
回复
我来画蛇添足
int nCheckCount = 0;
int nCount = m_lstMapFiles.GetItemCount();
CWnd* pWnd = GetDlgItem(IDC_STA_PREVIEWP);
CRect rc;
if(pWnd)
pWnd->GetWindowRect(rc);

ScreenToClient(rc);

CDC* pDC = GetDC();
BITMAP bitmap;

CDC memDC;
CBitmap* pMemOldBMP = NULL;
CBitmap memBMP;
memDC.CreateCompatibleDC(pDC);
memBMP.LoadBitmap(MAKEINTRESOURCE(IDB_MAP0));
pMemOldBMP = memDC.SelectObject(&memBMP);
memBMP.GetObject(sizeof(BITMAP), (LPSTR)&bitmap);
nCheckCount = 0;
for (int i=0; i<nCount; i++)
{
if (m_lstMapFiles.GetCheck(i))
{
nCheckCount += 1 ;
CDC tempDC;
CBitmap tempBMP;
CBitmap *pOldBMP = NULL;
tempDC.CreateCompatibleDC(pDC);
tempBMP.LoadBitmap(MAKEINTRESOURCE(IDB_MAP0+i+1));
pOldBMP = tempDC.SelectObject(&tempBMP);
tempBMP.GetObject(sizeof(BITMAP), (LPSTR)&bitmap);
::TransparentBlt(memDC.GetSafeHdc(),
0, 0, bitmap.bmWidth, bitmap.bmHeight, tempDC.GetSafeHdc(),
0, 0, bitmap.bmWidth, bitmap.bmHeight, RGB(0, 240, 255));

tempDC.SelectObject(pOldBMP);
tempDC.DeleteDC();
tempBMP.DeleteObject();
}
}
pDC->BitBlt(rc.left, rc.top, bitmap.bmWidth, bitmap.bmHeight, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pMemOldBMP);
memBMP.DeleteObject();
memDC.DeleteDC();
ReleaseDC(pDC);
xuzheng318 2005-01-11
  • 打赏
  • 举报
回复
帮楼主顶!
xenke 2005-01-11
  • 打赏
  • 举报
回复
up有分吗?上面的都讲了
Qiushen 2005-01-10
  • 打赏
  • 举报
回复
void CZjqChartView::OnPaint()
{
CPaintDC dc(this); // device context for painting

CRect rcClient;
GetClientRect(rcClient);

CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap tempbmp;
tempbmp.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
CBitmap* poldbmp=memdc.SelectObject(&tempbmp);
//memdc.FillSolidRect(rcClient,RGB(255,255,255));

//在memdc上画图了
CPen pen(PS_SOLID,2,RGB(255,255,255));
CPen* pOldPen = memdc.SelectObject(&pen);
//x轴
pOldPen = memdc.SelectObject(&pen);
memdc.MoveTo(rcClient.right-30,rcClient.bottom-30);
memdc.LineTo(rcClient.left+30,rcClient.bottom-30);
//画箭头
memdc.MoveTo(rcClient.right-35,rcClient.bottom-25);
memdc.LineTo(rcClient.right-30,rcClient.bottom-30);
memdc.MoveTo(rcClient.right-35,rcClient.bottom-35);
memdc.LineTo(rcClient.right-30,rcClient.bottom-30);

//y轴
pOldPen = memdc.SelectObject(&pen);
memdc.MoveTo(rcClient.left+30,rcClient.bottom-30);
memdc.LineTo(rcClient.left+30,rcClient.top+30);

//画箭头
memdc.MoveTo(rcClient.left+25,rcClient.top+35);
memdc.LineTo(rcClient.left+30,rcClient.top+30);
memdc.MoveTo(rcClient.left+35,rcClient.top+35);
memdc.LineTo(rcClient.left+30,rcClient.top+30);

//复制到dc上去.
dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&memdc,0,0,SRCCOPY);
//最后还要释放
ReleaseDC(&dc);
ReleaseDC(&memdc);
}
xundeng 2004-12-13
  • 打赏
  • 举报
回复
写一个给你看看吧
HDC memhdc1, memhdc2, hdc
hdc = GetDC(); //你要显示在屏幕上的DC
CreatcompatipeDC(memhdc, );
CBitmap bitmap1;
bitmap1.creatcompatipebitmap(); //must enough big
memhdc1.setobject(&bitmap1);
//在memhdc1上画图。
//
BltBit(hdc, ..., memhdc1, ...)

I_Love_CPP 2004-12-13
  • 打赏
  • 举报
回复
我有。
I.Love.Cpp@126.com

19,468

社区成员

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

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