none
在vs2012建立的WinForm项目中使用axShockwaveFlash控件播放swf不显示 RRS feed

  • 问题

  • 我是将flex web项目的bin-debug文件夹内容拷贝到c#项目的debug目录下的。运行debug能右键出播放器的右键菜单,但就是什么都不显示!
    flex web项目(非3d)可以正常显示,flex web项目(引用了away3d建立的模型)不能正常显示。
    不能正常显示的swf在flash player与浏览器中都能正常显示。
    已排除安全沙箱问题!
    运行时能鼠标右击出flash player的右键菜单,但显示就是一片白色!
    我感觉是加载到了,就是不显示!
    请问用axShockwaveFlash控件有硬件加速的说法吗?
    不能正常显示的这个swf在原来的flex项目中起初也是不能显示,需要在“html-template”文件夹中的index.template.html中添加params.wmode = "direct";才能正常显示!
    不知道是不是和这个有关呢?

    下面是控件使用的代码:

     /// <summary>
            /// 窗体加载事件处理程序
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void Form1_Load(object sender, EventArgs e)
            {
                this.axShockwaveFlash1.Movie = @"D:\Flex自学实例程序\Fgd.FlexAway3D.Test\Fgd.FlexAway3D.Test\bin\Debug\WarehouseDemo.swf";                    //加载swf文件
                //axShockwaveFlash1.LoadMovie(0, Environment.CurrentDirectory + @"\WarehouseDemo.swf");
                axShockwaveFlash1.FlashCall += new AxShockwaveFlashObjects._IShockwaveFlashEvents_FlashCallEventHandler(axShockwaveFlash1_FlashCall);           //绑定flex调用c#方法事件
                //string flashPlayerVersion = axShockwaveFlash1.GetVariable("$version");
                //MessageBox.Show(flashPlayerVersion);
                MessageBox.Show(axShockwaveFlash1.ReadyState.ToString());
                MessageBox.Show(axShockwaveFlash1.WMode);
            }

            private void axShockwaveFlash1_FlashCall(object sender, AxShockwaveFlashObjects._IShockwaveFlashEvents_FlashCallEvent e)
            {
                throw new NotImplementedException();
            }

            /// <summary>
            /// 导入并加载swf文件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btImport_Click(object sender, EventArgs e)
            {
                OpenFileDialog ofDialog = new OpenFileDialog();
                ofDialog.AddExtension = true;
                ofDialog.CheckFileExists = true;
                ofDialog.CheckPathExists = true;
                ofDialog.Filter = "swf 文件 (*.swf)|*.swf|所有文件 (*.*)|*.*";
                ofDialog.DefaultExt = "mp3";
                if (ofDialog.ShowDialog() == DialogResult.OK)
                {
                    //this.axShockwaveFlash1.Movie = ofDialog.FileName;
                    axShockwaveFlash1.LoadMovie(0, ofDialog.FileName);
                    //this.axShockwaveFlash1.Play();
                }
            }


    • 已编辑 toodfu 2013年12月28日 16:14
    2013年12月28日 16:04

答案

  • WPF连ActiveX支持都没有,要用的话还要集成Windows Forms……当然,你也可以用webbrowser控件来做Flash播放器就是了。

    不过我建议你还是用WPF直接做前台算了,你这需求还需要去实时更新显示的,预先写好的SWF不太合适。



    Visual C++ MVP

    2013年12月29日 4:11
    版主

全部回复

  • Windows Forms不支持无窗口模式ActiveX,所以渲染有透明色的swf会有问题,只会看到AxHost绘制的背景色。用ATL写个封装看看。


    Visual C++ MVP

    2013年12月28日 17:48
    版主
  • 谢谢回复,因为刚接触这些不久,所以还不太了解,有相关的Demo可参考吗?

    我简单说一下我的想法:

    我们一直在做工业现场硬件设备的监控,就是使用c#获得上层信息系统的任务信息,结合业务需要将这些任务下达到各个设备(PLC),同时将各个设备的运行状态实时的以图形化界面的形式展示给客户!程序是c/s结构的!

    现在flash 3d(away3d)已经实现了硬件加速(GPU)所以我有个想法,就是使用flex制作前台界面,后台使用c#处理业务和与硬件(PLC)通讯!

    因为一些客观原因还需要使用c#的winform,所以还不能使用wpf.

    希望能得到您的建议!谢谢了!

    2013年12月29日 1:41
  • WPF连ActiveX支持都没有,要用的话还要集成Windows Forms……当然,你也可以用webbrowser控件来做Flash播放器就是了。

    不过我建议你还是用WPF直接做前台算了,你这需求还需要去实时更新显示的,预先写好的SWF不太合适。



    Visual C++ MVP

    2013年12月29日 4:11
    版主