用 StretchBlt 缩放位图显示的刷新的问题

lonelinessdotcom 2008-08-06 11:09:03
用 StretchBlt 来缩小一个位图, 该位图的图像是变化的, 然后, 处理 WM_PAINT 消息, 处理位图的图像变化, 大概过程如下:

// 在整个客户区画 1024 * 768, 位图大小是 1280 * 1024 , 一直变化
// 先刷新
//RECT r;
//r.left = r.top = 0;
//r.right = 1024;
//r.bottom = 768;
//InvalidateRect(hWnd, &r, false);

PAINTSTRUCT ps;
HDC paintDC = BeginPaint(hWnd, &ps);
.
.
// bitmapDC 为已经 Select 好位图的 HDC
SetStretchBltMode(paintDC, HALFTONE);
if (!StretchBlt(paintDC, 0, 0, 1024, 768, bitmapDC, 0, 0, 1280, 1024, SRCCOPY))
throw Exception("fail to stretchblt, check");
.
.
EndPaint(hWnd, &ps);

问题: 如果一开始不 InvalidateRect, 则会出现刷新的问题, 即客户区显示总是会有很多未刷新的区域, 超难看, 无论 StretchBlt 的区域是 ps 区域还是全区域; 但是, 如果区域不缩放, 即只选择 bitmapDC 的 1024 * 768 部分, 比例为 1 : 1, 则刷新很正常; 如果用 InvalidateRect, 很明显, CPU 会上升, 而且很厉害, 无论位图是否有变化;
...全文
384 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
primer_programer 2008-08-08
  • 打赏
  • 举报
回复
楼主在OnPaint中调用Invalidate函数,而Invalidate函数会发出一个WM_PAINT消息,又会执行OnPaint函数。
这相当于一个死循环,所以CPU会上升。

既然是在OnPaint函数中画图,所以一旦系统响应wm_paint消息,会自动刷新,图像就会拷贝到屏幕上。

当然如果想手动的去刷新,依然可以调用Invalidate函数。譬如点击一个按钮,调用Invalidate函数。


兼容DC是为了防止闪烁用的,楼主图像显示不全,不知道是开始就显示不全,拖动窗口到屏幕外再回来后图像显示不全。
如果是前者,可以考虑你的bitmapDC的图像加载的是否有问题。个人感觉拷贝函数不会有问题的。
cnzdgs 2008-08-07
  • 打赏
  • 举报
回复
把SetStretchBltMode去掉,再改成只刷新ps区域,CPU使用率就不会太高了。
shanying_0 2008-08-07
  • 打赏
  • 举报
回复
用兼容dc不好么?
lonelinessdotcom 2008-08-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Mackz 的回复:]
你不应该在WM_PAINT消息中调用InvalidateRect
[/Quote]
那有什么更好的办法. WM_PAINT 总是要处理的, 显示总是要刷新的
菜牛 2008-08-07
  • 打赏
  • 举报
回复
你不应该在WM_PAINT消息中调用InvalidateRect
Cauly123 2008-08-06
  • 打赏
  • 举报
回复
StretchBlt是个很吃cpu的函数,而且效果也不好 1:1的话他只执行bitblt的工作,效率自然高

如果图片是循环的或并不非常多,建议事先缓冲
不然的话可以考虑用directx 毕竟现在api画图速度就这个水平

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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