社区
图形处理/算法
帖子详情
求 有关图形有双缓冲问题(送分)
ljdyp
2004-12-13 01:55:59
急求有关图形有双缓冲方面的源码.主要目的是解决在图形有给制中有闪烁的现象.万分感谢!!!!
...全文
254
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
【鸿蒙实战开发】基于Drawing的
图形
/文字绘制及
双缓冲
模拟实现刷新
本文围绕鸿蒙开发,介绍基于Drawing的
图形
与文字绘制及
双缓冲
模拟实现刷新。Native Drawing模块可绘制基本
图形
和字体,需借XComponent送显。阐述了
双缓冲
实现刷新的原理,还给出
图形
、文本绘制的方案,以及场景实现步骤,包括添加依赖、构建环境、绘制内容送显等。
双缓冲
技术讲解
本文介绍了
双缓冲
技术。计算机显示
图形
时,视频显示器逐像素绘制,从帧缓冲区读取颜色值。单帧缓冲易出现像素撕裂
问题
,
双缓冲
技术通过两个帧缓冲区解决此
问题
。它在游戏渲染等场景应用广泛,能避免视觉错误,还可用于处理演员互动状态等,同时也存在一些限制。
HarmonyOS 实战开发 —— 基于Drawing的
图形
/文字绘制及
双缓冲
模拟实现刷新
本文围绕HarmonyOS开发,介绍基于Drawing的
图形
与文字绘制及
双缓冲
模拟实现刷新。Native Drawing模块可绘制基本
图形
和字体,借助XComponent和Native Window送显。阐述了
图形
和文本绘制方案,以及场景实现步骤,包括添加依赖、文本和
图形
绘制场景,还说明了
双缓冲
刷新的具体操作。
鸿蒙开发实践——基于Drawing的
图形
/文字绘制及
双缓冲
模拟实现刷新
本文介绍了HarmonyOS中Native Drawing模块用于基本
图形
和字体绘制的方法。Drawing绘制需借助XComponent和Native Window送显,采用
双缓冲
可消除图像闪烁。还阐述了
图形
和文本绘制方案,以及场景实现步骤,包括添加依赖、文本和
图形
绘制流程,最后说明了绘制内容送显的
双缓冲
实现及TS调用绘制接口。
HarmonyOS 开发实践——基于Drawing的
图形
/文字绘制及
双缓冲
模拟实现刷新
本文围绕HarmonyOS开发,介绍基于Drawing的
图形
/文字绘制及
双缓冲
模拟实现刷新。Native Drawing模块可绘制基本
图形
和字体,需借XComponent和Native Window送显。阐述了
图形
和文本绘制方案,以及场景实现步骤,包括添加依赖、文本和
图形
绘制场景,还说明了
双缓冲
实现刷新的具体操作。
图形处理/算法
19,464
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章