65.9K
CodeProject 正在变化。 阅读更多。
Home

FlashMovie WebControl

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.53/5 (54投票s)

2004年1月19日

4分钟阅读

viewsIcon

394930

downloadIcon

4006

一个自定义的 WebControl,增强了轻松地将 Macromedia Flash 电影添加到您的 WebForms 中的能力。

引言

对于那些已经在动态网页中添加了 Macromedia Flash 电影的人来说,您无疑会发现使电影本身动态化(即动态变量和属性;或者甚至使电影本身动态化,如旋转器)非常令人沮丧。如果万一 Flash 插件未安装,或者您打算通过 JavaScript 来强制安装某个特定版本,而实际上 JavaScript 已被禁用,那会更令人沮丧。好吧,尽管这个自定义的 ASP.NET 控件不能唱跳,但它确实能让这些任务变得非常容易管理。

FlashMovieControl 封装了可以推送到 Flash 电影中的所有属性(例如,缩放、宽度、高度、窗口模式……还有很多)。并且它都具有出色的设计器支持,这对我来说是一次宝贵的学习经历。该控件的当前版本已与 Macromedia 2004 Flash MX 的最新属性和输出渲染保持同步。您会发现发送到浏览器的渲染内容与直接从 Macromedia MX 工作室发布的完全一致。

特点

  • 动态地向您的 Flash 电影发送变量
    public class FlashMovieTest {
        protected Osmosis.Web.UI.Controls.FlashMovie FlashMovie1;
            
        private void function AddMovieVariables() {
            this.FlashMovie1 = new Osmosis.Web.UI.Controls.FlashMovie();
            this.FlashMovie1.MovieVariables.Add("MyVar1","MyValue1");
            this.FlashMovie1.MovieVariables.Add("MyVar2","MyValue2");
        }
    }
    -------------------------------------
    Renders as:
    <object classid= .... >
    <PARAM NAME=movie VALUE="MyMovie.swf?MyVar1=MyValue1&MyVar2=MyValue2"> ....
  • 在 Flash 插件不可用时,轻松添加 HTML 内容。(仅在 ClientScriptVersionDection 中可用)。渲染控件时,将渲染所有必要的 JavaScript 代码以进行版本检测,包括在没有插件的情况下要渲染的 HTML 内容。请注意,HTML 代码已自动为您封装在必要的 document.write('') 语句中。这是一个极其节省时间的功能。
    public class FlashMovieTest {
        protected Osmosis.Web.UI.Controls.FlashMovie FlashMovie1;
            
        private void function AddNoFlashPluginContent() {
            this.FlashMovie1 = new Osmosis.Web.UI.Controls.FlashMovie();
            this.FlashMovie1.FlashOutputType = 
                Osmosis.Web.UI.FlashOutputType.ClientScriptVersionDection;
            this.FlashMovie1.NoFlashContainer.Controls.Add(new Table());
    
        }
    }
    -------------------------------------
    Renders as:
    if ( MM_FlashCanPlay ) { ...
    
    } else{
    document.write('<table border="0" ID="Table1">');
    document.write('');
    document.write('</table>');
    }
  • 与向 NoFlashContainer 添加内容几乎相同,当您使用 ClientScriptVersionDection 时,您也可以添加 HTML 以应对 JavaScript 被禁用的情况。渲染控件时,将渲染所有必要的 JavaScript 代码以进行版本检测。但如果用户的浏览器不支持 JavaScript 怎么办?您可以以编程方式添加 Web 控件,这些控件将在 <noscript></noscript> HTML 块内自行渲染。
    public class FlashMovieTest {
        protected Osmosis.Web.UI.Controls.FlashMovie FlashMovie1;
            
        private void function AddNoFlashPluginContent() {
            this.FlashMovie1 = new Osmosis.Web.UI.Controls.FlashMovie();
            this.FlashMovie1.FlashOutputType = 
              Osmosis.Web.UI.FlashOutputType.ClientScriptVersionDection;
            this.FlashMovie1.NoScriptContainer.Controls.Add(new Table());
    
        }
    }
    -------------------------------------
    Renders as:
    <NOSCRIPT>
        <table border="0" ID="Table1"></table>
    </NOSCRIPT>
  • 现已支持 FS_Command。只需指定要包含在网页中的脚本标签的 URI。这将输出一个 script 标签,其 SRC 属性设置为您的 URI。
    public class FlashMovieTest {
        protected Osmosis.Web.UI.Controls.FlashMovie FlashMovie1;
            
        private void Page_Load(object sender, System.EventArgs e) {
        
            this.FlashMovie1 = new Osmosis.Web.UI.Controls.FlashMovie();
            this.FlashMovie1.FSCommandScriptUrl = "../MyJavaScriptFile.js";
    
        }
    }
    -------------------------------------
    Renders as:
    <script language="javascript" src="../MyJavaScriptFile.js"></script>

