ActiveX控件使用事項

一、由於win7權限問題, 編譯activex控件時會報權限問題的錯,所以要使用右鍵以管理員權限打開Visual Studio 2010

二、需要對activex進行測試,而2010中無ActiveX control test container 所以要編譯這個工具,參考http://blog.csdn.net/waxgourd0/article/details/7374669

還需要在Property——configuration properties——Debugging——Command中添加命令:$(VSInstallDir)Samples\1033\VC2010Samples\C++\MFC\ole\TstCon\Debug\TstCon.exe


三、給控件添加屬性:   切換到類視圖,工程名Lib下的接口右鍵--添加---添加屬性

    

 

四、添加自定義屬性,有兩點要注意

    

    

    (1)注意:自定義的屬性,要保持持久性,也就是用戶對控件進行設置後,關閉工程,然後再打開,設置的值還在

    

    (2)注意: 自定義的屬性, 隨着屬性頁中的值的修改,容器中的屬性也要隨之修改

    從下面的代碼中可以看出InterVal的調度爲1

        

    OnInterValChanged中當InterVal變化時, 調用BoundPropertyChanged方法通知容器InterVal的變化

        


五、添加屬性頁

    


六、屬性頁中的屬性關聯控件

    

    

    

    這樣關聯的只是關聯了內部變量,下圖中的上面一句,  但還要關聯外部變量,在VS2010中要手動添加(下面那句)

    


七、添加方法

     添加容器能調用的方法

    

    

    然後在這兒自動添加一個方法:

    

    而,在CClockOCXCtrl中添加了一個此方法的實現, 在實現這個方法的函數體中可以添加自己的內容:

    


八、添加事件

    如添加Click事件

        


九、添加通知事件

    在此例子中, 當秒針到達0時,通知容器, 讓容器能接受通知
    (1)  在控件中添加一個事件NewMinute:
        
        
     在CClockOCXCtrl中自動添加了一個NewMinute的方法
         
     (2)當秒針到達0時調用NewMinute的通知容器:
        
    (3)容器接收到控件發來的事件,然後進行迴應。  容器中自定義事件和使用容器自帶的Click事件一樣使用

十、通過HTML調用OCX

       首先註冊OCX,如果源代碼在本機通過VS編譯過則無需註冊,復下面的命令到記事本,重命名爲.bat結尾的文件,然後使用管理員權限運行
            cd %~dp0
            regsvr32 ClockOCX.ocx

        然而在打開測試網頁是通常會出現“允許阻止的內容”這個提示,要去除需要做如下設置:
IE高級選項:允許活動內容在“我的電腦”的文件中運行 選中
            
    
或者使用腳本設置,複製如下命令到記事本,重命名爲以 .reg 結尾的文件,雙擊運行
Windows Registry Editor Version 5.00   
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_LOCALMACHINE_LOCKDOWN]
"iexplore.exe"=dword:00000000

         例子:

            

<HTML>
<HEAD>
    <TITLE>New Page</TITLE>
</HEAD>
  
<BODY>
    <div id="divOcxContainer"></div>
 
    <OBJECT ID="ClockOCX" WIDTH=100 HEIGHT=51 CLASSID="CLSID:6E38E119-4EB0-4DD6-8CFB-AE5348E93AF6" codebase="ClockOCX.ocx">
    </OBJECT>
     
    <input type="button" id="btn" name="btn" value="調用控件方法" onclick="CallOCX()"></input>
 
</BODY>
</HTML>
 
<!--響應控件中的事件-->
<script language="javascript"  for="ClockOCX"  event="NewMinute">   
    alert("New Minute");   
</script>
 
<!--調用控件中的方法-->
<script language="javascript" type="text/javascript">
 
function CallOCX()
{
    var str;
    str = ClockOCX.FuncReturnStr(); 
    alert(str);
}
 
</script>

        

    

調試:
1. 設置IE註冊表
regedit→ HKEY_LOCAL_MACHINE →SOFTWARE→Microsoft →   Internet Explorer→Main。
在Main裏新建一個項  類型爲DWORD   名爲TabProcGrowth    值爲0。



2. VS設置
Property -> Configuration Propertis -> Debugging
Command項設置IE路徑:  C:\Program Files\Internet Explorer\iexplore.exe
Command Argument項設置HTML路徑: 如 C:\Users\xiongjie\Desktop\Test.html



十一、MFC中添加OCX控件:

    1Toolbox右鍵choose items,在COM components中選中相應的OCX控件,於是在Toolbox會添加一個OCX控件;

           


        2)與添加Button等其他控件一樣在Dialog中添加OCX控件。


十二、修改classid

如要設置爲: CDAFE10C-0D0B-4BE2-B90A-2C79E86F2DAA

則需在 ***Ctrl.cpp 中修改如下地方:

IMPLEMENT_OLECREATE_EX(COCTITMCtrl, "OCTITM.OCTITMCtrl.1",

 0xCDAFE10C, 0x0D0B, 0x4BE2, 0xB9, 0x0A, 0x2C, 0x79, 0xE8, 0x6F, 0x2D, 0xAA)

各個顏色部分對應填寫即可;


同時在  ****.idl 中的最下面一個uuid中設置:

uuid(CDAFE10C-0D0B-4BE2-B90A-2C79E86F2DAA)


十三、 修改屬性、方法、事件

以修改方法爲例
需修改這四個地方:
文件名
修改內容
...Ctrl.h
SHORT cardInsert(LONG iTimeout);
...Ctrl.cpp
SHORT COCTITMCtrl::cardInsert(LONG iTimeout) {  .....     }
...Ctrl
DISP_FUNCTION_ID(COCTITMCtrl, "cardInsert", dispidcardInsert, cardInsert, VT_I2, VTS_I4)
....idl
[id(13), helpstring("方法cardInsert")] SHORT cardInsert(LONG iTimeout);



十四、OCX窗口句柄

在OCX中通過GetSafeHwnd()無法獲取其句柄,需在OnSetClientSite() 函數中添加以下代碼才能獲取其句柄
if (m_pClientSite)
        // It doesn't matter who the parent window is or what the size of
        // the window is because the control's window will be reparented
        // and resized correctly later when it's in-place activated.
        VERIFY (CreateControlWindow (::GetDesktopWindow(), CRect(0,0,0,0),CRect(0,0,0,0)));






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章