ATL中手工添加连接点事件的方法 【转】
2010-01-06 16:58
323 查看
【转】http://www.cppblog.com/xczhang/archive/2006/06/09/8356.html
大家知道,在ATL编程时我们都是用应用程序向导辅助我们完成工作,连接点事件的添加也是如此,但有的时候由于疏忽,我们可能忘了勾中向导中的连接点复选框,以至无法添加事件;这对于高手当然不是什么问题,但对于刚入门的朋友却会因此手足无措,其实我们可以手工地添加连接点事件。
你可以在你的 Ctrl.idl文件中加做如下修改:(假设你的项目名为Ctrl ,带注释的语句是要手工添加的语句,注意语句位置)
#include "olectl.h"
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(5CE437A0-EDA0-4344-9E40-75BD83545A9E),
dual,
nonextensible,
helpstring("IMyCtrl 接口"),
pointer_default(unique)
]
interface IMyCtrl : IDispatch{
[propput, bindable, requestedit, id(DISPID_FILLCOLOR)]
HRESULT FillColor([in]OLE_COLOR clr);
[propget, bindable, requestedit, id(DISPID_FILLCOLOR)]
HRESULT FillColor([out, retval]OLE_COLOR* pclr);
[propget, id(1), helpstring("属性 Sides")] HRESULT Sides([out, retval] SHORT* pVal);
[propput, id(1), helpstring("属性 Sides")] HRESULT Sides([in] SHORT newVal);
};
[
uuid(36791A3C-FCA8-48E8-A014-6BA79BF36A63),
version(1.0),
helpstring("Ctrl 1.0 类型库")
]
library CtrlLib
{
importlib("stdole2.tlb");
[
uuid(4C60C639-22A1-44c3-AB84-C0EAE5940DCA), //利用guidgen,exe生成一个ID填入括号
helpstring("_IMyCtrlEvent 接口") //说明你的事件接口
]
dispinterface _IMyCtrlEvent //添加此语句以声明接口
{
properties: //属性说明加在此行下面
methods: //方法说明加在此行下面
[id(1),helpstring("方法ClickIn")] HRESULT ClickIn([in] LONG x, [in] LONG y); //你自己添加的方法
[id(2),helpstring("方法ClickOut")] HRESULT ClickOut([in] LONG x, [in] LONG y); //你自己添加的方法
};
[
uuid(5B9C55CC-AD7B-426B-94E3-0587AEB3A5F9),
helpstring("MyCtrl Class")
]
coclass MyCtrl
{
[default] interface IMyCtrl;
[default,source] dispinterface _IMyCtrlEvent; //添加这行声明接口_IMyCtrlEvent为默认源接口
};
};
作了如上修改后,右键单击Ctrl.idl文件,在弹出菜单中选择“编译“,生成Ctrl.tlb。然后右键单击控件选择“添加连接点“,打开“欢迎使用实现连接点向导“对话框,在“源接口“列表框双击你的事件,把它添加到“实现连接点“列表框。好了,看看你的项目里增加了什么东东?
大家知道,在ATL编程时我们都是用应用程序向导辅助我们完成工作,连接点事件的添加也是如此,但有的时候由于疏忽,我们可能忘了勾中向导中的连接点复选框,以至无法添加事件;这对于高手当然不是什么问题,但对于刚入门的朋友却会因此手足无措,其实我们可以手工地添加连接点事件。
你可以在你的 Ctrl.idl文件中加做如下修改:(假设你的项目名为Ctrl ,带注释的语句是要手工添加的语句,注意语句位置)
#include "olectl.h"
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(5CE437A0-EDA0-4344-9E40-75BD83545A9E),
dual,
nonextensible,
helpstring("IMyCtrl 接口"),
pointer_default(unique)
]
interface IMyCtrl : IDispatch{
[propput, bindable, requestedit, id(DISPID_FILLCOLOR)]
HRESULT FillColor([in]OLE_COLOR clr);
[propget, bindable, requestedit, id(DISPID_FILLCOLOR)]
HRESULT FillColor([out, retval]OLE_COLOR* pclr);
[propget, id(1), helpstring("属性 Sides")] HRESULT Sides([out, retval] SHORT* pVal);
[propput, id(1), helpstring("属性 Sides")] HRESULT Sides([in] SHORT newVal);
};
[
uuid(36791A3C-FCA8-48E8-A014-6BA79BF36A63),
version(1.0),
helpstring("Ctrl 1.0 类型库")
]
library CtrlLib
{
importlib("stdole2.tlb");
[
uuid(4C60C639-22A1-44c3-AB84-C0EAE5940DCA), //利用guidgen,exe生成一个ID填入括号
helpstring("_IMyCtrlEvent 接口") //说明你的事件接口
]
dispinterface _IMyCtrlEvent //添加此语句以声明接口
{
properties: //属性说明加在此行下面
methods: //方法说明加在此行下面
[id(1),helpstring("方法ClickIn")] HRESULT ClickIn([in] LONG x, [in] LONG y); //你自己添加的方法
[id(2),helpstring("方法ClickOut")] HRESULT ClickOut([in] LONG x, [in] LONG y); //你自己添加的方法
};
[
uuid(5B9C55CC-AD7B-426B-94E3-0587AEB3A5F9),
helpstring("MyCtrl Class")
]
coclass MyCtrl
{
[default] interface IMyCtrl;
[default,source] dispinterface _IMyCtrlEvent; //添加这行声明接口_IMyCtrlEvent为默认源接口
};
};
作了如上修改后,右键单击Ctrl.idl文件,在弹出菜单中选择“编译“,生成Ctrl.tlb。然后右键单击控件选择“添加连接点“,打开“欢迎使用实现连接点向导“对话框,在“源接口“列表框双击你的事件,把它添加到“实现连接点“列表框。好了,看看你的项目里增加了什么东东?
相关文章推荐
- 关于写ATL控件时对控件添加事件事 'IID__IXXXEvents' : undeclared identifier的问题解决方法
- Vs2010 Atl工程手工添加连接点
- (ZT)ATL:连接点及接收事件的两种方法
- 给自定义控件(Web Control)添加事件的几种方法。前两种方法可以不实现IPostBackEventHandler
- JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法
- 关于html 中a标签添加点击事件的方法总结
- 使用ATL开发ActiveX控件(添加事件,自己整理)
- Silverlight学习笔记十八最简单的添加双击事件的实现方法
- jq添加和移除事件的方法,prop和attr
- js动态添加onload、onresize、onscroll事件(另类方法)
- EasyUI为Numberbox添加blur事件的方法
- 【笔记】jQuery中on()与delegate()方法给动态添加元素绑定事件
- jQuery给动态添加的元素绑定事件的方法
- listview里的button事件添加方法
- Java添加事件监听的四种方法代码实例
- jquery live方法,解决jquery动态添加按钮无法触发点击事件的问题
- C# 为一个方法添加事件的方法 Event delegate
- addTarget事件添加方法在OC和Swift中的区别
- 安卓给按钮添加监听事件的四种方法2.