http://blog.csdn.net/linlingzhao/article/details/7518998
利用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技術的研究已經成爲當今軟件業的熱點和潮流