用ATL和MFC来创建ActiveX控件
2010-07-25 20:46:35 来源:WEB开发网属性页
ActiveX控件经常在开发者将控件放到各类容器时提供属性页帮助开发者。将消息流控件放入一个对话框的开发者可能想要配置控件的各个方面,象控件的取样间隔,或者绘图线条的颜色。例如,当控件放在一个对话框中,你想通过右击鼠标得到控件的属性时,Visual Studio显示了一个突出的对话框。这里将说明其工作过程。
Visual Studio请求控件在一个对话框框架里显示属性页(Visual Studio IspecifyPropertyPages接口请求控件提供一个属性页的清单),属性页显示在Visual Studio中,但是通过控件提供的一个COM接口,保持与控件的连接。每当你完成了属性编辑并从Visual Studio中关闭了对话框,它就会要求属性页更新控件中的属性。
当你生成一个MFC的控件时,wizard给你一个对话框模板和一个从ColePropertyPage中派生的代表此控件的缺省属性页的类。Visual Studio使得实现一个控件的属性和此属性页中的属性的连接变得容易了。当你使用ControlWizard的Automation tab添加属性到你的基于MFC的控件中的时候,你给了属性一个外部名字。这个名字是外部客户方(包括属性页)用来识别该属性的。
你按照开发其它任何对话框的方法来开发属性页——将控件添加到对话框模板,将对话框成员变量和控件联系起来。ControlWizard添加DDX/DDV代码在对话框控件和成员变量之间交换数据。然而,当你将成员变量和对话框控件相关联时,ControlWizard给你提供了这样一个机会,你可以将外部属性名字用于对话框的成员变量。此外部名字是你给控件添加属性时键入的字符串。
当属性页需要将变化应用于控件时(例如当按下Apply按钮时),属性页使用控件的Idispatch接口以及外部名字来修改控件的属性。在MFC中,你可以通过ClassWizard来添加一个新属性,添加一个新的对话框模板到工程中,让ClassWizard创建一个类——要确保是从ColePropertyPage中派生出来的类。然后,为了使新的属性页可以被外界访问到,将它的GUID添加到控件的属性页映射中(在控件的.CPP文件中查找BEGIN_ PROPPAGEIDS 和 END_PROPPAGEIDS两个宏)。不象MFC的ActiveX ControlWizard,ATL COM App Wizard并不向DLL中添加缺省的属性页。这意味着你要自己完成此工作。幸运的是,又一个wizard可以向属性页中添加基于ATL的DLL。只要选择Insert ATL Object,然后找到属性页对象。Wizard将一个对话框模板和一个C++类与所有必要的COM goo一起添加到一个属性页中。让它们完成什么工作是你的事情。
不幸的是,ATL属性页的wizard驱动特性不如基于MFC的属性页,你得手工完成应用和显示操作。这就意味着提供Apply 和 Show的函数实现到你的属性页类中。Apply函数只是提取对话框中控件的状态,遍历属性页拥有的指向控件的接口指针列表,使用接口指针来修改控件属性。Show函数通常提取控件的状态,然后以次来组织对话框的控件。下面的代码显示了基于ATL的属性页是怎样处理Apply函数的:
STDMETHOD(Apply)(void)
{
long nInterval = GetDlgItemInt(IDC_EDITINTERVAL);
ATLTRACE(_T("CMainPropPage::Apply "));
for (UINT i = 0; i < m_nObjects; i++)
{
IATLMsgTrafficCtl* pATLMsgTrafficCtl;
m_ppUnk[i]->QueryInterface(IID_IATLMsgTrafficCtl,
(void**)&pATLMsgTrafficCtl);
if(pATLMsgTrafficCtl) {
pATLMsgTrafficCtl->put_Interval(nInterval);
pATLMsgTrafficCtl->Release();
}
}
m_bDirty = FALSE;
return S_OK;
}
为基于ATL的控件提供一个属性页的第二步是确保属性页的CLSID出现在控件的属性映射中,图5中列出的属性持续代码提供了它的一个例子。消息映射表明了控件的图线颜色,被标准的颜色属性页管理。控件的取样间隔由控件的主属性页来管理。
Window 消息
MFC和ATL在它们处理window消息方面有很多共同之处,都使用消息映射,都有wizards来生成代码处理window消息。在MFC中,消息映射可以添加到任何一个CcmdTarget派生的类中,然后你就可以用ClassWizard来建立你的控件的事件处理器了。图6显示了基于MFC的控件怎样处理WM_ TIMER消息。另外,MFC提供了处理命令和控件通告的宏。象MFC一样,ATL通过消息映射来处理window消息,只要你的类是从CwindowImpl派生的,而且包含ATL的消息映射宏,你就可以使用类视来建立事件处理器。图7显示了ATL消息流控制是怎样处理WM_TIMER消息的。
ATL使用MESSAGE_HANDLER宏将标准的window消息映射到一个C++类。此宏简单的产生一个将window消息和类的成员函数关联的表。除了常规消息,消息映射还可以处理其它类型的事件。图8显示了能参与消息映射的各种宏。
- ››创建SQL2005自动备份,定期删除的维护计划
- ››创建动态表单 javascript
- ››MFC中有多个slider时OnHScroll函数判断方法
- ››MFC自绘按钮
- ››创建基于PPTP的站点到站点VPN连接:ISA2006系列之...
- ››创建基于L2TP的站点到站点的VPN连接:ISA2006系列...
- ››创建一个Twisted Reactor TCP服务器
- ››创建Windows Mobile上兼容性好的UI 程序
- ››创建android的Service
- ››创建远古部落环境与原住民角色
- ››创建并扩展Apache Wicket Web应用
- ››创建不在任务条中显示窗口按钮的应用
更多精彩
赞助商链接