目前知道的方法,都是在应用程序中使用一个web控件,加载一个网页,在网页中再加载swf文件,这样会有一个swf文件在外部。不知道有没有办法直接把swf文件嵌入到应用程序中执行?

2010-11-06 06:52:41

5 Answers

个人看法是,在应用程序中内嵌flash控件不如用网页加载外部swf。因为内嵌控件会导致可执行文件增加好几兆的播放器大小,而网页加载只是多一个临时文件,可以设置该文件隐藏,用户体验也不差。

2010-11-06 08:31:28

过程比较繁琐,需要做到以下几步,才可以完整的实现一个FLASH

  1. 实现activex容器方法,也就是实现以下几个接口IOleClientSite IOleInPlaceSiteWindowless IOleInPlaceFrame IStorage


2. 从flash.ocx导入flash接口IShockwaveFlash
3. 实现IShockwaveFlash::_IShockwaveFlashEvents接口,以便响应flash事件
4. 实现IOleObject等接口,把IShockwaveFlash挂接到IOleObject中,以便可以正确响应IOleObjeW分发下来的事件,如绘制消息、鼠标键盘消息等。
5. IShockwaveFlash::put_movie来播放swf文件

另外,第1步做的事情,可以用WTL::CAxDialogImpl来直接实现。

2010-11-06 10:09:56

使用shockwave flash object控件就可以实现,这个控件在安装flash的时候就装到你的系统上了。
在VC中的使用方法:

  1. 添加shockwave flash

    object控件。建立对话框应用程序后,在主菜单里选择“工程->添加工程->components and controls”菜单选项,这时会弹出一个components and controls gallery文件选择对话框,里面有两个文件夹,一个是registered activex controls,一个是visual c++ components。选择第一文件夹后会出现一系列系统上已注册过的activex控件。在里面选择shockwave flash object(如果你系统上没这个控件,这里面就找不到了,可以去download个下来安装),点击insert将它插入工程。因为在vc中插入工程的控件要通过一个类来操作,所以这时vc会提示你为这个控件指定一个类名,可以使用默认的类名就行了。插入后vc会自动把这个类加入工程里面。
    1. 生成一个该控件的对象。将shockwave flash object控件成功插入自己的工程后,在vc对话框编辑器的controls面板上就会多出图标,这个图标就是刚加入的控件的图标了。呵,这样接下来怎么用就再清楚不过了吧。和使用BUTTON、EDIT等其它windows控件一样,把它拉到对话框上,给它关联一个对象,对象的类就是我们刚才插入控件的时候所产生的类。我们可以使用这个类的成员函数来操纵这个对象,来进行flash动画的控制以及和自己的程序进行交互等操作了。这里假设关联的对象名为:m_Player。

    2. 使用成员函数LoadMovie和Play来导入并播放动画。 m_Player.LoadMovie(0,

      strMovieUrl);该函数用来将动画导入程序中,strMovieUrl为要播放的flash路径,要用绝对路径。
      m_Player.Play();调用该函数开始播放动画。在初始化对话框的函数里面加入这两个函数调用即可。
  1. 如果需要和SWF程序交互还可以重载shockwave flash object控件的事件,在事件里返回SWF中的处理结果。

  2. 接口说明

Play() 播放动画 StopPlay() 停止动画 IsPlaying() 动画是否正在播放(true,false) GotoFrame(frame_number) <coding-6 lang="other"> 跳转到某帧(frame_number+1) TotalFrames() 获取动画总帧数 CurrentFrame() 回传当前动画所在帧数-1 Rewind() 使动画返回第一帧 SetZoomRect(left,top,right,buttom) 放大指定区域 Zoom(percent) 改变动画大小 Pan(x_position,y_position,unit) 使动画在x,y方向上平移 PercentLoaded() 返回动画被载入的百分比(0-100) LoadMovie(level_number,path) 加载动画 TGotoFrame(movie_clip,frame_number) <coding-15 lang="other"> movie_clip跳转到指定帧数 TGotoLabel(muvie_clip,label_name) <coding-16 lang="other"> movie_clip跳转到指定标签 TCurrentFrame(movie_clip) <coding-17 lang="other"> 回传movie_clip当前帧-1 TCurrentLabel(movie_clip) 回传movie_clip当前标签 TPlay(movie_clip) 播放movie_clip TStopPlay(movie_clip) 停止movie_clip的播放 GetVariable(variable_name) 获取变量 SetVariable(variable_name,value) 变量赋值 TCallFrame(movie_clip,frame_number) call指定帧上的action TCallLabel(movie_clip,label) call指定标签上的action TGetProperty(movie_clip,property) 获取movie_clip的指定属性 TSetProperty(movie_clip,property,number) 设置movie_clip的指定属性
By 5lulu.com
2010-11-06 12:01:38

如果用VS的话很简单选中swf文件在属性的“生成操作”一项里选“嵌入的资源”
然后代码中像这样就可以取到二进制

