社区
图形处理/算法
帖子详情
求 有关图形有双缓冲问题(送分)
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
双缓冲
绘图的关键代码
双缓冲
绘图的关键代码,里面带有源码和说明
VC 绘制
图形
和文字(
双缓冲
)
完成
图形
绘制(椭圆,矩形,圆角矩形等),完成
图形
设置选项,状态栏随
图形
类型动态更新,利用
双缓冲
去闪烁,并用动态链接库实现文本居中显示。
基于
双缓冲
技术的VC++
图形
刷新技术的原理和实现
而采用
双缓冲
技术则可以很好的解决这一
问题
。 本文主要分析了
双缓冲
技术的原理,介绍了其和传统
图形
刷新技术的不同之处,并给出了在 VC 中使用
双缓冲
技术进行绘图的程序框架,对同类研究有一定的参考作用
图形
学部分代码(含
双缓冲
)
正在工作中的
图形
学大作业 主要学习
双缓冲
MFC
双缓冲
移动
图形
本程序利用
双缓冲
,在MFC中移动
图形
,通过↑、↓、←、→四个按键,控制
图形
移动方向,实现无闪烁移动
图形
的目的。
图形处理/算法
19,468
社区成员
50,698
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章