定义基本项目后,需要添加可与工具选项板框架通信的 COM 对象。由于您的项目使用 ATL,因此添加 COM 对象的最简单方法是使用 Visual Studio ATL 向导。有关使用此向导的指导,请参阅 Microsoft 文档。
创建 COM 包装器
- 使用 ATL 向导创建 ATL 简单对象。将其简称为“简单工具”。接受其他名称的默认值。
- 关闭向导对话框以提交您的选择。
ATL 向导将创建多个新文件并将它们添加到项目中。这些文件创建一个接口定义和 acoclass。ISimpleToolCSimpleTool
- 从 Visual Studio 项目视图中,在 Visual Studio 编辑器中打开SimpleTool.h文件。
请注意,thecoclass 派生自以下标准 ATL 类:CSimpleTool
-
CComObjectRootEx
-
CComCoClass
-
IDispatchImpl
在下一过程中,您将更改此派生以使用类。AcadToolImpl
从 AcadToolImpl 类派生
- 在SimpleTool.h文件中,包括AcadToolImpl.h文件。
- 查找 thecoclass 声明。CSimpleTool
- 从 and 中删除 coclass 的派生。CComObjectRootExIDispatchImpl
CSimpleTool现在仅派生自。CComCoClass
- 在之后添加新的基模板类。AcadToolImplCComCoClass
- 按显示的顺序将以下参数添加到模板中:AcadToolImpl
- 同类名 (CSimpleTool)
- 接口名称 (ISimpleTool)
- 对工具的类 ID (CLSID_SimpleTool)
模板也需要这两个附加参数:LPCTSTRAcadToolImpl
- 用于标识工具选项板上工具图标的标签
- 图标的位图资源 ID 作为字符串
为了使此信息对声明和实现都可用,请将它们声明为全局变量。
- 在SimpleTool.cpp文件的顶部附近,在 last语句后添加以下非静态全局声明:#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。
- Passandto 基类声明作为其第四和第五个模板参数。szSimpleToolNameszSimpleToolImageAcadToolImpl
最终的 coclass 派生应与以下内容匹配:
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提供对属性检查器接口(如 and)的访问。此实现使您可以轻松地使“特性”选项板 UI 适应应用程序的需求。但是,即使您不打算使用此功能,也必须提供少量支持代码。IAcPiPropertyDisplayImplIPerPropertyDisplay
完成骨架应用程序
- 在 yourcoclass 声明中,添加以下一对宏调用: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
|