程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 基於VC++中ATL創建ActiveX控件的探討

基於VC++中ATL創建ActiveX控件的探討

編輯:關於VC++

引言

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             &n bsp;            圖 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技術的 研究已經成為當今軟件業的熱點和潮流。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved