Creating a Setting Controller-封装配置文件访问
摘要
本文介绍如何创建设置控制器。
本用例可学到的内容
CAACafCtrlToolsOptions 用例
- CAACafCtrlToolsOptions 的功能
- 启动 CAACafCtrlToolsOptions 的方法
- CAACafCtrlToolsOptions 代码存放位置
分步实现
简要总结
参考文献
本用例学习要点
本用例旨在演示如何创建设置控制器组件,以此封装配置文件并保证对其的唯一访问权限。通过设置控制器,多个应用程序可访问存储在配置文件中的参数,且无需了解文件内部存储细节。
设置控制器可确保不同应用程序对配置文件的访问方式保持一致,其中 ** 工具 / 选项(Tools/Options)** 命令是最重要的应用程序。
本文介绍了设置控制器的一个实际用例,如需更多说明,请参阅相关主题的技术文献 [1]。
CAACafCtrlToolsOptions 用例
CAACafCtrlToolsOptions 是 CAACATIAApplicationFrm.edu 框架下的一个用例,用于演示 CATIAApplicationFrame 框架的功能特性。
CAACafCtrlToolsOptions 的功能
CAACafCtrlToolsOptions 会为配置文件创建设置控制器,相关选项将应用于我们的 CAAGeometry 文档中。
该设置控制器供通过工具 / 选项(Tools/Options)命令打开的图元属性页调用。用例「创建应用程序属性的属性页」[2] 介绍了如何创建该属性页。

