标题:利用定时器循环播放图片
取消只看楼主
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
结帖率:100%
已结贴  问题点数:100 回复次数:5 
利用定时器循环播放图片
写的程序里需要点击按钮启用定时器循环显示图片形成动画效果,找到的例子上是先使用  for  循环加载位图,获取设备上下文,创建兼容DC,创建定时器,加载位图到兼容DC,利用  for  循环显示图片,(这里的循环显示图片是放在创建窗口后面的,作用是显示窗口就有图片显示在上面),在WM_TIMER里面的步骤是加载位图到兼容DC,循环显示位图(这里的作用是循环显示图片,达到了动画效果);
在WM_PAINT 里面的步骤是加载位图到兼容DC,循环显示位图(这里的作用是保证位图不被重绘掉)。
我的问题是如果在点击按钮以后播放动画跟上面的步骤是一样的,可是我的创建兼容DC是在创建窗口后面的(mdc),别的位图显示也是在控件被单击后才显示的,先定义HDC xiaoDC,
然后xiaoDC=CreateCompatibleDC(NULL);
接着把位图加载到这个兼容DC里面,并显示,显示的目标 DC 是 mdc ,源 DC 是 xiaoDC ,在PAINT里面只用把 mdc 的内容显示在 hdc 上就可以了,
为什么播放动画的图片也这样显示就不可以呢?
我在CREATE消息里加载的那些图片,然后在点击控件事件后根据别的位图显示的方法定义了个 HDC xunhuanDC;然后 xunhuanDC=CreateCompatibleDC(NULL);
接着创建了个定时器,然后就是显示位图从 xunhuanDC 到 mdc 。如果在TIMER里面也要加载位图到兼容DC里面然后显示位图从兼容 DC 到 mdc 的话,是不是也要像在控件里面那样先定义一个HDC,然后xunhuanDC=CreateCompatibleDC(NULL);这样呢?
因为在PAINT里面有了显示 mdc 的内容到 hdc 上,是不是在这里就不用有像例子上的那样再显示一遍图片了呢?
想象的是这样的,结果试了好多次都不能把动画的图片显示在窗口上。希望有人能帮我分析下。
shiyan.rar (3.84 KB)


[ 本帖最后由 小赵q1 于 2012-9-7 22:30 编辑 ]
搜索更多相关主题的帖子: 上下文 
2012-09-05 22:24
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
得分:0 
回复 2楼 stophin
什么是mark呢?俺的英文不是一般的差

[ 本帖最后由 小赵q1 于 2012-9-6 13:23 编辑 ]
2012-09-06 13:20
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
得分:0 
回复 4楼 寒风中的细雨
工程已经上传。谢谢
2012-09-07 22:30
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
得分:0 
回复 6楼 stophin
你好,那个宏名是按钮的标记因为那个按钮是表示总数都所以定义zongfen了,没有注意到与下面的全局变量重名了,宏名那里定义成zongshu吧,点击按钮事件那里当然也要改一下,因为是根据程序需要临时写的一个例子程序在网吧编译器也打不开所以就没有调试,出现这样的错误确实是疏忽了。
楼上能帮我解决下遇到的问题吗?
2012-09-08 13:46
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
得分:0 
看了你的方法,原来需要点击控件显示动画,在点击控件的事件里只用放个定时器就可以了,加载图片可以放在创建窗口时的消息里,在TIME事件里循环显示图片达到动画的效果,在PAINT事件里循环显示图片达到被重绘后仍然显示不会在下一张图片显示之前还是空白的效果。
你是直接把图片加载到兼容DC了,然后把兼容DC的内容显示在hdc上了,我的那个例子是用的双缓存,两个兼容DC,那样的话我在点击控件事件里步骤如下:
    1.定义兼容DC变量;   HDC  xunhuanDC;
    2.创建兼容DC;        xunhuanDC=CreateCompatibleDC(NULL);
    3.放个定时器;       SetTimer(hwnd,1,500,NULL);
    3.循环把图片加载到兼容DC里;   SelectObject(xunhuanDC,DONGHUA[zhang]);
    4.显示兼容DC的内容到全局变量的兼容DC;  BitBlt(myhdc,235,347,Dong.bmWidth,DongbmHeight,xunhuanDC,0,0,SRCCOPY);
在TIME事件里把全局变量的兼容DC的内容显示在hdc上,BitBlt(hdc, 0, 0, Bmp.bmWidth, Bmp.bmHeight, myhdc, 0, 0, SRCCOPY);
在PAINT事件里那句保持不变:BitBlt(hdc, 0, 0, Bmp.bmWidth, Bmp.bmHeight, myhdc, 0, 0, SRCCOPY);
例子里的程序关于动画的就是这一部分了,这样是不是达不到显示动画的效果呢?不用双缓存的话楼上的确实是个好办法,
希望大家帮忙解答一下。
2012-09-09 13:50
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
得分:0 
谢谢寒风中的细雨,我的问题解决了,创建了个HDC数组,把连续的图片加载到那里面循环显示了。
2012-09-11 11:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-380794-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031372 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved