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 =(int)((double)(pInfo->pFlash->CurrentFrame())*10000/(double)(pInfo->pFlash->get_TotalFrames()));

方法二: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 上移植。

问题: 文件大小相当大,我希望在加载时显示进度条而不是空白屏幕,直到它完全完成。我已经可以使用 Adob​​e Animate (Flash Professional) 实现这一点,方法是使用带有轻帧 1 和重帧 2 的 时间线,其中包含嵌入大量资产的 MovieClip。

我正在尝试切换到没有 IDE 时间线的 Adob​​e Flash Builder,但我不知道如何做与 Flash IDE 相同的事情。有人对如何实现这一点有任何想法吗?

【问题讨论】:

【参考方案1】:

选项№1。我选择了一个,因为它更容易理解:外部加载器。一个轻量级 SWF,其唯一目的是在加载重量级主模块时显示一些预加载信息,例如 % 或进度。

选项№2。有一个特定的 metatag 允许您模拟第 1 帧预加载器的行为。请记住,ASC2.0 编译器(我假设为 AIR SDK)不支持,而只有 ASC1.0 编译器(Flex SDK)。 Flash BuilderFlex 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进度条的程序,在新建线程中,怎么实现进度条的更新的主要内容,如果未能解决你的问题,请参考以下文章

MFC进度条的美化

MFC求一个工具栏插入进度条的方法

vc6.0里MFC进度条如何使用

UE4 音乐时长进度条

带有进度条的 jQuery ajax 上传 - 没有 flash

VS2008中Slider控件制作播放器的进度条,如何在视频播放时改变滑块位置