双缓冲都不够用,能不能实现三缓冲绘图呢?

abxialiang 2010-11-05 10:47:20
环境:wince,vs2005,mfc
希望实现:首先程序有一张背景图片,程序启动后要读取配置文件,然后在背景图片上绘制一串固定的文本广告信息,最后是要在背景图片绘制动态变化的时间字符串.

现在的情况是这样的:
DC1为背景绘图DC
MemDC为兼容DC1的内存DC
用MemDC直接加载了位图(没有使用兼容位图,不知有什么作用),然后在OnEraseBkgnd(CDC* pDC)函数中使用StretchBlt()把MemDC复制到DC1.至于时间字符串的显示是直接在DC1中绘制的,主要的问题在于,我希望把那条固定文本绘制到MemDC且不会产生后来缩放的变形,这样也不用每次跟着时间重新绘制了.可是问题来了,用MemDC直接绘制固定字符串后,当后来使用StretchBlt()缩放位图的时候,文本串发生变形.所以我想让位图先在内存中进行缩放,然后绘上固定文本,最后直接复制到DC1显示.
...全文
314 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
abxialiang 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 begges 的回复:]
漏了 Membitmap->DeleteObject();了。 记得给我分儿哟
[/Quote]
非常感谢,但抱歉我在以前结贴了.
begges 2010-11-19
  • 打赏
  • 举报
回复
漏了 Membitmap->DeleteObject();了。 记得给我分儿哟
abxialiang 2010-11-08
  • 打赏
  • 举报
回复
我一直想知道内存泄漏是哪个地方,先结贴,哪位朋友以后看到问题,可以的话请发到我的邮箱(843541915@qq.com).我先谢谢了.
cuidx 2010-11-07
  • 打赏
  • 举报
回复
其实楼主的做法还是双缓冲的,MemDC1只是楼主用来画背景的中间变量,其实不用MemDC1也能实现楼主的需求,用bitmap的GetBitmapBits方法把bitmap里的像素数据取出来,然后用双线性插值或其它图像缩放的方法,把背景画到MemDC2上就可以了,只是做起来麻烦一些
abxialiang 2010-11-07
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lambochan 的回复:]
ps..漏了说,你的代码有内存泄漏..
[/Quote]
谢谢,泄漏在什么地方,我要怎么修复呢?我以前还一直觉得只有用new不释放时才会泄漏.
abxialiang 2010-11-07
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 c_0_0 的回复:]
引用 12 楼 tiger9991 的回复:
楼主只是不理解双环冲的真正含义。。才会说出三缓冲这种话


同意, 楼主的做法是双缓冲的

楼主要创建多少个兼容DC都无所谓,可以随你怎么叠加绘图!(简单的说,像PS创多图层,像而已但不是啊)
[/Quote]
嗯,现在我好像理解了,双缓冲是指绘图的时候用前台和后台,而不管有多少个前台或多少个后台,我的理解对吗?lambochan说我那段代码存在泄漏,谁能告诉我是哪里吗?谢谢.
pDC->DeleteDC();
lambochan 2010-11-07
  • 打赏
  • 举报
回复
ps..漏了说,你的代码有内存泄漏..
lambochan 2010-11-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 abxialiang 的回复:]
引用 12 楼 tiger9991 的回复:
楼主只是不理解双环冲的真正含义。。才会说出三缓冲这种话

可是我的实际问题已经摆在这里,要是你的话用双缓冲怎么解决问题呢.在一个兼容DC的情况下,可以直接在内存中缩放位图吗?
[/Quote]

可以是可以的,但绝对比不上GDI使用多一个back buffer dc来得简单容易快脆..
这里关键在于你要mix那些不能缩小的字,因为不能直接把字写屏,所以在后台先mix了再bitblt就是正确的.
C_0_0 2010-11-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 tiger9991 的回复:]
楼主只是不理解双环冲的真正含义。。才会说出三缓冲这种话
[/Quote]

同意, 楼主的做法是双缓冲的

