mfc编写一个flash播放器slider进度条的程序,在新建线程中,怎么实现进度条的更新
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mfc编写一个flash播放器slider进度条的程序,在新建线程中,怎么实现进度条的更新相关的知识,希望对你有一定的参考价值。
在新建线程中,我的想法是检测如果在播放,就读当前帧数,然后除以总帧数,乘以一个比例1000,即slider进度条的最大范围,然后得slider上面的位置,用SetPos得到当前的位置。然后Sleep()延迟一段时间, 就这样不断循环。
while(pInfo->pFlash->IsPlaying())
int npos=(pInfo->pFlash->CurrentFrame())*10000/(pInfo->pFlash->get_TotalFrames());
pInfo->pSlider->SetPos(npos);
Sleep(10);
其中pInfo是我定义的线程结构的一个指针。
编译成功,但是运行时,会在int npos=(pInfo->pFlash->CurrentFrame())*10000/(pInfo->pFlash->get_TotalFrames());这句话产生中断,npos的值居然是-858993460 一个很大的负值。我搞不懂为什么会这样~~是调用函数错了?还是指针没有指向正确的flash文件?求达人解答!!谢谢您了~~~
打错了~~不好意思~~~前后都是10000~~~
方法二:int npos=(pInfo->pFlash->CurrentFrame())/(pInfo->pFlash->get_TotalFrames())*10000;
在不把数据都改成double型,因为(pInfo->pFlash->CurrentFrame())*10000得下来的结果溢出了,double的最大值大概是184亿亿,所以一般来说你这个程序不会溢出了.
实在太大了,就用方法二+方法一:改转换为double型,先除后乘,就不会溢出了, 参考技术A 你上面说×1000,程序里面是×10000,应该是溢出了吧
Adobe Flash Builder:如何制作带有进度条的 SWF 用于加载自身?
【中文标题】Adobe Flash Builder:如何制作带有进度条的 SWF 用于加载自身?【英文标题】:Adobe Flash Builder: How to make a SWF with a progress bar for loading itself? 【发布时间】:2021-03-03 09:38:48 【问题描述】:我有一个 AS3 项目,它的所有资产都使用 [Embed]
元数据标签嵌入,因为我希望生成的 SWF 完全独立,以便在 Internet 上移植。
问题: 文件大小相当大,我希望在加载时显示进度条而不是空白屏幕,直到它完全完成。我已经可以使用 Adobe Animate (Flash Professional) 实现这一点,方法是使用带有轻帧 1 和重帧 2 的 时间线,其中包含嵌入大量资产的 MovieClip。
我正在尝试切换到没有 IDE 时间线的 Adobe Flash Builder,但我不知道如何做与 Flash IDE 相同的事情。有人对如何实现这一点有任何想法吗?
【问题讨论】:
【参考方案1】:选项№1。我选择了一个,因为它更容易理解:外部加载器。一个轻量级 SWF,其唯一目的是在加载重量级主模块时显示一些预加载信息,例如 % 或进度。
选项№2。有一个特定的 metatag 允许您模拟第 1 帧预加载器的行为。请记住,ASC2.0 编译器(我假设为 AIR SDK)不支持,而只有 ASC1.0 编译器(Flex SDK)。 Flash Builder 是 Flex Builder 的后代,所以我想这很好,但如果它不适合您,您首先应该检查您的编译器版本Flash Builder 包含在内。
所以,你的主(你在设置中设置为文档类的那个)类应该有那个元标记:
package
import flash.events.Event;
import flash.display.Sprite;
// Brace for the magic impact.
[Frame(factoryClass="Preloader")]
public class Main extends Sprite
public function Main()
// This is important, because at the moment of creation
// the instance is not attached to the stage.
if (stage) onStage(null);
else addEventListener(flash.events.Event.ADDED_TO_STAGE, onStage);
private function onStage(e:Event):void
removeEventListener(flash.events.Event.ADDED_TO_STAGE, onStage);
// This is the entry point of your actual application.
// The rest of the class goes normally from this point on.
然后,提到的预加载器类。它的名称应完全符合上述元标记中所述。
package
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.utils.getDefinitionByName;
// This class represents the multi-framed main timeline
// thus it should subclass the basic MovieClip.
public class Preloader extends MovieClip
public function Preloader()
// Subscribe to all necessary points to monitor the loading.
addEventListener(Event.ENTER_FRAME, onFrame);
loaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioError);
loaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
private function ioError(e:IOErrorEvent):void
// Handle loading errors here.
private function onProgress(e:ProgressEvent):void
// Display loading progress here.
// Use e.bytesLoaded and e.bytesTotal values
// to calculate the % loaded and the overall loading progress.
private function onFrame(e:Event):void
// When the loading is finished, the main timeline,
// represented by Preloader class moves to the frame 2.
if (currentFrame == totalFrames)
stop();
onComplete();
// This method concludes the loading,
// cleans up the preloader itself
// and instantiates the Main class.
private function onComplete():void
removeEventListener(Event.ENTER_FRAME, onFrame);
loaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, ioError);
loaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
// So, here's the thing. You don't import the Main class
// because if you import it, then it will be embedded into
// the Preloader, then it must be loaded before Preloader
// can be initialized, which kind of fails the whole idea.
// Thus, you don't import the Main class but obtain it
// via the other means, like the "getDefinitionByName" method.
// Again, the fully qualified class name is to be provided.
var aMain:Class = getDefinitionByName("Main") as Class;
stage.addChild(new aMain as DisplayObject);
// Remove this instance as it no longer needed for anything.
parent.removeChild(this);
【讨论】:
【参考方案2】:我找到了solution that works with ASC2 / AIR SDK。尽管他的示例预加载器扩展了 Sprite,但我相信您需要扩展 MovieClip 才能使其工作,因为您需要第 2 帧。而且一旦完成加载,您还需要 gotoAndStop(2)。附加信息here。伙计,当您的所有参考链接都通过 web.archive.org 时,这不是一个好兆头!
【讨论】:
以上是关于mfc编写一个flash播放器slider进度条的程序,在新建线程中,怎么实现进度条的更新的主要内容,如果未能解决你的问题,请参考以下文章