首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++Builder 輕鬆整合 ActiveX 控制項:RealPlayer 與 Flash 實戰範例

     編輯:關於C++

C++Builder 對 ActiveX 支援極佳,透過 Component → Import ActiveX Control 即可將系統已註冊的 OCX 轉為 VCL 元件。本文以 RealPlayer ActiveX 與 Shockwave Flash 為例,完整示範匯入、屬性/方法探索、播放器製作、動態載入與部署註冊技巧。

一、匯入 ActiveX 控制項

  1. Component → Import ActiveX Control 開啟對話框
  2. 列表中選擇目標控制項(如 RealPlayer ActiveX Control Library、Shockwave Flash)
  3. 點擊 Install → 選擇套件(新增或現有)→ 重新編譯 IDE
  4. 元件面板 ActiveX 頁面出現新圖示(TRealPlayer、TShockwaveFlash)

若列表無目標:點 Add 瀏覽 .ocx,Builder 自動呼叫 regsvr32 註冊並產生 _TLB.h 包裝標頭。

二、探索屬性與方法

  • IDE 中 Code Explorer 雙擊元件名稱 → 查看產生的 _TLB.h(位於 Imports 目錄)
  • 建立測試表單,對每個屬性/方法建立選單項,InputBox 輸入參數即時驗證
  • 狀態列顯示回傳值與錯誤碼

三、RealPlayer 播放器實作

1. 關鍵屬性設定

RealPlayer1->Controls = "ImageWindow,ControlPanel,StatusBar"; // 顯示視窗、控制列、狀態列
RealPlayer1->Align = alClient; // 填滿表單

2. 開啟檔案並播放

void __fastcall TForm1::btnOpenClick(TObject*) {
    OpenDialog1->Filter = "媒體檔|*.rm;*.ram;*.ra;*.mp3|所有檔|*.*";
    if (OpenDialog1->Execute()) {
        RealPlayer1->Source = OpenDialog1->FileName;
        RealPlayer1->DoPlay(); // 啟動播放
    }
}
void __fastcall TForm1::btnStopClick(TObject*) {
    RealPlayer1->DoStop();
}

3. 循環播放難題與對策

DoPlay() 為非同步啟動,直接 for 迴圈會瞬間發送多次播放指令。解法:

  • 監聽 OnEndOfStream 事件,在事件處理器中遞迴呼叫 DoPlay()
  • 或使用 TTimer 輪詢 PlayState 狀態

四、Flash 動畫播放器實作

1. 核心屬性

屬性型別說明
MovieWideString.swf 檔案路徑或 URL,設空字串可卸載
Loopbool是否循環
Quality / Quality2int / WideString1=High、2=Best、0=Low
ScaleMode / Scaleint / WideString0=ShowAll、1=NoBorder、2=ExactFit、3=原始大小
AlignMode / SAlignint / WideString0~15 九宮格對齊(L/T/R/B/LR/LT/.../LTRB)
BackgroundColor / BGColorint / WideString背景色,HEX 字串如 #FFFFFF
Menubool右鍵選單,建議 true 讓使用者可縮放、品質切換

2. 進度顯示

void __fastcall TForm1::Timer1Timer(TObject*) {
    ProgressBar1->Position = ShockwaveFlash1->PercentLoaded(); // 0~100
    if (ProgressBar1->Position == 100) Timer1->Enabled = false;
}

3. 載入網路動畫

ShockwaveFlash1->LoadMovie(0, AnsiToOLESTR("https://example.com/anim.swf")); // Layer 0

五、部署:確保目標機器已註冊 OCX

方法一:ShellExecute 呼叫 regsvr32

ShellExecute(Handle, _T("open"), _T("regsvr32.exe"), _T("/s swflash.ocx"), NULL, SW_HIDE); // 註冊
ShellExecute(Handle, _T("open"), _T("regsvr32.exe"), _T("/u /s swflash.ocx"), NULL, SW_HIDE); // 反註冊

方法二:動態載入 OCX 內建匯出函數

bool RegisterOCX(const AnsiString& path, bool unreg) {
    HINSTANCE h = LoadLibrary(path.c_str());
    if (!h) return false;
    FARPROC p = GetProcAddress(h, unreg ? "DllUnregisterServer" : "DllRegisterServer");
    if (!p) { FreeLibrary(h); return false; }
    HRESULT hr = ((HRESULT(__stdcall*)())p)();
    FreeLibrary(h);
    return SUCCEEDED(hr);
}

隨安裝包附帶 .ocx,首次執行時自動檢查並註冊(需管理員權限)。

六、常見問題快速查核

七、總結

C++Builder 匯入 ActiveX 流程極度簡化:Import → Install → 使用。掌握 _TLB.h 探索法、關鍵屬性組合、非同步事件處理、部署自動註冊,即可快速整合 RealPlayer、Flash、WebBrowser、MapControl 等豐富生態元件,大幅縮短開發週期。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
現象原因解決
元件面板無 ActiveX 頁面未安裝 ActiveX 匯入精靈Builder 安裝時勾選 ActiveX 支援
Import 列表找不到控制項OCX 未在系統註冊Add 瀏覽 OCX 檔案,Builder 自動註冊
RealPlayer 無畫面只有聲音Controls 屬性缺少 ImageWindow設定 Controls = "ImageWindow,ControlPanel,StatusBar"
Flash 右鍵選單被禁用Menu = false設為 true 或自訂選單
部署後類別未註冊錯誤目標機缺少 OCX 或未註冊隨程式附帶 OCX + 啟動自動註冊