FlashOutputType 的作用是什么? (Osmosis.Web.UI.FlashOutputType)

  • ClientScriptVersionDection:告诉 FlashMovieControl 渲染必要的 JavaScript 代码,以对您指定的版本执行插件版本检测。在此模式下,还会渲染您分配给 NoScriptContainerNoFlashContainers 的任何 NoScript/NoPlugin 内容。
  • FlashOnly:告诉 FlashMovieControl 只渲染将您的电影嵌入网页所需的 HTML。基本上,除了用于检测插件版本的客户端脚本之外的所有内容。
  • SWFVersionDetection:这个有点奇怪。它是 Macromedia 的 Flash Studio 2004 中使用的最新输出类型。它使用一个 swf 电影来检测是否安装了 Flash。什么,它使用 Flash 电影来检测客户端是否安装了 Flash?我也不明白。但在 Flash MX 2004 中,当您使用此标志发布时,它会生成一个(仅版本 4 的)swf 电影,该电影会将您重定向到您想要的电影。将此输出方法与 FlashMovieControl 属性:SWF_ 一起使用。
    ///Example of using SWFVersionDetection
    this.FlashMovie1.FlashOutputType = 
       Osmosis.Web.UI.FlashOutputType.SWFVersionDetection;
    this.FlashMovie1.MovieName = "MyMacromediaGeneratedDetectionMovie.swf";
    
    this.FlashMovie1.SWF_DetectionAltUrl = "IfNotDetectedUrl.aspx";
    this.FlashMovie1.SWF_DetectionContentUrl = "IfDetectedUrl.aspx";
  • 所有其他输出类型都不受支持,但默认情况下为 FlashOnly。我将它们添加到枚举中以供以后添加时回忆。

开始使用 FlashMovieControl

