古詩詞大全網 - 成語查詢 - VC++編寫ActiveX控件

VC++編寫ActiveX控件

ActiveX這門技術是通過生成“*.ocx”文件來實現的。先來了解下OCX文件,在百度百科上面對OCX是這樣解釋的:“.ocx是ocx控件的擴展名,OCX 是對象類別擴充組件。如果妳用過Visual Basic或者Delphi壹類的可視化編程工具,那麽對控件這個概念壹定不會陌生,就是那些工具條上的小按鈕,如 EditBox,Grid,ImageBox,Timer等等。每個控件都有自己的事件、方法和屬性。使用了控件的編程非常容易。首先,在程序的設計階段可以設置壹些屬性,如大小,位置,標題(caption)等等;在程序運行階段,可以更改這些屬性,還可以針對不同的事件,調用不同的方法來實現對該控件的控制。控件就好像壹塊塊的積木,程序要做的事只是將這些積木搭起來。控件的最大好處是可以重復使用,甚至可以在不同的編程語言之間使用,例如妳可以在 VB中嵌入用VC開發的控件。”

裏面最後壹句話比較重要,就是用VC開發的OCX控件,妳可以在其它語言裏面都能調用,這樣很好的實現了功能化組件的良好循環使用,而且還可以實現跨語言地調用(例如,妳完全可以用C#調用C++開發的OCX控件)。

下面開始介紹,如何用VC++壹步步生成妳想要的“*.ocx”文件。

1. 建立最簡單的ocx文件並進行調試

1.1 建立最簡單的ocx文件

VC-新建項目-MFC ActiveX WinZard

壹路點擊“確定”,直到點擊“完成”。最後VC++會自動生成壹些文件,這些文件就構成了ActiveX的基本模板,文件的主要結構如下:

直接編譯壹下,然後在Debug目錄下面就會生成壹個名為“ocxDemo.ocx”的控件註冊文件,然後利用“regsvr32”命令就可以實現本機對此控件的註冊,然後就可以使用本語言或者跨語言編寫程序時引用此控件來實現相應的功能(後面將會講到)。

1.2 ocx調試方法:

VC++自帶有壹個調試控件的工具“ActiveX控件測試容器”,通過三種方式可以打開:

1.點擊“調試”按鈕,會出現如下對話框:

然後瀏覽"C:Program FilesMicrosoft Visual StudioCommonToolsTSTCON32.EXE“

2. 系統的“開始“-》“程序”-》“Microsoft Visual C++ 6.0”-》“Microsoft Visual C++ 6.0 Tools”-》“Active Control Test Container”

3. VC++開發環境中的“工具”-》“ActiveX Control Test Container”

通過上面的任意壹種方法,都可以調出下面的程序:

右擊空白區域,插入控件,然後會彈出下面的對話框:

選中指定控件,然後點擊確定,控件就被加載到此工具中了,然後可以通過這個工具來看此控件的相關事件響應等等。

2.自VC++生成的模板基礎上自定義功能

所有的自定義功能基本上都來自於“MFC ClassWizard”類向導對話框。

(“快捷鍵Ctrl+W”或者“查看”-“建立類向導”)

在“Automation”選項卡中為控件添加方法和屬性。

在“ActiveX Events”選項卡中為控件添加事件。

2.1 添加控件屬性

切換到“Automation”選項卡中,點擊右邊的“Add Property”會彈出對話框:

External name:外部名稱。指此控件被使用時,外部程序看到的屬性名稱,僅在外部引用時被使用。

Type:屬性類型。除了基本的整形等數據類型外,還有很多復雜的高級數據類型。

Variable name:變量名稱。此屬性在控件源文件中的變量名稱,在編寫控件源碼時使用。

Notification function:提醒函數。當此屬性被改變時,會觸發此提醒函數。

Implementation:實現方式。指屬性的三種類型:固有型,成員變量型,Get/Set方法型。固有型是指系統賦予的固有屬性,如背景色,標題;成員變量型是用戶自定義的屬性;Get/Set方法型,可能是指只能通過Get/Set方法才能獲取和改變的變量吧(這個沒研究)。

2.2 添加控件方法

在“Automation”選項卡中,點擊右邊的“Add Method”會彈出對話框:

External name:方法外部名稱。

Internal name:方法內部名稱。

Return type:返回值類型。除了基本的整形等數據類型外,還有很多復雜的高級數據類型。

Implementation:實現方式。兩種:固有方法,自定義方法。

Parameter list:參數列表。參數名稱和參數類型:參數類型包含很多高級數據類型。

2.3 添加控件事件

切換到“ActiveX Events”選項卡中,點擊右邊的“Add Event”會彈出對話框:

External name:事件外部名稱。

Internal name:事件內部名稱。比外部名稱多了個前綴“Fire”。

Implementation:實現方式。兩種:固有事件,自定義事件。固有事件壹般是鼠標移動,雙擊等等事件,這些事件都由系統消息觸發;自定義事件則是完全由用戶定義的壹個函數,但這個函數需要用戶在源文件中調用(在內部調用,對於控件的使用方來說,就相當於在調用的地方此事件被觸發,而內部傳入的參數,則是此事件產生的消息附帶信息)。

Parameter list:參數列表。參數名稱和參數類型:參數類型包含很多高級數據類型。

總述:通過“類向導”工具,為控件添加屬性、方法和事件後,VC++會自動在相應的文件裏面生成代碼,比如內部方法屬性和外部方法屬性之間的映射,消息的建立,消息的聲明,等等。如果用戶要對引進行深入研究,還需要對程序的結構比較熟悉,知道各部分代碼的作用,知道哪些地方的代碼是系統自動生成的,哪些代碼需要用戶手動加入的。Visual C++開發環境雖然有很多優點,但有個缺點也很明顯,就是代碼結構比較亂,感覺沒有VS2005和後面的Visual Studio系列要好。但是由於VC6.0作為壹個比較經典的開發環境,而且網上的有關C++的程序設計基本上都是基於VC6.0的,所以,有必要對其進行學習,便於自己讀懂網上的代碼並進行消化吸收。

2.4 生成ocx文件並調試

直接編譯用戶加入了自定義代碼的項目,然後在項目的Debug目錄下面會生成壹個ocx文件,這個就是此控件的註冊文件了。

控件的調試工具仍然是“ActiveX Control Test Container”。

假設我們在控件中加入了壹個事件:固有事件——“MouseMove”鼠標移動事件;用戶自定義事件——ocxClick事件(此事件是通過“WM_MOUSEMOVE”消息來觸發的,返回的是鼠標當前位置的x坐標)。

運行“ActiveX Control Test Container”並插入當前控件,當鼠標在上面移動的時候,可以看到MouseMove產生了事件了。

同時可以通過“Control”-》“Invoke Method”來對控件的方法進行測試,測試的方法就是妳輸入參數,它返回計算結果(下面以自定義的方法funHello為例)。

3.控件的使用方法

3.1 註冊控件

ocx控件的安裝方式有很多種,這裏介紹最簡單的壹種。

步驟:

1.將需要安裝的OCX控件文件復制到某個目錄,例如C盤根目錄下。

2.進入開始,點擊運行。

3.在出現的框中鍵入regsvr32 C:/xxxx.ocx 。(XXXX為控件名, C:/為目錄)

4.點擊確認後等待出現提醒註冊成功即可。

3.2 ActiveX控件的調用

ActiveX作為壹種通用的COM組件,可以被不同語言調用的。

3.2.1 通過VC++調用

利用VC6.0建立壹個MFC的基本對話框應用程序

在完成程序向導後。執行下面的步驟:

1. 執行“工程”-》“添加到工程”--》“Components and Controls”。

2. 在彈出的文件瀏覽對話框中,找到Registered ActiveX Controls文件目錄下的妳剛才註冊的控件,比如“OcxDemo Control”,然後點擊“Insert”按鈕即可將此控件添加到控件工具條集合中。

3. 將控件工具條上新增加的OCX控件拖入到應用程序主窗口中。

完成上面的步驟後,就可以像使用普通控件壹樣在VC中使用此控件了(右擊此控件,可以查看此控件的“事件”和“屬性”,就是妳在編寫控件源碼時的那些“外部名稱External name”)。

3.2.2 通過C#調用

其實這個才是重點,因為跨語言調用ActiveX技術最被筆者看好的地方。

用Visual Studio 2005新建壹個C#.NET的Windows窗口程序,然後在工具箱面板上,右擊“選擇項”,選擇COM組件,找到妳註冊的ActiveX控件:

確定後,那個OcxDemo Control控件就加載到工具箱裏面了。可以直接拖動這個控件到C#.NET應用程序的主窗口上去了,然後就像使用普通控件那樣使用此控件了。

比如,本文中的ActiveX控件的自定義事件中,是通過鼠標移動來觸發,那麽在應用程序中,只要鼠標移動到控件上,那麽就會觸發此自定義事件,並獲取當前鼠標位置的橫坐標。

4. 最後壹些Tip

1) 在自定義控件時,可在控件源碼的OnDraw()函數中設置控件的外觀(也就是控件被拖入到應用程序中時呈現的樣子,壹般默認是壹個白色的方框內切橢圓的樣式)。

2) 用C#來使用ActiveX的事件時,事件所產生的數據都包含在Event變量中,只需要用個點運算符就可以取出來了。

5.展望

控件函數的返回值類型那麽多,那麽復雜,如果要用得好,還需要對那些OLE數據類型進行好好學習,這個等今後需要時再慢慢學習吧。