ActiveX 控件是 Microsoft 提供的強大元件技術,屬於 COM 元件開發的重要組成。它不僅可在支援 OLE 的容器中使用,更能作為網頁元件直接嵌入 HTML,實現跨平台、跨語言的元件重用。ActiveX 控件透過方法、屬性、事件與應用程式通訊,使軟體開發如同硬體組裝般標準化,大幅降低成本、提升效率。
ATL(Active Template Library)是一套 C++ 模板庫,自 Visual C++ 5.0 起整合進開發環境。相比早期的 COM SDK(靈活但工作量大、需深諳 COM 細節)與 MFC(封裝度高但產生大量冗餘代碼、依賴 MFC 執行庫),ATL 結合 COM、C++ 模板與多重繼承技術,能生成高效、精簡的程式碼,成為開發 COM 元件的理想選擇。
使用 ATL COM AppWizard 建立專案,命名為 Circle,伺服器類型選 Dynamic Link Library (DLL),其餘採預設值。
在 Insert → New ATL Object 中選擇 Full Control。在屬性頁:
CircleCtl,其餘自動生成。Support ISupportErrorInfo 與 Support Connection Points,分別支援錯誤資訊與連接點(事件)。FillColor(填充顏色)。在 Class View 中右鍵 ICircleCtl 介面 → Add Property,類型 short,名稱 Radius。系統自動生成 get_Radius / put_Radius。在 CCircleCtl 中加入成員 m_radius,建構函數初始化為 50,put_Radius 中呼叫 FireViewChange() 觸發重繪。
在 OnDraw 中使用 Windows GDI 函數(HDC、HPEN、HBRUSH、Ellipse 等)繪製圓形,並套用 m_radius 與 m_clrFillColor。建構函數中將填充色初始化為紅色(RGB(255,0,0))。
ICircleCtlEvents 介面加入 Click、RClick 方法(參數為座標 x, y)。CCircleCtl → Implement Connection Point,選擇 _ICircleCtlEvents,自動生成連接點介面與 Fire_Click、Fire_RClick 觸發函數。OnLButtonDown、OnRButtonDown 中取得滑鼠座標並呼叫對應觸發函數:WORD xPos = LOWORD(lParam);
WORD yPos = HIWORD(lParam);
Fire_Click(xPos, yPos);
專案生成的 CircleCtl.htm 中嵌入 VBScript:
<SCRIPT LANGUAGE="VBScript">
Sub CircleCtl_Click(x, y)
If CircleCtl.Radius < 100 Then CircleCtl.Radius = CircleCtl.Radius + 1
Else MsgBox "Radius must be less than 100!"
End Sub
Sub CircleCtl_RClick(x, y)
If CircleCtl.Radius >= 1 Then CircleCtl.Radius = CircleCtl.Radius - 1
Else MsgBox "Radius mustn't be less than 0!"
End Sub
</SCRIPT>
瀏覽器開啟該頁面,滑鼠左鍵點擊圓形半徑增大,右鍵點擊半徑縮小。
本文示範了以 ATL 開發 ActiveX 控件的完整流程:建立專案、加入控件、定義屬性與事件、修改繪圖邏輯、網頁嵌入測試。ActiveX 控件將複雜實現細節封裝,以簡潔介面對外服務,是實現軟體工業化、元件化的關鍵技術。