Assembly assem = Assembly.GetExecutingAssembly(); assem.GetManifestResourceStream("命名空间.xxx.swf");

另外内嵌swf和嵌入播放器是两回事,如果发现用户没安装播放器提示他下载安装就行了

2010-11-06 13:19:26

可以把swf文件放到资源中,在需要执行swf文件时,
1 把swf从资源中加载到内存中
2 把swf的内容传给flash 控件,然后开始播放。
具体的方法是:从flash对象中获取IID_IPersistStreamInit,用这个接口来把swf的文件内容传递给flash控件

        IUnknown* u = _flash.GetControlUnknown();
    if(u != NULL)
    {
        IPersistStreamInit* psi;
        HRESULT hr = u->QueryInterface(IID_IPersistStreamInit, reinterpret_cast(&psi));
        if(SUCCEEDED(hr))
        {
            HRSRC res = FindResource(NULL, MAKEINTRESOURCE(IDR_SWF), "SWF");
            HGLOBAL h = LoadResource(NULL, res);
            unsigned int len = SizeofResource(NULL, res);
            if(! load_movie_from_stream(psi, reinterpret_cast(LockResource(h)), len))
            {
            }
            psi->Release();
        }
    }
bool load_movie_from_stream(IPersistStreamInit* psi, unsigned char* data, unsigned int len)
{
    bool successful = false;
    bool compressed = false;
    unsigned char* buffer = NULL;
    unsigned int movie_size;
    ULARGE_INTEGER size, cb;
    LARGE_INTEGER li;
    memmove(&movie_size, data + 4, 4);

    __try
    {
        //compressed?
        if(memcmp(data, "CWS", 3) == 0)
        {
            compressed = true;
            unsigned long d_len;
            buffer = new unsigned char[movie_size];
            memmove(buffer, data, 8);
            buffer[0] = 'F';
            int r = uncompress(buffer + 8, &d_len, data + 8, len - 8);
            if(r != Z_OK)
            {
                __leave;
            }
        }
        else
        {
            buffer = data;
        }

        //save movie template
        psi->GetSizeMax(&size);

        HGLOBAL h1 = GlobalAlloc(GMEM_MOVEABLE, size.LowPart);
        IStream* s1;
        CreateStreamOnHGlobal(h1, FALSE, &s1);
        psi->Save(s1, TRUE);

        //insert movie into template
        HGLOBAL h2 = GlobalAlloc(GMEM_MOVEABLE, size.LowPart + movie_size);
        IStream* s2;
        CreateStreamOnHGlobal(h2, FALSE, &s2);

        //magic flag. "gUfU" means no movie loaded, "fUfU" means movie loaded
        s2->Write("f", 1, NULL);
        li.HighPart = 0;
        li.LowPart = 1;
        s1->Seek(li, SEEK_SET, NULL);
        cb.HighPart = 0;
        cb.LowPart = 3;
        s1->CopyTo(s2, cb, NULL, NULL);

        //write movie size
        s2->Write(&movie_size, 4, NULL);

        //write movie
        s2->Write(buffer, movie_size, NULL);
        cb.HighPart = 0;
        cb.LowPart = size.LowPart - 4;
        s1->CopyTo(s2, cb, NULL, NULL);

        //load movie
        li.HighPart = 0;
        li.LowPart = 0;
        s2->Seek(li, SEEK_SET, NULL);
        psi->Load(s2);

        s1->Release();
        s2->Release();
        GlobalFree(h1);
        GlobalFree(h2);

        successful = true;
    }
    __finally
    {
        if(compressed && buffer != NULL)
        {
            delete[] buffer;
        }
    }
    return successful;
}
2010-11-06 15:32:44
您不能回答该问题或者回答已经关闭!

相关文章推荐

  • C#中using指令的几种用法

    using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到

  • C#实例解析适配器设计模式

    将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作

  • C#开发高性能Log Help类设计开发

    项目中要在操作数据库的异常处理中加入写Log日志,对于商业上有要求,写log时对其它操作尽可能影响小,不能因为加入log导致耗时太多

  • Async和Await使异步编程更简单

    C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作

  • C#开发中的反射机制

    反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等

  • C#运行时相互关系

    C#运行时相互关系,包括运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别等等

  • 使用托管C++粘合C#和C++代码(二)

    本文实现一下C++代码调用C#代码的过程。我构造一个简单并且直观的例子:通过C++ UI 触发C# UI.

  • C#协变和逆变

    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型,“逆变”则是指能够使用派生程度更小的类型

  • C#基础概念之延迟加载

    延迟加载(lazy load)是Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

  • C#中的索引器的简单理解和用法

    C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作

  • 使用托管C++粘合C#和C++代码(一)

    C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器

  • 深入C# 序列化(Serialize)、反序列化(Deserialize)

    C#中的序列化和反序列化,序列化是.NET运行时环境用来支持用户定义类型的流化的机制