该属性页显示以下分组内的三个参数:
- “标识符” 分组:用于修改和显示图元标识符的可见性。图元通过 CAAV5 几何创建工作台的命令生成。图元标识符可永久设置为
- 隐藏
- 显示
- 仅在图元预选时显示(即光标悬停在图元上方时)
- “每条曲线最大点数” 分组:用于修改和显示离散化一条曲线所用的最大点数。
- “隐含点” 分组:用于修改和显示隐含点的可见性,可设置为显示或隐藏。
这三个参数保存在 CAACafGeometryElt 配置文件中,且必须始终通过 CAACafGeometryEltSettingCtrl 设置控制器进行访问。该控制器是一个组件,实现了以下接口:
- CATIIniSettingManagment
该接口定义于 **InteractiveInterfaces(交互接口)** 框架中,用于管理配置库的通用方法,如提交、保存等。 - CAAICafGeometryEltSettingAtt
该接口专用于当前配置文件,允许各应用程序获取和设置参数,而无需了解其内部存储细节。
如何启动 CAACafCtrlToolsOptions
有关本用例的详细启动方式,请参见《CAAGeometry 示例》用例中标题为 **“如何启动 CAAGeometry 用例”** 的章节。
CAACafCtrlToolsOptions 代码位置
CAACafCtrlToolsOptions 用例包含各类类与接口,存放于 CAACafCtrlToolsOptions.m 模块,以及 CAACATIAApplicationFrm.edu 框架的 **ProtectedInterfaces(受保护接口)** 目录中:
- Windows 系统:
安装根目录\CAACATIAApplicationFrm.edu\CAACafCtrlToolsOptions.m\ - Unix 系统:
安装根目录/CAACATIAApplicationFrm.edu/CAACafCtrlToolsOptions.m/
其中 安装根目录 指 CAA 安装光盘的安装路径。
这些类与接口说明如下:
- CAAICafGeometryEltSettingAtt:用于访问各个参数的接口
- TIE_CAAICafGeometryEltSettingAtt:该接口的 TIE 绑定类
- CAACafGeometryEltSettingCtrl:设置控制器组件的主类
- CAAECafGeometryEltSettingAtt:实现 CAAICafGeometryEltSettingAtt 接口的设置控制器组件扩展类
- CAAECafSettingManagmentForGeometryElt:实现 CATIIniSettingManagment 接口的设置控制器组件扩展类
- GetCAACafGeometryEltSettingCtrl:用于获取设置控制器的工厂函数
分步实现
创建一个设置控制器主要包含五个步骤:
- 创建用于访问各参数的接口
- 创建设置控制器组件主类
- 实现 CAAICafGeometryEltSettingAtt 接口
- 实现 CATIIniSettingManagment 接口
- 创建设置控制器的工厂类
创建用于访问各参数的接口
CAAICafGeometryEltSettingAtt 接口专用于访问以下三个参数:- 控制图元标识符的显示状态(隐藏、显示、预选时显示)
- 定义离散化曲线所用的最大点数
- 控制隐含点的显示状态(隐藏、显示)
- 头文件
以下是 CAAICafGeometryEltSettingAtt 接口的头文件:
#include "IUnknown.h"
#include "CAACafCtrlToolsOptions.h"
extern IID IID_CAAICafGeometryEltSettingAtt;
class CATString;
class CATSettingInfo ;
class ExportedByCAACafCtrlToolsOptions CAAICafGeometryEltSettingAtt : public IUnknown
{
public :
virtual HRESULT Initialize() = 0;
virtual HRESULT GetIdentifierVisibility(CATString & oIdVisibility) = 0;
virtual HRESULT SetIdentifierVisibility(const CATString & iIdVisibility) = 0;
virtual HRESULT GetInfoIdentifierVisibility(CATSettingInfo * oInfo) = 0;
virtual HRESULT GetMaxPointCurve(int & oMaxPoint) = 0;
virtual HRESULT SetMaxPointCurve(const int iMaxPoint) = 0;
virtual HRESULT GetInfoMaxPointCurve(CATSettingInfo ** oInfoArray, int * oNbSettingInfo) = 0;
virtual HRESULT GetImplPointVisibility(CATString & oImplPointVisibility) = 0;
virtual HRESULT SetImplPointVisibility(const CATString & iImplPointVisibility) = 0;
virtual HRESULT GetInfoImplPointVisibility(CATSettingInfo * oInfo) = 0;
};
该对象建模器接口继承自 IUnknown 接口。与所有接口一样,它拥有一个以
IID_ 加接口名称命名的接口唯一标识符(IID)。此接口由 CAACafCtrlToolsOptions.m 模块导出。该接口定义了:
- 一个 **Initialize(初始化)** 方法。关于该重要方法的更多细节,请参考技术文档《设置控制器》[1]。
- 针对每个参数,各定义三个方法:
Setxxx:修改参数(SetIdentifierVisibility、SetMaxPointCurve、SetImplPointVisibility)Getxxx:获取参数值(GetIdentifierVisibility、GetMaxPointCurve、GetImplPointVisibility)GetInfoxxx:获取CATSettingInfo实例,用于构建充当锁的对话框对象(GetInfoIdentifierVisibility、GetInfoMaxPointCurve、GetInfoImplPointVisibility)
- 源文件
以下是 CAAICafGeometryEltSettingAtt 接口的源文件:
#include <CAAICafGeometryEltSettingAtt.h> IIID IID_CAAICafGeometryEltSettingAtt={ /* 8a2969d2-0e0d-11d5-85c1-00108335648a */ 0x8a2969d2, 0x0e0d, 0x11d5, {0x85, 0xc1, 0x00, 0x10, 0x83, 0x35, 0x64, 0x8a} };
该文件包含一个全局唯一标识符(GUID)[3],以粗体显示。 -
TIE 文件说明
要让组件能够实现该接口,必须在src目录下创建名为 TIE_CAAICafGeometryEltSettingAtt.tsrc 的文件,文件内容需包含:
#include "CAAICafGeometryEltSettingAtt.h"
多工作区应用构建工具(mkmk)将为该接口生成 TIE 绑定类,即位于 ProtectedGenerated 目录下的TIE_CAAICafGeometryEltSettingAtt.h文件。 -
修改 IID 文件
在CNext/code/dictionary目录下,修改或创建CAACATIAApplicationFrm.edu.idd文件,并添加以下一行内容:
{8a2969d2‑0e0d‑11d5‑85c1‑00108335648a} CAAICafGeometryEltSettingAtt
第一部分是前两步定义的全局唯一标识符(GUID)[3],第二部分是接口名称。
创建设置控制器组件主类
-
头文件
以下是
CAACafGeometryEltSettingCtrl 类的头文件:#include "CATBaseUnknown.h"
#include "CATIniCleanerSettingCtrl.h"
class CAACafGeometryEltSettingCtrl : public CATBaseUnknown
{
CATDeclareClass;
public:
CAACafGeometryEltSettingCtrl();
virtual ~CAACafGeometryEltSettingCtrl();
static HRESULT GetSettingController(CAACafGeometryEltSettingCtrl ** oCtrl);
private:
CAACafGeometryEltSettingCtrl(const CAACafGeometryEltSettingCtrl &iObjectToCopy);
CAACafGeometryEltSettingCtrl & operator = (const CAACafGeometryEltSettingCtrl &iObjectToCopy);
private:
static CATIniCleanerSettingCtrl _CleanerCtrl ;
};
#include "CATIniCleanerSettingCtrl.h"
class CAACafGeometryEltSettingCtrl : public CATBaseUnknown
{
CATDeclareClass;
public:
CAACafGeometryEltSettingCtrl();
virtual ~CAACafGeometryEltSettingCtrl();
static HRESULT GetSettingController(CAACafGeometryEltSettingCtrl ** oCtrl);
private:
CAACafGeometryEltSettingCtrl(const CAACafGeometryEltSettingCtrl &iObjectToCopy);
CAACafGeometryEltSettingCtrl & operator = (const CAACafGeometryEltSettingCtrl &iObjectToCopy);
private:
static CATIniCleanerSettingCtrl _CleanerCtrl ;
};
CAACafGeometryEltSettingCtrl 这个 C++ 类继承自 CATBaseUnknown。CATDeclareClass 宏用于声明该类属于一个组件。拷贝构造函数和赋值运算符=被声明为私有,以防止编译器将它们自动生成为公有成员。
CAACafGeometryEltSettingCtrl 组件类在一次会话中仅会被创建一次。GetSettingController 方法返回指向该类的唯一实例指针。为了管理该指针的销毁操作,代码中使用了 CATIniCleanerSettingCtrl 类的实例。静态数据成员 _CleanerCtrl 用于持有这个唯一指针。
CAACafGeometryEltSettingCtrl 组件类在一次会话中仅会被创建一次。GetSettingController 方法返回指向该类的唯一实例指针。为了管理该指针的销毁操作,代码中使用了 CATIniCleanerSettingCtrl 类的实例。静态数据成员 _CleanerCtrl 用于持有这个唯一指针。
- 源文件
#include "CAACafGeometryEltSettingCtrl.h"
#include "CAAICafGeometryEltSettingAtt.h"
#include "CATIIniSettingManagment.h"
#include "CATErrorDef.h"
#include "CATBoolean.h"
CATIniCleanerSettingCtrl CAACafGeometryEltSettingCtrl::_CleanerCtrl ;
CATImplementClass(CAACafGeometryEltSettingCtrl,
Implementation,
CATBaseUnknown ,
CATNull);
CAACafGeometryEltSettingCtrl::CAACafGeometryEltSettingCtrl()
{
}
CAACafGeometryEltSettingCtrl::~CAACafGeometryEltSettingCtrl()
{
}
...
#include "CAAICafGeometryEltSettingAtt.h"
#include "CATIIniSettingManagment.h"
#include "CATErrorDef.h"
#include "CATBoolean.h"
CATIniCleanerSettingCtrl CAACafGeometryEltSettingCtrl::_CleanerCtrl ;
CATImplementClass(CAACafGeometryEltSettingCtrl,
Implementation,
CATBaseUnknown ,
CATNull);
CAACafGeometryEltSettingCtrl::CAACafGeometryEltSettingCtrl()
{
}
CAACafGeometryEltSettingCtrl::~CAACafGeometryEltSettingCtrl()
{
}
...
静态数据成员 _CleanerCtrl 完成实例化创建。
CATImplementClass 宏通过关键字 Implementation(实现类),声明 CAACafGeometryEltSettingCtrl 类为组件主类,同时该类在对象建模器(OM)层面继承自 CATBaseUnknown。
构造函数与析构函数均为空实现。
CATImplementClass 宏通过关键字 Implementation(实现类),声明 CAACafGeometryEltSettingCtrl 类为组件主类,同时该类在对象建模器(OM)层面继承自 CATBaseUnknown。
构造函数与析构函数均为空实现。
HRESULT CAACafGeometryEltSettingCtrl::GetSettingController
(CAACafGeometryEltSettingCtrl ** oCtrl)
{
// 定义返回码,初始为执行成功
HRESULT rc = S_OK ;
// 校验输出参数指针是否有效
if ( NULL != oCtrl )
{
*oCtrl = NULL ;
// 从清理控制器中获取已存在的设置控制器实例
CATBaseUnknown * pCtrl = _CleanerCtrl.GetController();
// 若当前无实例,则新建
if ( NULL == pCtrl )
{
CAACafGeometryEltSettingCtrl * SettingController = NULL;
SettingController = new CAACafGeometryEltSettingCtrl();
// 内存分配失败
if ( NULL == SettingController )
{
rc = E_OUTOFMEMORY ;
}else
{
CATBoolean Init = FALSE ;
// 初始化操作是强制要求
CAAICafGeometryEltSettingAtt * pISettingAtForCtrl = NULL ;
// 查询配置参数访问接口
rc = SettingController->QueryInterface(IID_CAAICafGeometryEltSettingAtt,
(void**) &pISettingAtForCtrl );
if ( SUCCEEDED(rc) )
{
// 执行配置初始化
rc = pISettingAtForCtrl->Initialize();
if ( SUCCEEDED(rc) )
{
CATIIniSettingManagment * pIMgtAtForCtrl = NULL ;
// 查询配置管理接口
rc = SettingController->QueryInterface(IID_CATIIniSettingManagment,
(void**) &pIMgtAtForCtrl );
if ( SUCCEEDED(rc) )
{
// 首次提交,用于回滚初始化
pIMgtAtForCtrl->Commit() ;
// 释放接口指针
pIMgtAtForCtrl->Release();
pIMgtAtForCtrl = NULL;
// 清理控制器持有该唯一实例
_CleanerCtrl.SetController(SettingController);
// 将实例返回给调用方
*oCtrl = SettingController ;
Init = TRUE ;
}
}
pISettingAtForCtrl->Release();
pISettingAtForCtrl = NULL ;
}
// 初始化失败,释放新建的实例
if ( FALSE == Init )
{
SettingController->Release() ;
SettingController = NULL ;
}
}
}else
{
// 实例已存在,直接返回
*oCtrl = (CAACafGeometryEltSettingCtrl *) pCtrl ;
}
}else rc = E_FAIL ; // 输出参数指针为空,返回失败
return rc ;
}
(CAACafGeometryEltSettingCtrl ** oCtrl)
{
// 定义返回码,初始为执行成功
HRESULT rc = S_OK ;
// 校验输出参数指针是否有效
if ( NULL != oCtrl )
{
*oCtrl = NULL ;
// 从清理控制器中获取已存在的设置控制器实例
CATBaseUnknown * pCtrl = _CleanerCtrl.GetController();
// 若当前无实例,则新建
if ( NULL == pCtrl )
{
CAACafGeometryEltSettingCtrl * SettingController = NULL;
SettingController = new CAACafGeometryEltSettingCtrl();
// 内存分配失败
if ( NULL == SettingController )
{
rc = E_OUTOFMEMORY ;
}else
{
CATBoolean Init = FALSE ;
// 初始化操作是强制要求
CAAICafGeometryEltSettingAtt * pISettingAtForCtrl = NULL ;
// 查询配置参数访问接口
rc = SettingController->QueryInterface(IID_CAAICafGeometryEltSettingAtt,
(void**) &pISettingAtForCtrl );
if ( SUCCEEDED(rc) )
{
// 执行配置初始化
rc = pISettingAtForCtrl->Initialize();
if ( SUCCEEDED(rc) )
{
CATIIniSettingManagment * pIMgtAtForCtrl = NULL ;
// 查询配置管理接口
rc = SettingController->QueryInterface(IID_CATIIniSettingManagment,
(void**) &pIMgtAtForCtrl );
if ( SUCCEEDED(rc) )
{
// 首次提交,用于回滚初始化
pIMgtAtForCtrl->Commit() ;
// 释放接口指针
pIMgtAtForCtrl->Release();
pIMgtAtForCtrl = NULL;
// 清理控制器持有该唯一实例
_CleanerCtrl.SetController(SettingController);
// 将实例返回给调用方
*oCtrl = SettingController ;
Init = TRUE ;
}
}
pISettingAtForCtrl->Release();
pISettingAtForCtrl = NULL ;
}
// 初始化失败,释放新建的实例
if ( FALSE == Init )
{
SettingController->Release() ;
SettingController = NULL ;
}
}
}else
{
// 实例已存在,直接返回
*oCtrl = (CAACafGeometryEltSettingCtrl *) pCtrl ;
}
}else rc = E_FAIL ; // 输出参数指针为空,返回失败
return rc ;
}
本方法的作用是返回指向 CAACafGeometryEltSettingCtrl 类的指针。该唯一实例指针保存在 _CleanerCtrl 成员变量中。
在通过 SetController 方法将新建控制器存入 _CleanerCtrl 前,必须先执行以下两个方法:
实现该接口的类为
在通过 SetController 方法将新建控制器存入 _CleanerCtrl 前,必须先执行以下两个方法:
- CAAICafGeometryEltSettingAtt 接口的 Initialize(初始化) 方法
- CATIIniSettingManagment 接口的 Commit(提交) 方法
实现 CAAICafGeometryEltSettingAtt 接口
实现类为 CAAECafGeometryEltSettingCtrl 类。
-
头文件
以下是 CAAECafGeometryEltSettingCtrl 的头文件:
#include "CATBaseUnknown.h"
class CATSettingRepository ; // 配置项仓库类前向声明
#include "CAAICafGeometryEltSettingAtt.h"
// 实现几何图元配置属性访问接口的扩展类
class CAAECafGeometryEltSettingAtt: public CATBaseUnknown
{
CATDeclareClass; // CAA宏:声明该类为组件类
public:
CAAECafGeometryEltSettingAtt(); // 构造函数
virtual ~CAAECafGeometryEltSettingAtt(); // 虚析构函数
virtual HRESULT Initialize() ; // 初始化方法
// 图元标识符显示状态:获取、设置、获取配置锁信息
virtual HRESULT GetIdentifierVisibility(CATString & oIdVisibility) ;
virtual HRESULT SetIdentifierVisibility(const CATString & iIdVisibility) ;
virtual HRESULT GetInfoIdentifierVisibility(CATSettingInfo * oInfo) ;
// 曲线离散最大点数:获取、设置、获取配置锁信息
virtual HRESULT GetMaxPointCurve(int & oMaxPoint) ;
virtual HRESULT SetMaxPointCurve(const int iMaxPoint) ;
virtual HRESULT GetInfoMaxPointCurve(CATSettingInfo ** oInfoArray, int * oNbSettingInfo) ;
// 隐含点显示状态:获取、设置、获取配置锁信息
virtual HRESULT GetImplPointVisibility(CATString & oImplPointVisibility) ;
virtual HRESULT SetImplPointVisibility(const CATString & iImplPointVisibility) ;
virtual HRESULT GetInfoImplPointVisibility(CATSettingInfo * oInfo) ;
private:
// 禁用拷贝构造函数与赋值运算符,防止对象拷贝
CAAECafGeometryEltSettingAtt(const CAAECafGeometryEltSettingAtt &iObjectToCopy);
CAAECafGeometryEltSettingAtt & operator = (const CAAECafGeometryEltSettingAtt &iObjectToCopy);
private:
CATSettingRepository * _pSettingRep ; // 配置仓库指针,用于读写配置参数
};
#endif
class CATSettingRepository ; // 配置项仓库类前向声明
#include "CAAICafGeometryEltSettingAtt.h"
// 实现几何图元配置属性访问接口的扩展类
class CAAECafGeometryEltSettingAtt: public CATBaseUnknown
{
CATDeclareClass; // CAA宏:声明该类为组件类
public:
CAAECafGeometryEltSettingAtt(); // 构造函数
virtual ~CAAECafGeometryEltSettingAtt(); // 虚析构函数
virtual HRESULT Initialize() ; // 初始化方法
// 图元标识符显示状态:获取、设置、获取配置锁信息
virtual HRESULT GetIdentifierVisibility(CATString & oIdVisibility) ;
virtual HRESULT SetIdentifierVisibility(const CATString & iIdVisibility) ;
virtual HRESULT GetInfoIdentifierVisibility(CATSettingInfo * oInfo) ;
// 曲线离散最大点数:获取、设置、获取配置锁信息
virtual HRESULT GetMaxPointCurve(int & oMaxPoint) ;
virtual HRESULT SetMaxPointCurve(const int iMaxPoint) ;
virtual HRESULT GetInfoMaxPointCurve(CATSettingInfo ** oInfoArray, int * oNbSettingInfo) ;
// 隐含点显示状态:获取、设置、获取配置锁信息
virtual HRESULT GetImplPointVisibility(CATString & oImplPointVisibility) ;
virtual HRESULT SetImplPointVisibility(const CATString & iImplPointVisibility) ;
virtual HRESULT GetInfoImplPointVisibility(CATSettingInfo * oInfo) ;
private:
// 禁用拷贝构造函数与赋值运算符,防止对象拷贝
CAAECafGeometryEltSettingAtt(const CAAECafGeometryEltSettingAtt &iObjectToCopy);
CAAECafGeometryEltSettingAtt & operator = (const CAAECafGeometryEltSettingAtt &iObjectToCopy);
private:
CATSettingRepository * _pSettingRep ; // 配置仓库指针,用于读写配置参数
};
#endif
CAAECafGeometryEltSettingAtt 这个 C++ 类继承自 CATBaseUnknown。CATDeclareClass 宏用于声明该类属于一个组件。拷贝构造函数和赋值运算符 = 被声明为私有成员,以避免编译器自动将其生成为公有成员。
除构造函数和析构函数外,所有公有方法均为 CAAICafGeometryEltSettingAtt 接口中定义的方法。
在私有数据成员部分,_pSettingRep 是指向 CATSettingRepository(配置仓库)[5] 的指针,用于访问配置文件的各项属性。
除构造函数和析构函数外,所有公有方法均为 CAAICafGeometryEltSettingAtt 接口中定义的方法。
在私有数据成员部分,_pSettingRep 是指向 CATSettingRepository(配置仓库)[5] 的指针,用于访问配置文件的各项属性。
- 源文件
- 该类是设置控制器 CAACafGeometryEltSettingCtrl 的数据扩展类。
#include "CAAECafGeometryEltSettingAtt.h"
#include "CATString.h"
#include "CATSettingRepository.h"
#include "TIE_CAAICafGeometryEltSettingAtt.h"
TIE_CAAICafGeometryEltSettingAtt(CAAECafGeometryEltSettingAtt);
CATImplementClass(CAAECafGeometryEltSettingAtt,
DataExtension,
CATBaseUnknown,
CAACafGeometryEltSettingCtrl);
...
借助TIE_CAAICafGeometryEltSettingAtt宏,CAAECafGeometryEltSettingAtt类声明其实现了CAAICafGeometryEltSettingAtt接口。该扩展类专用于控制器组件。CATImplementClass宏通过关键字 DataExtension(数据扩展),声明CAAECafGeometryEltSettingAtt类为数据扩展类,且该类扩展了主类为CAACafGeometryEltSettingCtrl的组件。第三个参数必须始终设为CATBaseUnknown(该参数未实际使用)。 - 构造函数 - 析构函数
CAAECafGeometryEltSettingAtt::CAAECafGeometryEltSettingAtt():_pSettingRep(NULL)
{
// 获取名称为 CAACafGeometryElt 的配置仓库实例
_pSettingRep = CATSettingRepository::GetRepository("CAACafGeometryElt") ;
}
CAAECafGeometryEltSettingAtt::~CAAECafGeometryEltSettingAtt()
{
// 将配置仓库指针置空
_pSettingRep = NULL ;
}
在构造函数中,获取用于访问 CAACafGeometryElt.CATSetting 配置文件的配置仓库指针。
在析构函数中,将该指针置为 NULL。无需对该指针调用 Release 释放,系统框架已负责管理这类对象的生命周期。 - Initialize 方法
HRESULT CAAECafGeometryEltSettingAtt::Initialize()
{
HRESULT rc = S_OK ; // 定义返回码,初始化为执行成功
HRESULT rctemp = E_FAIL ; // 临时返回码,初始化为执行失败
CATString ident ;
// 获取图元标识符的显示状态
rctemp = GetIdentifierVisibility(ident);
if ( FAILED(rctemp) )
rc = rctemp ;
// 获取隐含点的显示状态
rctemp = GetImplPointVisibility(ident);
if ( FAILED(rctemp) )
rc = rctemp ;
int value ;
// 获取曲线最大点数配置值
rc = GetMaxPointCurve(value);
if ( FAILED(rctemp) )
rc = rctemp ;
return rc ;
}
该方法调用所有的 ** 获取类(Getxxx)** 方法:GetIdentifierVisibility、GetImplPointVisibility 和 GetMaxPointCurve。
如果任意一次调用失败,该方法就返回对应的临时错误码 rctemp。
必须调用每一个获取类方法,以此确保在这些方法中定义的默认值能够被初始化并写入配置仓库。 - GetIdentifierVisibility 方法
HRESULT CAAECafGeometryEltSettingAtt::GetIdentifierVisibility(
CATString & oIdVisibility)
{
HRESULT rc = E_FAIL ;
if ( NULL != _pSettingRep )
{
CATString Ident("IdHide");
long flag = _pSettingRep->ReadSetting("Identifier",&Ident);
if ( 1 == flag )
{
oIdVisibility = Ident ;
rc = S_OK;
}
}
return rc ;
}
该方法的作用是返回标识符的显示方式相关信息。该信息存储在配置仓库的 Identifier(标识符) 属性下。
调用 CATSettingRepository 类的 ReadSetting 方法,并将 Identifier 作为第一个参数,即可读取配置仓库中当前存储的对应信息。
变量 Ident 被初始化为默认值。当不存在管理员配置文件时,该默认值即为重置后的取值。 - SetIdentifierVisibility 方法
// 设置图元标识符的显示状态
HRESULT CAAECafGeometryEltSettingAtt::SetIdentifierVisibility(
const CATString & iIdVisibility)
{
HRESULT rc = E_FAIL ; // 初始化返回状态为失败
// 定义三种合法显示状态
CATString StIdHide("IdHide"); // 隐藏标识符
CATString StIdShow("IdShow"); // 显示标识符
CATString StIdPreSelectShow("IdPreSelectShow"); // 预选时显示标识符
// 校验传入值是否为允许的状态
if ( (StIdHide == iIdVisibility) ||
(StIdShow == iIdVisibility) ||
(StIdPreSelectShow == iIdVisibility) )
{
if ( NULL != _pSettingRep ) // 配置仓库指针有效
{
CATString Ident = iIdVisibility ;
// 将配置值写入配置仓库的 Identifier 项
long flag = _pSettingRep->WriteSetting("Identifier",&Ident);
if ( 1 == flag ) // 写入成功
{
rc = S_OK;
}
}
}
return rc ;
}
该方法用于修改标识符的显示方式相关信息。该信息存储在配置仓库的 Identifier(标识符) 属性下。调用CATSettingRepository类的WriteSetting方法,并将Identifier作为第一个参数,即可修改该配置信息。在写入配置仓库前会校验输入数据的合法性(若第一个参数为枚举类型,则无需校验)。 - GetInfoIdentifierVisibility 方法
// 获取标识符显示状态的配置信息
HRESULT CAAECafGeometryEltSettingAtt::GetInfoIdentifierVisibility(
CATSettingInfo * oInfo,int iFlag )
{
HRESULT rc = E_FAIL ; // 初始化返回值为失败
if ( NULL != _pSettingRep ) // 配置仓库指针有效
{
// 从配置仓库获取 Identifier 项的配置信息
long flag = _pSettingRep->GetInfo("Identifier",oInfo, iFlag) ;
if ( 0 == flag ) // 获取信息成功
{
rc = S_OK ;
}
}
return rc ;
}
该方法调用CATSettingRepository类的GetInfo方法,并以 Identifier 作为第一个参数,返回专用于该参数的唯一CATSettingInfo对象。 - GetInfoMaxPointCurve 方法
// 获取曲线最大点数的配置信息
HRESULT CAAECafGeometryEltSettingAtt::GetInfoMaxPointCurve(
CATSettingInfo ** oInfoArray, int *oNbSettingInfo )
{
HRESULT rc = E_FAIL ; // 初始化返回状态为失败
// 校验配置仓库指针、输出数组指针、数量指针均有效
if ( (NULL != _pSettingRep) && ( NULL != oNbSettingInfo) && ( NULL != oInfoArray ) )
{
*oNbSettingInfo = 0 ; // 配置信息数量初始化为0
*oInfoArray = NULL ; // 配置信息数组初始化为空
CATSettingInfo info ;
// 读取 MaxPointCurve 配置项的元信息
long flag = _pSettingRep->GetInfo("MaxPointCurve",&info) ;
if ( 0 == flag ) // 获取信息成功
{
*oNbSettingInfo = 1 ; // 配置项数量为1
*oInfoArray = new CATSettingInfo [*oNbSettingInfo] ; // 动态创建数组
(*oInfoArray)[0] = info ; // 存入配置信息
rc = S_OK ;
}
}
return rc ;
}
该方法返回的是CATSettingInfo 数组,而非单个 CATSettingInfo 对象。在本示例中,由于该参数仅由一个属性表示,使用单个 CATSettingInfo 指针就足够。但这里仍提供了 CATSettingInfo 指针数组的示例,以便应对参数由多个属性表示、或不确定内部存储结构未来是否会变更的情况。
- 接口字典
在专用于 CAACATIAApplicationFrm.edu 框架的接口字典中,需要添加如下一行内容,用于声明:
CAACafGeometryEltSettingCtrl 组件在 CAACafCtrlToolsOptions 模块中实现了 CAAICafGeometryEltSettingAtt 接口。
CAACafGeometryEltSettingCtrl CAAICafGeometryEltSettingAtt libCAACafCtrlToolsOptions
实现 CATIIniSettingManagment 接口
CATIIniSettingManagment 接口用于管理配置仓库的通用方法。
CAAECafSettingManagmentForGeometryElt。-
头文件
以下是
CAAECafSettingManagmentForGeometryElt 的头文件:#include "CATIIniSettingManagment.h"
#include "CATEIniSettingManagment.h"
class CAAECafSettingManagmentForGeometryElt: public CATEIniSettingManagment
{
CATDeclareClass;
public:
CAAECafSettingManagmentForGeometryElt();
virtual ~CAAECafSettingManagmentForGeometryElt();
private:
CAAECafSettingManagmentForGeometryElt(const CAAECafSettingManagmentForGeometryElt &iObjectToCopy);
CAAECafSettingManagmentForGeometryElt & operator = (const CAAECafSettingManagmentForGeometryElt &iObjectToCopy);
};
#include "CATEIniSettingManagment.h"
class CAAECafSettingManagmentForGeometryElt: public CATEIniSettingManagment
{
CATDeclareClass;
public:
CAAECafSettingManagmentForGeometryElt();
virtual ~CAAECafSettingManagmentForGeometryElt();
private:
CAAECafSettingManagmentForGeometryElt(const CAAECafSettingManagmentForGeometryElt &iObjectToCopy);
CAAECafSettingManagmentForGeometryElt & operator = (const CAAECafSettingManagmentForGeometryElt &iObjectToCopy);
};
CAAECafSettingManagmentForGeometryElt 这个 C++ 类继承自 CATEIniSettingManagment。该适配类定义在 **InteractiveInterfaces(交互界面)** 框架中。
CATDeclareClass 宏用于声明 CAAECafSettingManagmentForGeometryElt 类属于一个组件。
拷贝构造函数与赋值运算符(=)被声明为私有,以此避免编译器自动将其生成为公有成员。
CATDeclareClass 宏用于声明 CAAECafSettingManagmentForGeometryElt 类属于一个组件。
拷贝构造函数与赋值运算符(=)被声明为私有,以此避免编译器自动将其生成为公有成员。
-
源文件
以下是
CAAECafSettingManagmentForGeometryElt 的源文件:#include "CAAECafSettingManagmentForGeometryElt.h"
#include "TIE_CATIIniSettingManagment.h"
TIE_CATIIniSettingManagment(CAAECafSettingManagmentForGeometryElt);
CATImplementClass(CAAECafSettingManagmentForGeometryElt,
DataExtension,
CATBaseUnknown,
CAACafGeometryEltSettingCtrl);
CAAECafSettingManagmentForGeometryElt::CAAECafSettingManagmentForGeometryElt():
CATEIniSettingManagment("CAACafGeometryElt")
{
}
CAAECafSettingManagmentForGeometryElt::~CAAECafSettingManagmentForGeometryElt()
{
}
#include "TIE_CATIIniSettingManagment.h"
TIE_CATIIniSettingManagment(CAAECafSettingManagmentForGeometryElt);
CATImplementClass(CAAECafSettingManagmentForGeometryElt,
DataExtension,
CATBaseUnknown,
CAACafGeometryEltSettingCtrl);
CAAECafSettingManagmentForGeometryElt::CAAECafSettingManagmentForGeometryElt():
CATEIniSettingManagment("CAACafGeometryElt")
{
}
CAAECafSettingManagmentForGeometryElt::~CAAECafSettingManagmentForGeometryElt()
{
}
通过 TIE_CATIIniSettingManagment 宏,CAAECafSettingManagmentForGeometryElt 类声明实现了 CATIIniSettingManagment 接口。该扩展类专用于控制器组件。
CATImplementClass 宏通过关键字 DataExtension 声明 CAAECafSettingManagmentForGeometryElt 类为数据扩展类,用于扩展主类为 CAACafGeometryEltSettingCtrl 的组件。第三个参数必须固定设为 CATBaseUnknown,在此处无实际作用。
构造函数调用适配类 CATEIniSettingManagment 的构造函数,传入配置文件名 CAACafGeometryElt,该名称与 CAAECafGeometryEltSettingAtt 构造函数中使用的名称一致。可参考上一步的构造函数‑析构函数小节。
析构函数为空实现。
CATImplementClass 宏通过关键字 DataExtension 声明 CAAECafSettingManagmentForGeometryElt 类为数据扩展类,用于扩展主类为 CAACafGeometryEltSettingCtrl 的组件。第三个参数必须固定设为 CATBaseUnknown,在此处无实际作用。
构造函数调用适配类 CATEIniSettingManagment 的构造函数,传入配置文件名 CAACafGeometryElt,该名称与 CAAECafGeometryEltSettingAtt 构造函数中使用的名称一致。可参考上一步的构造函数‑析构函数小节。
析构函数为空实现。
-
接口字典
在专用于 CAACATIAApplicationFrm.edu 框架的接口字典中,需要添加如下一行内容,用于声明:
CAACafGeometryEltSettingCtrl 组件在 CAACafCtrlToolsOptions 模块中实现了 CATIIniSettingManagment 接口。
CAACafGeometryEltSettingCtrl CATIIniSettingManagment libCAACafCtrlToolsOptions
创建配置控制器的工厂类
CAACafGeometryEltSettingCtrl 头文件类存放于 LocalInterfaces(本地接口)目录下,因此获取其指针的唯一方式是调用全局公共函数。该函数返回配置控制器组件所实现接口的指针。-
头文件
以下是
GetCAACafGeometryEltSettingCtrl 的头文件:#include "IUnknown.h"
#include "CAACafCtrlToolsOptions.h"
// 由 CAACafCtrlToolsOptions 模块导出
HRESULT ExportedByCAACafCtrlToolsOptions
GetCAACafGeometryEltSettingCtrl(const IID & iInterfaceIdentifier ,
void ** oInterfacePointer) ;
#include "CAACafCtrlToolsOptions.h"
// 由 CAACafCtrlToolsOptions 模块导出
HRESULT ExportedByCAACafCtrlToolsOptions
GetCAACafGeometryEltSettingCtrl(const IID & iInterfaceIdentifier ,
void ** oInterfacePointer) ;
GetCAACafGeometryEltSettingCtrl 全局函数由 CAACafCtrlToolsOptions 模块导出。-
源文件
以下是
GetCAACafGeometryEltSettingCtrl 的源文件:#include "GetCAACafGeometryEltSettingCtrl.h"
#include "CAACafGeometryEltSettingCtrl.h"
#include "CATErrorDef.h"
HRESULT GetCAACafGeometryEltSettingCtrl(const IID & iInterfaceIdentifier,
void ** oInterfacePointer)
{
HRESULT rc = S_OK ;
if ( NULL != oInterfacePointer )
{
CAACafGeometryEltSettingCtrl * pCtrl = NULL ;
// 获取配置控制器实例
rc = ::CAACafGeometryEltSettingCtrl::GetSettingController(&pCtrl);
if ( SUCCEEDED(rc) && ( NULL != pCtrl) )
{
// 查询所需接口
rc = pCtrl->QueryInterface(iInterfaceIdentifier,oInterfacePointer);
pCtrl->Release();
pCtrl= NULL ;
}
else
{
rc = E_FAIL ;
}
}else rc = E_FAIL ;
return rc ;
}
#include "CAACafGeometryEltSettingCtrl.h"
#include "CATErrorDef.h"
HRESULT GetCAACafGeometryEltSettingCtrl(const IID & iInterfaceIdentifier,
void ** oInterfacePointer)
{
HRESULT rc = S_OK ;
if ( NULL != oInterfacePointer )
{
CAACafGeometryEltSettingCtrl * pCtrl = NULL ;
// 获取配置控制器实例
rc = ::CAACafGeometryEltSettingCtrl::GetSettingController(&pCtrl);
if ( SUCCEEDED(rc) && ( NULL != pCtrl) )
{
// 查询所需接口
rc = pCtrl->QueryInterface(iInterfaceIdentifier,oInterfacePointer);
pCtrl->Release();
pCtrl= NULL ;
}
else
{
rc = E_FAIL ;
}
}else rc = E_FAIL ;
return rc ;
}
调用
CAACafGeometryEltSettingCtrl 类的 GetSettingController 方法,获取该类的唯一实例指针。随后针对传入的接口标识调用 QueryInterface,从而获取所需的接口指针。小结
本示例演示了如何通过创建以下内容来实现配置控制器:
本示例演示了如何通过创建以下内容来实现配置控制器:
- 用于管理配置文件中各项参数的接口;
- 配置控制器的主组件类,该类实现:
-
- 上述自定义接口
- 定义在 InteractiveInterfaces 框架中的 CATIIniSettingManagment 接口
- 用于获取该配置控制器接口指针的全局函数。
References
希望和大家一起交流学习

浙公网安备 33010602011771号