ATL、ActiveX、OLE及組件之間的關係

http://blog.csdn.net/linlingzhao/article/details/7518998

ActiveX控件是微軟公司提供的功能強大的程序設計和開發技術,是COM組件開發技術的重要組成部分。它是OLE的第三個版本,對原先OLE控件的最大擴展是增加了Internet功能,它不僅可以在支持OLE控件的容器中使用,更可以作爲一個Internet控件,直接成爲網頁的一部分。另外,ActiveX控件作爲一種可重用的組件,相當於一個封裝好的代碼模塊,它是通過其方法、屬性、事件來與應用程序進行通信的,此外,ActiveX控件是與開發語言無關的。用戶在使用控件時不必考慮它是VC還是用VB等其它語言開發的,應用程序都是通過COM與控件進行通信的。可見,任何支持ActiveX控件的軟件平臺上都可以使用ActiveX控件,它使得不同廠商所開發的控件可以真正地組裝在一起,從而令軟件的生產過程類似於硬件業的各個插件的裝配過程一樣,實現了軟件的工業化,大大降低了軟件的開發成本,極大地提高了軟件的生產效率,實現了軟件資源的共享。
  ATL技術
  1)ATL
  ATL是ActiveX Template Library 的縮寫,它是一套C++模板庫。使用ATL能夠快速地開發出高效、簡潔的代碼(Effective and Slim code),同時對COM組件的開發提供最大限度的代碼自動生成以及可視化支持。從Microsoft Visual C++ 5.0版本開始,Microsoft把ATL集成到Visual C++開發環境中。目前,ATL已經成爲Microsoft標準開發工具中的一個重要成員,日益受到C++開發人員的重視。
  在ATL產生以前,開發COM組件的方法主要有兩種:一是使用COM SDK直接開發COM組件,另一種方式是通過MFC提供的COM支持來實現。
  直接使用COM SDK開發COM組件是最基本也是最靈活的方式。但是,這種開發方式的難度和工作量都很大,一方面,要求開發者對於COM的技術原理具有比較深入的瞭解,另一方面,直接使用COM SDK要求開發人員自己去實現COM應用的每一個細節,完成大量的重複性工作。
  使用MFC提供的COM支持開發COM應用可以說在使用COM SDK基礎上提高了自動化程度,縮短了開發時間。MFC採用面向對象的方式將COM的基本功能封裝在若干MFC的C++類中,開發者通過繼承這些類得到COM支持功能。但使用MFC開發的COM組件,尤其是ActiveX控件的開發,會產生相當大的代碼冗餘,而且必須要依賴於MFC的運行時刻庫才能正確地運行。
  ATL技術是目前開發COM組件的一種比較理想的技術。ATL中所使用的基本技術包括COM技術、C++模板類技術(Template)以及C++多繼承技術(Multi-Inheritance) 。
  2) ATL的基本使用
  使用ATL開發一個COM應用基本可以分爲以下幾個步驟:
  (1)創建一個新的ATL工程,並對工程的選項進行適當的配置。
  (2)向新創建的工程添加新的ATL類,並對該類進行一些初始配置工作。
  (3)根據COM應用的基本要求向新的ATL類加入新的接口定義,並實現相應的接口成員函數。
  (4)編譯連接工程,註冊COM應用。
  利用ATL技術創建ActiveX控件CircleCtl

  1) 創建ATL項目

  使用ATL COM AppWizard 創建ATL框架爲該項目命名爲Circle,按照嚮導提示向下做,採用默認設置,即Server Type類型爲Dynamic Link Library(DLL)。

  2) 向ATL項目添加ActiveX控件

  首先從Insert菜單項中選擇New ATL Object…調出 ATL Object Wizard對話框,然後左邊Category列表選擇Object,右邊相應地選擇Full Control,如圖(1)所示。按Next繼續,出現 ATL Object Wizard屬性對話框,如圖(2),在Names選項卡中,我們只需要在Short Name 編輯框輸入CircleCtl即可,其它系統就會自動給定,也可以修改,我們這裏保持系統給定狀態;在Attributes 選項卡中,選擇 Support ISupportErrorInfo 和 Support Connection Points 兩個複選框,這兩項分別支持出錯信息和連接點;Miscellaneous選項卡保持默認設置;Stock Properties中我們把FillColor添加到支欄中,確定之後就把該控件加到項目中了。

   

  圖1 圖2

  3)爲ActiveX控件添加自定義屬性

  現在來添加Circle控件的一個基本屬性——Radius。

  在Workspace Windows中Class View狀態下,右擊 ICircleCtl接口,選擇Add Property,屬性類型爲short,名爲Radius,參數爲空。系統會自動生成get_Radius和put_Radius兩個成員函數。在CCircleCtl中添加m_radius變量,用來存儲半徑。在CCircleCtl的構造函數中將其初始化爲50,並在get_Radius函數中添加*pVal=m_radius; 在put_Radius函數中添加m_radius=newVal; FireViewChange();用來及時更新視圖。對於Radius的屬性,我們通過修改控件的繪製代碼來使它起作用。

  4) 修改ActiveX控件的繪製代碼實現屬性交換

  首先,在CCircleCtl的構造函數中對繪製圓的填充色進行初始化,將它的初始值設爲紅色,即m_clrFillColor=RGB(255,0, 0)。

  接下來,我們需要幾個全局變量來保存控件區域的信息,在CircleCtl.h中添加如下變量:

  static POINT CenterPt; 
  static long RectHt = 0; 
  static long RectWd = 0;

  然後修改OnDraw函數,在該繪製函數中,使用 Windows API中標準的HDC、HPEN、HBRUSH以及SelectObject、Ellipse等結構和函數來實現繪製的。例如:

  // 創建畫筆和畫刷並選中顏色畫圓

  hPen = (HPEN)GetStockObject(BLACK_PEN);

  hOldPen = (HPEN)SelectObject(hdc, hPen);

  hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);

  hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);

  hBrush = CreateSolidBrush(colFore);

  SelectObject(hdc, hBrush);

  Ellipse (hdc, (CenterPt.x - m_radius), (CenterPt.y - m_radius), (CenterPt.x +m_radius),(CenterPt.y+ m_radius));

  5) 爲ActiveX控件添加事件

  現在將向ATL控件中添加Click和RClick事件。如果用戶在矩形區內點擊,則會激發相應事件。現在要向ICircleCtlEvents接口添加Click方法,首先在“ClassView”中選中“ICircleCtlEvents”右擊,選擇Add Method,出現如下對話框,並按下圖設置,最後點“OK”按鈕就可以添加Click事件的實現方法。用同樣的方法添加RClick事件,參數與Click事件一致。接下來我們要爲控件實現連接點接口IConnectionPoint和連接點容器接口IConnectionPointContainer。編譯好Circle.idl文件,生成對應的Circle.tlb,在“ClassView”中選中“CCircleCtl”,右擊,在Popup菜單中選擇“Implement Connection Point”命令,在彈出的對話框中選中“_ICircleCtlEvents”接口。在類中定義了以兩個座標爲參數的Fire_Click和Fire_RClick方法,調用這兩個方法就可以在控件中激發響應的事件。

  最後,添加激發事件的代碼,我們分別在鼠標左鍵和右鍵按下的消息響應中進行處理,激發響應的事件,例如OnLButtonDown函數部分代碼如下:

  WORD xPos = LOWORD(lParam); //鼠標水平座標
  WORD yPos = HIWORD(lParam); // 鼠標垂直座標
  Fire_Click (xPos, yPos); //執行觸發函數

  至此,可以在ActiveX Control Test Container中測試該控件。

  網頁中使用ActiveX控件

  在控件生成時,系統同時生成了一個CircleCtl.htm文件,在VC編輯環境下打開該文件,在和之間加上如下的VBScript:

<SCRIPT LANGUAGE="VBScript">
<!--
Sub CircleCtl_Click(x, y)
 If CircleCtl.Radius <100 Then
  CircleCtl.Radius = CircleCtl.Radius+1 ‘半徑加1
 Else
  MsgBox(“Radius must be less than 100!”)
 End If
End Sub
Sub CircleCtl_RClick(x, y)
 If CircleCtl.Radius >=1 Then
  CircleCtl.Radius = CircleCtl.Radius-1 ‘半徑減1
 Else
  MsgBox(“Radius mustn’t be less than 0!”)
 End If
End Sub
-->
</SCRIPT>

  注意保存。然後在“我的電腦”中打開該htm文件,用鼠標單擊圓,半徑變大,右擊圓半徑變小。

  結束語

  本文介紹了基於ATL技術以及使用該技術實現了一個簡單的圓的控件CircleCtl並且介紹了其在網頁中的使用。ActiveX控件作爲可重用的代碼組件,不僅應用廣泛,還可節約開發時間。它將大量的實現細節隱藏起來,以簡明的接口與用戶名交互,易於使用。對ActiveX技術的研究已經成爲當今軟件業的熱點和潮流

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章