FlashMovie WebControl






4.53/5 (54投票s)
2004年1月19日
4分钟阅读

394930

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 代码,以对您指定的版本执行插件版本检测。在此模式下,还会渲染您分配给NoScriptContainer
和NoFlashContainers
的任何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。如果您忘记添加实际的电影,您的浏览器将挂起,因为它正在尝试定位不存在的文件。在将来的版本中,如果未设置电影,我将使控件抛出异常。下面是一个使用 FlashMovieControl
和 ClientScriptVersionDetection
作为 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:
- 增强功能:所有属性都保存在视图状态中(不包括
NoScript
和NoFlash
控件属性)。 - 错误修复:应能更好地与 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>
标签的问题。