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="调用控件方法" οnclick="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)));






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值