WEB开发网
开发学院软件开发VC 组件对象模型与ATL实现 阅读

组件对象模型与ATL实现

 2010-09-04 20:48:02 来源:WEB开发网   
核心提示:第二步 添加Canvas控件首先,我们这里要添加的Canvas组件是一个含有窗口控制的ActiveX控件,组件对象模型与ATL实现(3),同时它也是MapLib对象模型的根组件,所以,微软在新版本里去掉默认属性化说明属性化的确有相当的负作用,好拉,选择向MapLib添加新的类,它属于[ATL]类别的[ATL控件]

第二步 添加Canvas控件

首先,我们这里要添加的Canvas组件是一个含有窗口控制的ActiveX控件,同时它也是MapLib对象模型的根组件。所以,选择向MapLib添加新的类,它属于[ATL]类别的[ATL控件]。选中后按[添加]按钮,出现[ATL控件向导 - MapLib]对话框,按下面的要求填写:

[名称]

C++/简称:Canvas。其他默认。

[选项]

控件类型/标准控件。线程模型/单元。支持/连接点/已授权。其他默认。

[接口]

可以全部支持。

[外观]

视图状态/不透明/单色背景。其他/全选中。杂项状态/全不选。其他默认。

[常用属性]

你可以选中几个简单的,如:Appearance和Background Color。

按[完成]按钮。其实,上面的很多选项都可以以后添加,要求你熟悉ATL向导生成的代码。本文为简单起见,忽略了许多实际需要的因素。记住一点:在任何时候绝对不要使用属性化。这个在VS2003里作为默认选中的选项,在VC2005里被去掉了。首先,我不喜欢属性化。其次,属性化看似简单,但引入了另一个复杂性。微软在新版本里去掉默认属性化说明属性化的确有相当的负作用。

好拉,让我们再看看类型库(MapLib.idl):

// MapLib.idl : MapLib 的IDL 源
//

// 此文件将由MIDL 工具处理以
// 产生类型库(MapLib.tlb)和封送处理代码。

#include "olectl.h"
import "oaidl.idl";
import "ocidl.idl";

[
    object,
    uuid(A74C036D-B046-4F53-B53A-F8EF611F576D),
    dual,
    nonextensible,
    helpstring("ICanvas 接口"),
    pointer_default(unique)
]
interface ICanvas : IDispatch{
    [propput, bindable, requestedit, id(DISPID_BACKCOLOR)]
    HRESULT BackColor([in]OLE_COLOR clr);
    [propget, bindable, requestedit, id(DISPID_BACKCOLOR)]
    HRESULT BackColor([out,retval]OLE_COLOR* pclr);
    [propput, bindable, requestedit, id(DISPID_APPEARANCE)]
    HRESULT Appearance([in]short nAppearance);
    [propget, bindable, requestedit, id(DISPID_APPEARANCE)]
    HRESULT Appearance([out, retval]short* pnAppearance);
};

[
     uuid(C8C046AB-3D44-45EF-B11C-C5822862049A),
     version(1.0),
     helpstring("MapLib 1.0 类型库")
]
library MapLibLib
{
     importlib("stdole2.tlb");
     [
         uuid(BC3D7FCC-C1AE-4476-A59C-431457A1173C),
         control,
         helpstring("Canvas Class")
     ]
     coclass Canvas
     {
         [default] interface ICanvas;
     };
};

上一页  1 2 3 4 5 6 7 8  下一页

Tags:组件 对象 模型

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接