今天因工作需要,再次拿起VC编写了一个demo的Active控件,以验证属性、方法、事件在C#宿主程序中的使用情况。
- 如何添加属性
在类视图中选择接口,右键后选择“添加属性”。属性添加完毕后,需要回到Ctrl类来编写对属性操作的代码,如:
- 如何添加方法
在类视图中选择接口,右键后选择“添加方法”。
LONG CMyActiveXDemoCtrl::DemoGetStrLen(LPCTSTR _str1) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: 在此添加调度处理程序代码 //[触发一个事件,看宿主程序是否能响应。 DemoEvent1(_str1); //] //返回长度 return lstrlen(_str1); }
- 如何添加事件
这里确实费了点劲才找到插入事件的地方,在类视图中选择Ctrl类,邮件后选择“添加事件”,添加事件时可选择参数信息。通过向导,可以看到在CPP文件中:
// 事件映射 BEGIN_EVENT_MAP(CMyActiveXDemoCtrl, COleControl) EVENT_CUSTOM_ID("DemoEvent1", eventidDemoEvent1, DemoEvent1, VTS_BSTR) END_EVENT_MAP()
在头文件中
void DemoEvent1(LPCTSTR _info)
{
FireEvent(eventidDemoEvent1, EVENT_PARAM(VTS_BSTR), _info);
}
- C#宿主程序中
private void btn_test_Click(object sender, EventArgs e) { this.axMyActiveXDemo1.PropDemoStr = "a道凯科技"; long res = this.axMyActiveXDemo1.DemoGetStrLen("a道凯科技"); } //一下为对事件的响应函数 private void axMyActiveXDemo1_DemoEvent1(object sender, AxMyActiveXDemoLib._DMyActiveXDemoEvents_DemoEvent1Event e) { int a = 0; }
由于在DemoGetStrLen的接口中,控件已触发了事件,因此在C#的事件响应函数中打上断点,确实可以看到被”触发”了。