Preface
因為項目需要,開始從事ActiveX方面的工作,看了一些資料,可惜都是些COM原理方面的,沒有切合實際動手的東西,在CodeProject上讀完David Marcionek的文章【1】后,收獲良多,但也遇到一些惱人的小問題,因此在其基礎上就一些易錯點做些小注解。本文版權歸David Marcionek所有。
簡介
本文目的在於讓你快速掌握ActiveX控件開發技術,將會展示開發ActiveX應該知道的基本概念,如方法,屬性和事件,以及如何在一個ActiveX控件和一個web頁面之間進行通信
在本文中,我們將創建一個ActiveX控件,當加載控件時,它會顯示一個動畫進度條,以便向用戶表明控件正在加載。此控件會包含展示如何在控件和web頁面間傳遞信息的功能。下面我們會使用VS2005一步步進行開發的。
創建一個ActiveX控件
為了創建一個ActiveX控件,如下所示:
1,創建一個"MFC ActiveX Control"項目,取名MyActiveX,
2,在"MFC ActiveX Control Wizard"對話框中,選中"Control Settings"
3,在"Create control based on"中選擇"STATIC".我們將使用靜態控件,因為我們只是顯示從控件中獲取的輸出信息,並不接受輸入信息。
4,在"Additional features"中,確保"Activates when visible"和"Flicker-free activation"被選中,"Has an About box dialog"不選中。
5,默認情況下,wizard會創建一個項目,使其在一個共享DLL中使用MFC.我們必須更改這種情況,因為除非所需的MFC DLL都已經在系統中安裝了,否則ActiveX控件就不能運行。包含ActiveX控件的Web頁面上出現紅叉的一個原因就是此。在項目的屬性中,"Configuration Properties"-->"General",將“Use of MFC” 改為“Use MFC in a Static Library”.
6,向導會創建如下幾個類:
1)CMyActiveXApp:這是ActiveX應用程序類,從COleControlModule類繼承下來的。它是OLE控件模塊對象繼承自的基類,包含了初始化(InitInstance)和清理(ExitInstance)的代碼
2)CMyActiveXCtrl:從COleControl繼承而來,這里是我們實現控件大部分功能的地方。
3)CMyActiveXPropPage:從COlePropertyPage繼承而來,用於管理控件的屬性頁對話框。向導已經為我們創建了一個默認的對話框來作為控件的屬性頁對話框。
增加動畫GIF支持
這里我們使用了一個CPictureEx類(具體代碼見最后的“資源”部分),vs2005增加一個動畫GIF資源有一個bug(其實在vs2008中也存在),我們可以使用下面這種技巧來回避它:
將ProcessingProgressBar.gif拷貝到項目文件夾下,然后更名為ProcessingProgressBar.gaf,在資源視圖中,右鍵資源文件MyActiveX.rc,選擇“添加資源”。在“添加資源”對話框中,按下”導入“按鈕,並選擇ProcessingProgressBar.gaf文件。在”自定義資源類型“對話框中輸入“GIF”作為資源類型。這就會將GIF圖片文件導入項目中。然后將導入的圖片ID從IDR_GIF1
改為IDR_PROGRESSBAR
.。
現在開始着手恢復原狀,首先,打開MyActiveX.rc的源文件,找到IDR_PROGRESSBAR
的定義,將其文件名改為
”
ProcessingProgressBar.gif”.同樣地,把項目文件夾下的圖片文件名也改回為“ProcessingProgressBar.gif”,最后在“解決方案資源管理器”視圖中,選中ProcessingProgressBar.gaf,在其”屬性“中,修改”相對路徑“為” ."ProcessingProgressBar.gif”.
增加對話框
現在,我們為進度條圖像增加一個對話框。
1, 在“資源“視圖中,右鍵”對話框“,選擇”插入對話框“來創建一個默認的對話框。
2, 刪除默認產生的“確定“和”取消“按鈕,調整對話框大小為230*40。
3,
更改對話框ID為IDD_MAINDIALOG
,並修改對話框屬性:
Border—none,
Style – Child, System Menu – False, Visible – True.
4,
在對話框中加入一個圖片控件,調整其大小為
200*20
,更改控件
ID
為
IDC_PROGRESSBAR
,顏色為
“white”
。
5,
為對話框創建一個類,名為
CMainDialog,
現在我們為類增加成員變量:
1,
為
CMyActiveXCtrl
類增加一個變量
m_MainDialog
,類型為
CMainDialog
2,
為
CMainDialog
類增加一個變量
m_ProgressBar
,類型為
CPictureEx
,這里注意確保
“
控件變量
“
選中,並且對於的控件是
”IDC_PROGRESSBAR”.
增加支持代碼
好了,現在加入一些代碼來繪制主對話框和進度條控件吧。
1
,為
CMyActiveXCtrl
處理
WM_CREATE
事件的代碼,在其中加入:
並在
OnDraw
函數中加入:
CBrush brBackGnd(TranslateColor(AmbientBackColor()));
pdc->FillRect(rcBounds, &brBackGnd);
2.在CMainDialog
類中,加入處理
WM_CREATE
事件的代碼,在其中加入:
m_ProgressBar.Draw();
Ok,一個簡單的ActiveX控件已經開發完畢,設置編譯模式為“Release”模式,並構建整個應用程序。
創建一個
Web
頁面作為
ActiveX
控件容器
可以使用微軟的
ActiveX Control Pad。要利用它在Web頁面中插入一個ActiveX控件,在<BODY>標記中右鍵,選擇“Insert ActiveX Control”,選擇你需要的就可以了。
直接打開
Web
頁面或者放到
IIS
服務器上進行訪問,一切順利的話就可以看到下面的圖像:
注1:前面要求設置編譯模式為“
Release”
,其實是為了避免運行時因為觸及
Assert
出錯而做的,否則會報錯如下:
跟蹤調試后會發現:
可以看出是圖片擴展控件加載時的順序有些問題,但在瀏覽器中並不需要考慮如此多,因此這里忽略此
Assert
條件。
注2:作
者在這里沒有對MyActiveX.idl文件進行講解,我認為是一個不小的失誤,也正是因為如此,才會導致一個很容易犯錯的地方,當我們按照他的教程,仿照他的代碼一步步進行完后,卻發現在ActiveX測試容器中是可以運行通過的,但到了瀏覽器中卻死活都是紅叉叉。。。,就是因為作者忽略了其對MyActiveX.idl接口定義文件的修改進行解釋。
注3:VS2008中沒有ActiveX控件測試容器了,VS05以上的數字簽名工具也改變了,因此使用VS2005可能更好
我按照教程一步步模仿着做的時候,在上面這兩點上糾纏了3個多小時才發現問題的原因。
在下一篇文章中,將介紹如何對
ActiveX
控件進行數字簽名並使其自注冊和銷毀來確保其安全性,此外還會介紹如何在
ActiveX
控件和
Web
頁面間進行數據通信。
參考資源
1,A Complete ActiveX Web Control Tutorial By David Marcionek
2. Add GIF-animation to your MFC and ATL projects with the help of CPictureEx and CPictureExWnd by Oleg Bykov, CodeProject.
作者:洞庭散人
出處:http://phinecos.cnblogs.com/