VC中使用ATL编写控件
作者:邵盛松 2010年10月29日
源码下载地址:http://download.csdn.net/source/2793074
在VC2005中创建控件,可以使用MFC创建控件,也可以使用ATL创建控件
一 ATL项目的创建
在VC2005中新建一个项目,项目类型选择ATL,模板选择ATL项目。项目名称命名为ActiveXDemo。
ATL项目向导的概述中直接下一步
ATL项目的应用程序设置如下
服务器类选选择动态链接库(DLL)
附加选项勾选允许合并代理/存根(stub)代码
二 添加ATL控件
步骤
在解决方案资源管理或类视图中选中项目右键 添加->类
在ATL模板中添加ATL控件
1 简称
简称为ATLCtrl其他各项向导会自动添加
2 选项
控件类型为标准控件,线程模型为单元,接口为双重,聚合为是支持勾选连接点
3 接口
默认就可以
4 外观
添加的控件基于none,其他各项默认
5 常用属性
默认,直接完成
三 调试方法
项目文件夹ATLCtrl.htm可以用来测试控件
调试方法
配置下调试环境
命令参数填写ATLCtrl.htm的路径。
调试时,程序程序自动打开了IE。
如果IE出现了为了有利于保护安全性,IE已限制此网页运行可以访问计算机的脚本或 ActiveX 控件。请单击这里获取选项。
那就允许阻止的内容
结果出现了ATL8.0:ATLCtrl
这个控件的基本结构就完成了。
四 添加窗口
选择项目右键添加->类,添加ATL对话框
在ATL对话框向导的简称中输入ATLWnd
在类视图中选中CATLCtrl
在ATLCtrl中添加一个类型为CATLWnd* m_pWnd的成员变量
在ATL中VC并没有像MFC那样自动添加头文件,需要手动添加
#include "ATLWnd.h"
然后添加一个WM_CREATE消息
VC自动创建了OnCreate函数,并创建窗口如下
LRESULT CATLCtrl::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
RECT rc = {0};
this->GetWindowRect(&rc);
m_pWnd = new CATLWnd();
if( !::IsWindow(m_pWnd->m_hWnd) )
{
m_pWnd->Create(this->m_hWnd, rc);
}
return 0;
}
在资源视图中将ID为IDD_ATLWND的对话框属性设置如下
Style设置为Child
Visible设置为True
在CATLCtrl的构造函数中添加m_bWindowOnly = true;
代码如下
CATLCtrl()
: m_pWnd(NULL)
{
m_bWindowOnly = true;
}
调试之后 ,窗口就显示了出来。
五 ATL 安全接口的实现
在VC2005实现安全接口很容易,只要将控件类CATLCtrl继承IObjectSafetyImpl就可以。
具体实现
在ATLCtrl.h文件中找到如下代码 将#ifdef和#endif注释就完成了
#ifdef _WIN32_WCE // 要在Windows CE 上正确加载该控件,要求IObjectSafety
public IObjectSafetyImpl,
#endif
#ifdef _WIN32_WCE // 要在Windows CE 上正确加载该控件,要求IObjectSafety
COM_INTERFACE_ENTRY_IID(IID_IObjectSafety, IObjectSafety)
#endif
本文在VC2005+ ATL8.0下调试通过