1. 注冊控件
首先要插入Flash就必須使用Flash控件,在工具欄右鍵選擇“選擇項…”,然後在“COM元件”面闆下點選“浏覽”按鈕,在本機電腦C:\WINDOWS\system32\Macromed\Flash\目錄裡選擇Flash10x.ocx(也有可能是Flash10v.ocx或flash10p.ocx),然後點選确定就可以了。在CMD裡面輸入如下:
regsvr32 C:\WINDOWS\system32\Macromed\Flash\Flash10x.ocx
系統會提示注冊成功。
2. 控件屬性
打開VS,然後工具欄中選擇的Flash控件Shockwave Flash Object拖到窗體中,
注意到該控件主要有幾個屬性:
Name屬性,這個是所有對象都會有的。
Menu屬性,這個是Flash菜單項,預設值為true,也就是右鍵的時候會出現完整的Flash菜單,如果設定為False,則隻出現最簡單的菜單(設定與關于)。
Move屬性,這個屬性是用來指定要播放的Flash檔案的。
Playing屬性,指定是否裝在影片之後馬上播放。
Quality屬性,設定影片的品質。
Scale Mode屬性,設定影片的縮放模式。
Visible屬性,設定影片控件的可視與否。
3. 隐藏Flash控件右鍵菜單
這個方法主要用到繼承和重寫等面向對象的核心内容。
首先聲明一個類,讓它去繼承AxShockwaveFlashObjects.AxShockwaveFlash,該類是執行個體化Flash控件生成的類。該類中包含各種Flash的事件和屬性,在這裡我們隻對右鍵菜單的事件感興趣,是以我們去重寫該事件。
類的代碼如下:
public class FlashRightKey : AxShockwaveFlashObjects.AxShockwaveFlash
{
//定義一個公共類FlashRightKey(類名自己定義)來繼承AxShockwaveFlashObjects.AxShockwaveFlash(在執行個體化Shockwave Flash Object控件後生成)類
protected override void WndProc(ref Message m) //重載WndProc方法(此方法即消息處理機制)
{
if (m.Msg == 0X0204) //0×0204即滑鼠右鍵的16進制編碼
return; //傳回并不輸出
else
base.WndProc(ref m); //如果不是右鍵的話則傳回正常的資訊
}
}
類寫好了,我們要在Flash控件裡面使用它,必須在執行個體化Flash控件的時候用如下代碼(寫在Flash.Designer.cs檔案相應的地方):
private FlashRightKey RollFlash;
this.RollFalsh = new Namespace.FlashRightKey();
4. C#與Flash控件通信
通信資料采用XML格式。
C#代碼:
綁定Flash控件
private void FlashTest_Load(object sender, EventArgs e)
{
Flash.Movie = Application.StartupPath + @"\Test.swf";
}
調用flash提供的外部接口
private void CallFunction(string funName, string flag)
{
Flash.CallFunction(EncodeXML(funName, flag));
}
将資料轉換成XML格式
private string EncodeXML(string funName, string flag)
{
StringBuilder sb = new StringBuilder();
XmlTextWriter xw = new XmlTextWriter(new StringWriter(sb));
xw.WriteStartElement("invoke");
xw.WriteAttributeString("name", funName);
xw.WriteAttributeString("returntype", "xml");
xw.WriteStartElement("arguments");
xw.WriteStartElement("string");
xw.WriteString(flag);
xw.WriteEndElement();
xw.WriteEndElement();
xw.WriteEndElement();
xw.Flush();
xw.Close();
return sb.ToString();
}
執行動畫開始操作
private void Btn_Start_Click(object sender, EventArgs e)
{
CallFunction("Call", "001");
}
執行動畫結束操作
private void Btn_End_Click(object sender, EventArgs e)
{
CallFunction("Call", "002");
}
接收Flash發送過來的資料
private void Flash_FlashCall(object sender, AxShockwaveFlashObjects._IShockwaveFlashEvents_FlashCallEvent e)
{
XmlDocument xd = new XmlDocument();
xd.LoadXml(e.request);
XmlNodeList xl = xd.getElementsByTagName_r("arguments");
MessageBox.Show(xl[0].FirstChild.InnerText);
}
Flash代碼:
package {
import flash.display.*;
import flash.text.*;
import flash.events.MouseEvent;
import flash.external.ExternalInterface;
public class Test extends flash.display.MovieClip {
public function Test() {
ExternalInterface.addCallback("Call",Call);//外部接口,供C#調用
btn.addEventListener(MouseEvent.CLICK,SendCsharp);
}
//供C#窗體調用的方法
private function Call(flag:String):void {
switch (flag) {
case '001' :
df.gotoAndPlay(2);//控制動畫開始
break;
case '002' :
df.gotoAndStop(1);//控制動畫結束
break;
default :
break;
}
}
//像c#窗體發送資訊
public function SendCsharp(e:MouseEvent):void {
ExternalInterface.call("Send","Hello World!");//外部接口,向C#傳遞資料
}
}
}