社区
图形处理/算法
帖子详情
求 有关图形有双缓冲问题(送分)
ljdyp
2004-12-13 01:55:59
急求有关图形有双缓冲方面的源码.主要目的是解决在图形有给制中有闪烁的现象.万分感谢!!!!
...全文
228
16
打赏
收藏
求 有关图形有双缓冲问题(送分)
急求有关图形有双缓冲方面的源码.主要目的是解决在图形有给制中有闪烁的现象.万分感谢!!!!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
vc
双缓冲
技术
双缓冲
技术在VC++编程中是一种优化
图形
更新和防止屏幕闪烁的重要策略。它主要用于GUI(
图形
用户界面)应用程序,尤其是在涉及到频繁的
图形
绘制和窗口重绘时。在没有
双缓冲
的情况下,每次
图形
更新都可能在屏幕上产生...
MFC
双缓冲
移动
图形
双缓冲
技术是解决
图形
更新时闪烁
问题
的有效方法,特别是在动态显示和更新频繁的场景下。 首先,我们需要理解
双缓冲
的概念。
双缓冲
是一种
图形
渲染技术,用于避免在屏幕上快速更新
图形
时出现的闪烁或撕裂现象。它通过...
VC++
双缓冲
技术 实例解说
双缓冲
双缓冲
技术是
图形
编程中的一种优化策略,尤其在VC++环境下,它被广泛应用于窗口系统中的动态绘图,以避免屏幕闪烁和不连续更新的
问题
。本文将深入探讨
双缓冲
技术的概念、工作原理以及在VC++中的实现方法。
双缓冲
...
双缓冲
绘图技术教程实例
双缓冲
绘图是一种在计算机
图形
学中用于减少屏幕闪烁和提高图像质量的技术。在传统的单缓冲绘图中,每当
图形
需要更新时,程序会直接在屏幕上绘制新的图像,这可能导致用户看到部分完成或未完成的图像,即所谓的“闪烁...
C#中使用
双缓冲
以及BitBlt提高GDI+绘图效率的示例程序
为了解决这个
问题
,开发者通常会采用
双缓冲
技术和BitBlt函数来提高绘图效率。
双缓冲
是一种优化技术,主要用于减少屏幕闪烁。在
双缓冲
中,
图形
首先被绘制到内存中的一个“后台缓冲区”上,而不是直接绘制到屏幕上。...
图形处理/算法
19,472
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章