Flash 動畫以其豐富的視覺效果與互動性,曾是網頁與桌面應用打造酷炫介面的首選。在 VC++ 6.0 中,透過 Shockwave Flash Object ActiveX 控制項,不僅能嵌入播放 .swf 動畫,更能利用 FSCommand 機制與 SetVariable/GetVariable 實現 C++ 與 ActionScript 的雙向通訊。本文完整記錄嵌入流程、播放控制與互動實作細節。
Flash.ocx 或 swflash.ocx)。PlayFlash。CShockwaveFlash)。m_FlashPlayer。在 OnInitDialog() 中初始化:
BOOL CPlayFlashDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 使用絕對路徑
CString strPath = _T("D:\\Demo\\animation.swf");
m_FlashPlayer.LoadMovie(0, strPath); // 第 0 層
m_FlashPlayer.Play();
return TRUE;
}
常用播放控制函數:
StopPlay():停止GotoFrame(long frameNum):跳至指定幀(從 0 起算)Rewind():倒帶至第一幀SetZoom(ZoomMode):設定縮放模式// 按鈕元件動作
on (release) {
fscommand("btn", "enter"); // 命令: "btn", 參數: "enter"
}
on (release) {
fscommand("quit", ""); // 僅命令,無參數
}
在 ClassWizard 的 Message Maps 分頁,選擇控制項 ID(如 IDC_SHOCKWAVEFLASH1),新增 FSCommand 通知處理函數:
void CPlayFlashDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args)
{
if (_tcscmp(command, _T("btn")) == 0)
{
if (_tcscmp(args, _T("enter")) == 0)
AfxMessageBox(_T("歡迎進入系統!"));
}
else if (_tcscmp(command, _T("quit")) == 0)
{
AfxMessageBox(_T("您選擇了退出!"));
OnCancel();
}
}
Flash 動畫中定義變數 userName,C++ 可動態讀寫:
// C++ 寫入變數給 Flash
m_FlashPlayer.SetVariable(_T("userName"), _T("張三"));
// C++ 讀取 Flash 變數
CString user = m_FlashPlayer.GetVariable(_T("userName"));
AfxMessageBox(_T("Flash 中的 userName: ") + user);
Flash 端對應 ActionScript:
// 讀取 C++ 設定的值
trace("userName = " + userName);
// 修改值讓 C++ 讀取
userName = "李四";
LoadMovie 的第一個參數為層級,主動畫通常用 0;若需疊加多個 SWF,可用 1、2…FSCommand 無反應,檢查 Flash 發佈設定的 Script 版本(AS2/AS3 差異大),且控制項需設 AllowScriptAccess="always"。Shockwave Flash Object 為 VC++ 應用注入了豐富的動態視覺與互動能力。掌握 LoadMovie/Play 控制播放、FSCommand 接收事件、SetVariable/GetVariable 同步資料三大核心,即可打造媲美網頁級的桌面互動介面。雖然 Flash 已走入歷史,但此架構思想(宿主容器與插件雙向通訊)在現代 WebView2、CEF 嵌入技術中依然適用。