确保在您的项目中引用 .dll 文件。在解决方案资源管理器中,找到您的项目,右键单击“引用”节点。选择“添加引用”。浏览找到从 CodeProject 下载的 .dll 文件,然后单击“确定”。要与设计器一起使用:当您的 WebForm 处于设计视图时,打开工具箱并右键单击。选择“添加/删除项”。浏览找到从 CodeProject 下载的 .dll 文件,然后单击“确定”。现在 FlashMovieControl 已添加到您的工具箱中。只需将其拖到您的页面上,然后打开“属性”窗口。要记住的一件事是始终设置 MovieName 属性。这是实际 .swf 文件的 URL。如果您忘记添加实际的电影,您的浏览器将挂起,因为它正在尝试定位不存在的文件。在将来的版本中,如果未设置电影,我将使控件抛出异常。下面是一个使用 FlashMovieControlClientScriptVersionDetection 作为 FlashOutputType 的示例。

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace FlashTest
{

    public class FlashMovieControlTest : System.Web.UI.Page
    {
        protected Osmosis.Web.UI.Controls.FlashMovie FlashMovie1;
    
        private void Page_Load(object sender, System.EventArgs e)
        { 
            this.FlashMovie1 = new Osmosis.Web.UI.Controls.FlashMovie();
            
            ///Set the output type and Movie
            this.FlashMovie1.FlashOutputType = 
              Osmosis.Web.UI.FlashOutputType.ClientScriptVersionDection;
            ///Always make sure you have a valid movie 
            ///or your browser will hang.
            this.FlashMovie1.MovieName = "MyMovie.swf";
            
            /// Set the plugin version to check for
            this.FlashMovie1.MajorPluginVersion = 7;
            this.FlashMovie1.MajorPluginVersionRevision = 0;
            this.FlashMovie1.MinorPluginVersion = 0;
            this.FlashMovie1.MinorPluginVersionRevision = 0;
            
            ///Set some other properties
            this.FlashMovie1.MovieHeight = "400px";
            this.FlashMovie1.MovieWidth = "200px";
            this.FlashMovie1.AutoLoop = false;
            this.FlashMovie1.AutoPlay = true;
            this.FlashMovie1.FlashHorizontalAlignment = 
                 Osmosis.Web.UI.FlashHorizontalAlignment.Center;
            this.FlashMovie1.FlashVerticalAlignment = 
                 Osmosis.Web.UI.FlashVerticalAlignment.Top;
            this.FlashMovie1.HtmlAlignment = 
                 Osmosis.Web.UI.FlashHtmlAlignment.Right;
            this.FlashMovie1.UseDeviceFonts = false;
            this.FlashMovie1.WindowMode = 
                 Osmosis.Web.UI.FlashMovieWindowMode.Transparent;
            this.FlashMovie1.ShowMenu = false;
            this.FlashMovie1.MovieQuality = 
                 Osmosis.Web.UI.FlashMovieQuality.AutoHigh;
            this.FlashMovie1.MovieScale = 
                 Osmosis.Web.UI.FlashMovieScale.NoScale;
            
            /// Add some variables
            this.FlashMovie1.MovieVariables.Add("MyVar1","MyValue1");
            this.FlashMovie1.MovieVariables.Add("MyVar2","MyValue2");
            this.FlashMovie1.MovieVariables.Add("MyVar3","MyValue3");
            
            ///Set the NoScript and NoFlash content.  
            ///In most situations where
            ///html will be displayed the content is the same for both
            this.FlashMovie1.NoFlashContainer.Controls.Add(
              this.GetDefaultHtmlContent());
            this.FlashMovie1.NoScriptContainer.Controls.Add(
              this.GetDefaultHtmlContent());
        }
        
        

        private HtmlTable GetDefaultHtmlContent(){
            
            HtmlTable tbl = new HtmlTable();
            HtmlTableRow tr = new HtmlTableRow();
            HtmlTableCell td = new HtmlTableCell();
            Label lbl = new Label();
            lbl.Text = "This is my default content";
            
            td.Controls.Add(lbl);
            tr.Cells.Add(td);
            tbl.Rows.Add(tr);
            return tbl;
        }

        #region Web Form Designer generated code
        override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN: This call is required by the ASP.NET 
            // Web Form Designer.
            //
            InitializeComponent();
            base.OnInit(e);
        }
        
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {    
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion
    }
}
-------------------------------------------------------------------
Renders As......
-------------------------------------------------------------------
<SCRIPT LANGUAGE=JavaScript1.1>
<!--
var MM_contentVersion = 7;
var plugin = (navigator.mimeTypes && navigator.mimeTypes[
  "application/x-shockwave-flash"]) ?
navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin : 0;
if ( plugin ) {
var words = navigator.plugins["Shockwave Flash"].description.split(" ");
for (var i = 0; i < words.length; ++i)
{
if (isNaN(parseInt(words[i])))
continue;
var MM_PluginVersion = words[i];
}
var MM_FlashCanPlay = MM_PluginVersion >= MM_contentVersion;
}
else if (navigator.userAgent && navigator.userAgent.indexOf("MSIE")>=0
&& (navigator.appVersion.indexOf("Win") != -1)) {
document.write('<SCR' + 'IPT LANGUAGE=VBScript\> \n');
document.write('on error resume next \n');
document.write('MM_FlashCanPlay = ( 
  IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash." & 
  MM_contentVersion)))\n');
