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:
十、通过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
例子:
New Page
调试: 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控件:
(1)Toolbox右键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)));![]()
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
