MFC ActiveX控件的建立與使用(VS2010)

1.ActiveX的基本概念html

         ActiveX控件能夠看做是一個極小的服務器應用程序,它不能獨立運行,必須嵌入到某個容器程序中,與該容器一塊兒運行。這個容器包括WEB網頁,應用程序窗體等。。。編程

         ActiveX控件的後綴名是OCX或者DLL。通常是以OCX和動態庫共存的形式打包成cab或者exe的文件放在服務器上,客戶端下載後運行安裝cab或exe解壓成OCX和動態庫共存的文件,而後註冊ocx文件。瀏覽器

         ActiveX控件是基於com標準,使得軟件部件在網絡環境中進行交互的技術集。它與具體的編程語言無關。做爲針對Internet應用開發的技術,ActiveX被普遍應用於WEB服務器以及客戶端的各個方面。同時,ActiveX技術也被用於方便地建立普通的桌面應用程序,此外ActiveX通常具備界面。服務器

 

2.三個概念:ActiveX、OLE和COM網絡

        從時間的角度講,OLE是最先出現的,而後是COM和 ActiveX;從體系結構角度講,OLE和ActiveX是創建在COM之上的,因此COM是基礎;單從名稱角度講,OLE、ActiveX是兩個商標名稱,而COM則是一個純技術名詞,這也是你們更多的據說ActiveX和OLE的緣由。COM是應OLE的需求而誕生的,因此雖然COM是OLE的基礎,但OLE的產生卻在COM以前。COM的基本出發點是,讓某個軟件經過一個通用的機構爲另外一個軟件提供服務。ActiveX最核心的技術仍是COM。ActiveX和OLE的最大不一樣在於,OLE針對的是桌面上應用軟件和文件之間的集成,而 ActiveX則以提供進一步的網絡應用與用戶交互爲主。COM對象能夠用C++、Java和VB等任意一種語言編寫,並能夠用DLL或做爲不一樣過程工做的執行文件的形式來實現。使用COM對象的瀏覽器,無需關心對象是用什麼語言寫的,也無須關心它是以DLL仍是以另外的過程來執行的。從瀏覽器端看,無任何區別。這樣一個通用的處理技巧很是有用。編程語言

 

3.VS2010建立ActiveX函數

新建名爲MyFirstActive的工程,如圖工具

 

 

 

 

 點擊【ok】,隨後一路保持默認便可,最後點擊【Finish】按鈕測試

 

 

能夠打開上面三個類的頭文件及cpp文件,發現它們都是派生類。ui

MyFirstActive.cpp:cpp文件中定義了DllRegisterServer和DllUnregisterServer,能夠發現ActiveX的註冊和反組冊都與該類有關。

MyFirstActiveCtrl.cpp:能夠發現該頭文件中聲明瞭消息映射(讓ActiveX控件程序能夠接受系統發送的事件通知,如窗體建立和關閉事件),調度映射(讓外部調用程序(包含ActiveX的容器)能夠方便地訪問ActiveX控件的屬性和方法),事件映射(讓ActiveX控件能夠向外部調用程序(包含ActiveX的容器)發送事件通知)。也就是說對ActiveX控件的窗口操做都將在這個類中完成,包括ActiveX控件的建立,重繪,以及在此類中建立可視MFC窗體。

MyFirstActivePropPage.cpp:顯示ActiveX控件的屬性頁的

 

最重要的對外接口定義文件MyFirstActive.idl,代碼以下:

// MyFirstActive.idl : type library source for ActiveX Control project.

// This file will be processed by the MIDL compiler tool to
// produce the type library (MyFirstActive.tlb) that will become a resource in
// MyFirstActive.ocx.

#include <olectl.h>
#include <idispids.h>

[ uuid(0FEFC517-CA1A-4178-B11F-5CE5CF0861DB), version(1.0),
  control ]
library MyFirstActiveLib
{
    importlib(STDOLE_TLB);

    //  Primary dispatch interface for CMyFirstActiveCtrl
    [ 
        uuid(9B11CEE7-1974-4579-ACDD-551DD26AC5D9)    
    ]
    dispinterface _DMyFirstActive
    {
        properties:
        methods:

            [id(DISPID_ABOUTBOX)] void AboutBox();
    };

    //  Event dispatch interface for CMyFirstActiveCtrl

    [ 
        uuid(28CECEEF-A69E-4124-82AD-FE45F093FE84)    
    ]
    dispinterface _DMyFirstActiveEvents
    {
        properties:
            //  Event interface has no properties

        methods:
    };

    //  Class information for CMyFirstActiveCtrl
    [
        uuid(260A0C6E-1C89-4BB7-A0DD-C1496245094B)
    ]
    coclass MyFirstActive
    {
        [default] dispinterface _DMyFirstActive;
        [default, source] dispinterface _DMyFirstActiveEvents;
    };

};

這個就是對外接口定義文件,若是外部程序想要調用ActiveX的方法,屬性以及在註冊表註冊的classid(WEB網頁調用須要使用),就必須瞭解這個文件,這個文件能夠分爲四個部分來看:

