天天看點

Flash與C#通信

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#傳遞資料

                   }

         }

}