楼主要创建多少个兼容DC都无所谓,可以随你怎么叠加绘图!(简单的说,像PS创多图层,像而已但不是啊)
abxialiang 2010-11-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cuidx 的回复:]
使用StretchBlt()把MemDC复制到DC1 后,直接在DC1上画固定字符串,应该就不会跟着MemDC里的东西一起缩放了吧。
[/Quote]
我现在就是这种方案,我想能不能在MemDC中先把位图缩放成窗口大小,然后在MemDC上绘制固定的文字,保存好这个作为成员变量的MemDC,后面要画背景的时候直接提制到DC1进行显示.如果直接在DC1上画,那么每次都要重新绘制,而且还可能会闪烁.
abxialiang 2010-11-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xiuxianshen 的回复:]
那你为何不直接把MenDC的大小和背景大小设置成一样的呢
[/Quote]
您好,内存MemDC的尺寸大小我不知怎么设置,即使设置了,但是当我把位图放进去时位图不会自动缩放成MemDC画布的大小.后面的图形复制时会存在位图区域外的空白区域.
abxialiang 2010-11-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 tiger9991 的回复:]
楼主只是不理解双环冲的真正含义。。才会说出三缓冲这种话
[/Quote]
可是我的实际问题已经摆在这里,要是你的话用双缓冲怎么解决问题呢.在一个兼容DC的情况下,可以直接在内存中缩放位图吗?
傻X 2010-11-06
  • 打赏
  • 举报
回复
楼主只是不理解双环冲的真正含义。。才会说出三缓冲这种话
abxialiang 2010-11-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lambochan 的回复:]
正是要3缓冲..
create多一个compatible dc (假设tempdc)
create一个compatible bitmap, 大小等于client rect.
然后选入tempdc.
把你的MemDC StretchBlt()到这个tempdc.
接着写上你的字,用这个tempdc bitblt到DC1
[/Quote]
终于有人能支持我的想法,我也终于成功了,谢谢你,也谢谢大家,代码贴出来大家看看,有什么问题请指出.
BOOL Cmfc_GDIDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
//两个兼容DC
CDC MemDC1;
CDC MemDC2;
MemDC1.CreateCompatibleDC(NULL);
MemDC2.CreateCompatibleDC(NULL);
//加载位图
CBitmap bitmap;
BITMAP BMInfo;
bitmap.LoadBitmapW(IDB_BITMAP1);
bitmap.GetBitmap(&BMInfo);
//窗口大小
CRect rect;
GetClientRect(rect);
MemDC1.SelectObject(&bitmap);
//缩放到第二内存DC
CBitmap Membitmap;
Membitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
MemDC2.SelectObject(&Membitmap);
MemDC2.StretchBlt(0,0,rect.Width(),rect.Height(),&MemDC1,0,0,BMInfo.bmWidth ,BMInfo.bmHeight,SRCCOPY);
MemDC2.TextOutW(0,0,L"我是固定文本");
//最后在屏幕显示再来
//pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&MemDC2,0,0,BMInfo.bmWidth ,BMInfo.bmHeight,SRCCOPY);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC2,0,0,SRCCOPY);
pDC->TextOutW(100,100,L"时间显示");
bitmap.DeleteObject();
MemDC1.DeleteDC();
MemDC2.DeleteDC();
return true;
//return CDialog::OnEraseBkgnd(pDC);
}
Eleven 2010-11-06
  • 打赏
  • 举报
回复
看了一下你的要求好像就是启动画面,上面动态显示文字信息。双缓冲就足够了,你界面上的东西又不是很复杂
走好每一步 2010-11-06
  • 打赏
  • 举报
回复
没看出楼主用了双缓冲
weblai 2010-11-06
  • 打赏
  • 举报
回复
双缓冲都不够用,多半是你程序问题吧。
cuidx 2010-11-06
  • 打赏
  • 举报
回复
使用StretchBlt()把MemDC复制到DC1 后,直接在DC1上画固定字符串,应该就不会跟着MemDC里的东西一起缩放了吧。
xiuxianshen 2010-11-06
  • 打赏
  • 举报
回复
那你为何不直接把MenDC的大小和背景大小设置成一样的呢
cuidx 2010-11-06
  • 打赏
  • 举报
回复
双缓冲就是创建与当前显示DC兼容的DC,然后把所有要画的东西都在新创建的DC上画好后,再把新创建的DC上的东西都画到显示DC上
因为所有的东西都是在后台先画好,一次性的显示出来的,所以不会有闪烁的现象但是如果画的东西太多,而且频繁的画的话,可能程序会比较慢,但是不会出现闪烁的现象
加载更多回复(2)

19,468

社区成员

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

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