document.write('</SCR' + 'IPT\> \n');
}
if ( MM_FlashCanPlay ) {
document.write('<OBJECT classid=
  "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"');
document.write('  codebase=
  "http://fpdownload.macromedia.com/pub/shockwave/cabs/
  flash/swflash.cab#version=7,0,0,0" ');
document.write(' ID="FlashMovie1" WIDTH="200px" 
  HEIGHT="400px" ALIGN="right">');
document.write(' <PARAM NAME=movie 
  VALUE="MyMovie.swf?MyVar1=MyValue1&MyVar2=MyValue2&MyVar3=MyValue3"> 
  <PARAM NAME=loop VALUE=false /> <PARAM NAME=menu VALUE=false /> 
  <PARAM NAME=scale VALUE=noscale /> <PARAM NAME=wmode VALUE=transparent />
  <PARAM NAME=salign VALUE=T /> <PARAM NAME=quality VALUE=AutoHigh/> 
  <PARAM NAME=bgcolor VALUE=#ffffff/> <PARAM NAME="allowScriptAccess" 
  value="SameDomain" />  ');
document.write(' <EMBED 
  src="MyMovie.swf?MyVar1=MyValue1&MyVar2=MyValue2&MyVar3=MyValue3" 
  loop="false" menu="false" scale="noscale" wmode="transparent" 
  salign="T" quality="autohigh" bgcolor="#ffffff" 
  allowScriptAccess="SameDomain"   ');
document.write(' swLiveConnect=FALSE WIDTH="200px" 
  HEIGHT="400px" NAME="MyMovie.swf" ALIGN="right"');
document.write(' TYPE="application/x-shockwave-flash" 
  PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer">');
document.write(' </EMBED>');
document.write(' </OBJECT>');
} else{
document.write('<table>');
document.write('    <tr>');
document.write('        <td><span>This is my default content</span></td>');
document.write('    </tr>');
document.write('</table>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<table ID="Table1">
    <tr>
        <td><span>This is my default content</span></td>
    </tr>
</table>
</NOSCRIPT>
HTML View example
------------------

<OSMOSIS:FLASHMOVIE id=FlashMovie1 runat="server" 
  MovieName="MyMovie.swf" AutoLoop="False" AutoPlay="False" 
MovieScale="NoScale" MovieQuality="AutoLow" FlashHorizontalAlignment="Right" 
FlashVerticalAlignment="Top" MovieHeight="222" MovieWidth="33" 
WindowMode="Transparent"></Osmosis:FlashMovie>

感谢您的所有输入!请继续提供。如果您有任何疑问或建议,请随时与我联系。

历史

  • 首次发布:与 Macromedia 2004 属性和输出方法同步。
  • 2005/04/12:
    • 增强功能:所有属性都保存在视图状态中(不包括 NoScriptNoFlash 控件属性)。
    • 错误修复:应能更好地与 MAC IE 浏览器配合使用(已恢复为所有浏览器输出 embed 标签)。
    • 错误修复:在使用 SSL 命名您的电影时,Macromedia 的 codebase、检测插件页面和插件页面也使用 SSL(消除了浏览器询问是否要在安全页面上显示非安全内容的提示)。
  • 2004/04/13
    • 增加了 FSCommand 支持。
    • 错误修复:支持页面上的多个 Flash 电影(实现了 INamingContainer)。
    • 浏览器检测:仅为非 IE 浏览器输出 <embed> 标签。
  • 2005/04/15:
    • 错误修复:增加了对测试 SSL 使用的更好支持。
  • 2004/05/07:
      错误修复:修复了上一个版本中 MAC IE 浏览器不显示 <embed> 标签的问题。
© . All rights reserved.