首先是MyFirstActiveLib這個庫信息

 

 第二部分是調度映射的接口信息,該接口信息包含了屬性(如控件背景色)和對外方法

裏面定義了一個方法AboutBox(),該方法就能夠被外部程序調用,在該接口裏定義的函數都是純虛函數,這些函數的實現都是在MyFirstActiveCtrl.cpp中完成的,MFC經過底層的封裝,讓MyFirstActiveCtrl類繼承這個接口,實現函數。

 

 第三部分是事件映射的接口信息

 

 第四部分是類的信息,其中uuid就是ActiveX控件註冊到註冊表的classid,它是ActiveX註冊後在系統內的惟一標識,WEB網頁就是使用這個ID加載ActiveX控件的

 

 編譯,就會生成MyFirstActive.ocx,下面講一下使用方法:

1.使用html網頁

<HTML>  
<HEAD>  
<TITLE>Test ActiveX</TITLE>  
</HEAD>  
<OBJECT ID="TestMfcAtl Control" WIDTH=800 HEIGHT=545 classid="CLSID:260A0C6E-1C89-4BB7-A0DD-C1496245094B">  
    <PARAM NAME="_Version" VALUE="65536">  
    <PARAM NAME="_ExtentX" VALUE="12806">  
    <PARAM NAME="_ExtentY" VALUE="1747">  
    <PARAM NAME="_StockProps" VALUE="0">  
</OBJECT>  
</HTML>  

  

2.創建Mfc應用程序,在Mfc窗口右鍵-》插入「ActiveX」控件,而後就會在MFC的窗體上顯示ActiveX控件

 

3.也是最方便的一種方法,就是使用vs自帶的ActiveX Control Test Container來測試ActiveX控件,可是VS2010在「工具」中沒有這一項,那麼咱們首先能夠手動把這個工具添加到VS2010裏,

 首先,打開C:\Program Files\Microsoft Visual Studio 10.0\Samples\1033,解壓VC2010Samples.zip

 

 

解壓後,再打開目錄C:\Program Files\Microsoft Visual Studio 10.0\Samples\1033\VC2010Samples\C++\MFC\ole\TstCon,打開TstCon.sln

 

 編譯,生成TstCon.exe,而後把這個exe導入到VS2010中,點擊【Tools】——【External Tools】,

 

 Command路徑就是剛纔生成TstCon.exe的路徑,Title就是一個名稱,隨便你起均可以的,最後點擊ok,這個外部exe就添加成功了。

 

怎麼使用?點擊【Tools】——【ActiveX Control Test Container】以下

 

 再點擊【Edit】——【Insert newControl】

 

選擇MyFirstCtrl,這裏咱們沒有手動註冊,實際上是VS2010在生成ocx的時候就已經註冊好了

 

 

 而後點擊【ok】按鈕,以下

 

 中間沒跳出什麼異常,顯示上圖畫面,說明咱們的ocx建立成功了(固然使用的是默認的,什麼都沒有)

 

下面咱們在Ocx中添加一些圖形控件用於顯示和操做,首先,插入一個對話框資源

 

 生成一個IDD_DIALOG1,而後修改對話框屬性:Border改成None,Control改成True,Style改成Child,Visible改成True, 而後雙擊該對話框,生成一個與之關聯的類,這裏起名CActiveXTestDlg

 

 

 點擊【Finish】。

 

在MyFirstActiveCtrl.h中添加以下代碼:

 

 

 

用Class Wizard爲CMyFirstActiveCtrl類添加OnCreate函數

 

 在MyFirstActiveCtrl.h中自動生成以下代碼

 

 

  在MyFirstActiveCtrl.cpp中自動生成以下代碼

 

 而後,在該函數中建立對話框的對象

int CMyFirstActiveCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (COleControl::OnCreate(lpCreateStruct) == -1)
        return -1;

    // TODO:  Add your specialized creation code here
    m_ActiveXTestDlg.Create(IDD_DIALOG1, this);

    return 0;
}

編譯,用外部工具加載ocx(前面已講),結果以下(若是看不到對話框,能夠把矩形框拉大就能夠看到了)

 

 這樣帶界面的ocx就生成了,另外能夠在CActiveXTestDlg類中加入【ok】按鈕響應函數

void CActiveXTestDlg::OnBnClickedOk()
{
    // TODO: Add your control notification handler code here
    //CDialogEx::OnOK();

    AfxMessageBox(_T("ActiveX test is ok!"));
}

這樣,在測試程序中點擊【ok】按鈕,就會彈出以下對話框

 

備註:若是想要修改初始的ActiveX控件大小,能夠在CMyFirstActiveCtrl構造函數中調用 SetInitialSize(   470,  295   );  來設置

 

ActiveX控件跟蹤調試:

運行TstCon.exe,而後用ocx的工程Attach到該exe,就能夠調試了。

相關文章
相關標籤/搜索