创建工具选项板 COM 包装器
定义基本项目后,需要添加一个可与工具面板框架通信的 COM 对象。由于项目使用 ATL,因此添加 COM 对象的最简单方法是使用 Visual Studio ATL 向导。有关使用此向导的指导,请参阅 Microsoft 文档。
创建 COM 包装器
- 使用 ATL 向导,创建一个 ATL 简单对象。将其简称为“Simple Tool”。接受其他名称的默认值。
- 关闭向导对话框以提交您的选择。
ATL 向导将创建多个新文件,并将它们添加到项目中。这些文件创建接口定义和协类。ISimpleToolCSimpleTool
- 在 Visual Studio 项目视图中,在 Visual Studio 编辑器中打开 SimpleTool.h 文件。
请注意,coclass 派生自以下标准 ATL 类:CSimpleTool
-
CComObjectRootEx
-
CComCoClass
-
IDispatchImpl
在下一个过程中,将此派生更改为使用该类。AcadToolImpl
派生自 AcadToolImpl 类
- 在 SimpleTool.h 文件中,包括 AcadToolImpl.h 文件。
- 查找 coclass 声明。CSimpleTool
- 从 和 中删除 coclass' 的派生。CComObjectRootExIDispatchImpl
CSimpleTool现在仅派生自 .CComCoClass
- 在 之后添加新的基模板类 。AcadToolImplCComCoClass
- 按显示的顺序将以下参数添加到模板中:AcadToolImpl
- Coclass 名称 (CSimpleTool)
- 接口名称 (ISimpleTool)
- 对工具类 ID (CLSID_SimpleTool)
模板还需要这两个附加参数:LPCTSTRAcadToolImpl
- 用于标识工具选项板上工具图标的标签
- 图标的位图资源 ID (以字符串形式)
为了使此信息可供声明和实现使用,请将它们声明为全局变量。
- 在SimpleTool.cpp文件顶部附近,在最后一个语句后添加以下非静态全局声明:#include
TCHAR szSimpleToolName[256] = “Simple Tool”;
TCHAR szSimpleToolImage[256] = “IDB_TOOL1”;
- 在 SimpleTool.h 文件中,在 coclass 声明之前添加以下声明:extern
extern TCHAR szSimpleToolName[256];
extern TCHAR szSimpleToolImage[256];
在实现文件中声明这些全局变量,并在头文件中从外部引用它们有助于避免 MSVC 链接器错误LNK2005。
- 传递 和 到基类声明作为其第四个和第五个模板参数。szSimpleToolNameszSimpleToolImageAcadToolImpl
最终的协类派生应与以下内容匹配:
class ATL_NO_VTABLE CSimpleTool :
public CComCoClass<CSimpleTool, &CLSID_SimpleTool>,
public AcadToolImpl<CSimpleTool, ISimpleTool, &CLSID_SimpleTool, szSimpleToolName, szSimpleToolImage>
必须对 ATL 的默认实现进行最后一项更改。从 中派生时,不需要 ATL COM 映射。该类处理传出接口。AcadToolImplAcadToolImpl
- 从对 的宏调用中删除 COM 映射宏声明及其条目。BEGIN_COM_MAPEND_COM_MAP
现在,您的 coclass 已正确派生,并删除了不需要的 ATL 代码。但是,在编译和生成项目之前,需要添加一些支持。AcadToolImpl
AcadToolImpl提供对 Property Inspector 接口(如 和 )的访问。通过此实现,可以轻松地使“属性”选项板 UI 适应应用程序的需要。但是,即使您不打算使用此功能,也必须提供少量的支持代码。IAcPiPropertyDisplayImplIPerPropertyDisplay
完成骨架应用程序
- 在 coclass 声明中,添加以下一对宏调用:CSimpleTool
BEGIN_PERPROPDISPLAY_MAP2()
END_PERPROPDISPLAY_MAP2()
- 添加另一对宏调用:
BEGIN_FLYOUT_SPECIFIC_MAP()
END_FLYOUT_SPECIFIC_MAP()
注意:尽管此处未使用宏映射,但在此过程中添加的宏映射对于编译从类派生的类是必需的。AcadToolImpl
- 将以下方法定义添加到 coclass 声明中:
virtual HINSTANCE GetResourceInstance()
{
return _AtlBaseModule.GetResourceInstance();
}
- 在SimpleTool.cpp文件中,包括该文件。AcTc_i.c
|