MFC程序员的WTL指南(7)包容ActiveX控件
2006-07-22 22:03:17 来源:WEB开发网核心提示: ATL中使用控件的类在对话框中使用ActiveX控件需要两个类协同工作:CAxDialogImpl和CAxWindow,它们处理所有控件容器必须实现的接口方法,MFC程序员的WTL指南(7)包容ActiveX控件(3),提供通用的功能函数,例如查询控件的某个特殊的COM接口,新的入口是在内
ATL中使用控件的类
在对话框中使用ActiveX控件需要两个类协同工作:CAxDialogImpl和CAxWindow。它们处理所有控件容器必须实现的接口方法,提供通用的功能函数,例如查询控件的某个特殊的COM接口。
CAxDialogImpl第一个类是CAxDialogImpl,你的对话框要能够包容控件就必须从CAxDialogImpl类派生而不是从CDialogImpl类派生。CAxDialogImpl类重载了Create()和DoModal()函数,这两个函数分别被全局函数AtlAxCreateDialog()和AtlAxDialogBox()调用。既然IEHoster对话框是由Create()创建的,我们看看AtlAxCreateDialog()到底做了什么工作。
AtlAxCreateDialog()使用辅助类_DialogSplitHelper装载对话框资源,这个辅助类遍历所以对话框的控件,查找由资源编辑器创建的特殊的入口,这些特殊的入口表示这是一个ActiveX控件。例如,下面是IEHoster.rc文件中浏览器控件的入口:
CONTROL "",IDC_IE,"{8856F961-340A-11D0-A96B-00C04FD705A2}",
WS_TABSTOP,7,7,116,85
第一个参数是窗口文字(空字符串),第二个是控件的ID,第三个是窗口的类名。_DialogSplitHelper::SplitDialogTemplate()函数找到以''{''开始的窗口类名时就知道这是一个ActiveX控件的入口。它在内存中创建了一个临时对话框模板,在这个新模板中这些特殊的控件入口被创建的AtlAxWin窗口代替,新的入口是在内存中的等价体:
CONTROL "{8856F961-340A-11D0-A96B-00C04FD705A2}",IDC_IE,"AtlAxWin",
WS_TABSTOP,7,7,116,85
结果就是创建了一个相同ID的AtlAxWin窗口,窗口的标题是ActiveX控件的GUID。所以你调用GetDlgItem(IDC_IE)返回的值是AtlAxWin窗口的句柄而不是ActiveX控件本身。
更多精彩
赞助商链接