找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 298|回复: 0

[老徐讲堂] 自己写的书第十七章属性检查器和属性面板编程接口第一部分

[复制链接]

已领礼包: 12个

财富等级: 恭喜发财

发表于 2023-3-19 11:30:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
第十七章 属性检查器和属性面板编程接口
AutoCAD 的属性检查器是一个基于 COM 的模块,它检查对象的属性并提供一个界面来编辑它发现的属性。 Property Inspector 公开了一个广泛的 COM API,允许 AutoCAD 对话框(属性选项板、工具选项板、可视化样式等)使其适应特定目的。 ObjectARX 应用程序同样可以将 Property Inspector 嵌入到它们的对话框中,并通过实现适当的 COM 接口来自定义其功能。
AutoCAD 的特性选项板功能是特性检查器应用程序的一个示例。 它承载一个 Property Inspector 实例并使用它来提供一个通用的用户界面来编辑所有类型的绘图实体。 Properties Palette 还提供了允许您自定义其用户界面和行为的 API。 通过实现属性检查器和属性选项板界面,您可以显示本机和自定义对象的自定义属性,并增强它们在属性选项板中的外观。 您还可以显示自定义命令的属性,并将自定义选项卡添加到“属性”选项板。
17.1属性检查器API概述
属性检查器是 AutoCAD 用来检查和显示 ActiveX 对象属性的通用组件。 它依赖于 AutoCAD 中存在的 COM 和自动化层次来查询对象的属性。 如果找到属性,Property Inspector 控件会提供一个显示属性的界面,允许用户查看并可能编辑属性值。
为了将此功能扩展到所有类型的对象,Property Inspector 提供了 COM 接口,应用程序可以在它们认为合适的时候实现这些接口。 这些 COM 接口定义了应用程序与 Property Inspector 交互所必须遵循的协议。
使用 Property Inspector 的应用程序定义了一个自定义对话框,它们将 Property Inspector 控件的实例嵌入到该对话框中。 嵌入和初始化后,Property Inspector 控件将出现在自定义对话框中,显示用于初始化它的属性。
为了将属性编辑与检查属性的内部状态同步,属性检查器实现了一个事件通知网络。 该网络还包括 Property Inspector UI 事件的通知,例如鼠标点击和焦点。 Property Inspector 应用程序实现适当的事件接收器接口来为 Property Inspector 提供它需要的事件反馈。
值得注意的是,Property Inspector 功能仅在 AutoCAD 环境中可用。 您不能在非 AutoCAD 为宿主的应用程序中使用属性检查器。
本章涉及驻留在 AcDbDatabase 结构中的 AutoCAD 实体(称为“数据库驻留”),以及可能与 AutoCAD 数据库完全无关的非本地 COM 对象。 除非本章另有说明,实体指的是数据库驻留对象。 对象指的是一个 COM 对象,它可能位于也可能不位于 AcDbDatabase 结构中。
特性源是指将特性公开给“特性”选项板的任何实体或对象。
17.2属性检查器的架构
PropertyInspector 利用 AutoCAD 的 COM接口和自动化作为其基础。 这些使 Property Inspector 可以访问 AutoCAD 数据库中的每个对象和实体,同时还允许对数据库外部的自动化对象进行相同的访问。 这为 Property Inspector 提供了可应用于广泛应用程序的灵活性。
PropertyInspector 架构的组件包括
·属性检查器模块 (acpi.arx)
·属性检查器 API
·属性编辑控件
许多应用程序使用 Property Inspector 作为扩展其用户界面的平台。 Property Inspector 应用程序出现在 AutoCAD 对话框、AutoCAD 垂直产品和外部 ObjectARX 应用程序中。 其他应用程序实现属性检查器接口,以便可以在属性选项板和使用属性检查器的其他对话框中查看和编辑其对象的属性。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
上图说明了 Property Inspector 体系结构及其使用范围。 此图中表示的组件将在本节稍后部分更详细地显示。
17.2.1 属性检查器模块
属性检查器模块代表属性选项板的核心功能。 属性检查器查询实体或其他属性源以获取属性类型信息。 然后它构建、显示和管理包含它发现的属性的属性编辑控件。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png
上图说明了 Property Inspector 模块及其与 Property Edit 控件的交互。 在内部,Property Inspector 由两个组件组成:Inspector Engine 和 Inspector Control。 属性由 Inspector Engine 检查和解析。 Inspector Engine 还为每个属性创建一个 ActiveX 编辑控件。 检查器控件在属性检查器用户界面中定位编辑控件和按钮,还管理焦点和光标状态。
因为它在 COM 级别而不是 AutoCAD 级别运行,所以 Property Inspector 能够管理实现其接口的任何 COM 对象的属性。 此功能扩展到不代表 AutoCAD 实体的 COM 对象。
在 AutoCAD 进程中运行的任何应用程序都可以重复使用 Property Inspector 功能。 此外,应用程序可以影响 Property Inspector 控件的外观。 属性检查器通过 IAcPiPropertyInspector 接口公开其功能。
PropertyEdit 控件是独立的 ActiveX 模块,不驻留在 Property Inspector 模块中。 对于它呈现的每个属性,Inspector Engine 加载标准 ActiveX 控件、来自 acPEXCtl16.tlb 文件的常用控件或来自外部应用程序的自定义控件。 有关如何提供自定义控件的信息,请参阅将 ActiveX 编辑控件添加到属性检查器。
17.2.2 属性检查器编程接口
PropertyInspector API 提供了大量的 COM 接口、基于 ATL 的实现类和快捷宏。 接口和类的分类列表可以在本章末尾的“属性面板接口和类”部分找到。
这些元素的声明分为多个头文件。 下表列出了包含 Property Inspector API 声明的文件的名称及其内容摘要。
  
属性面板头文件和声明文件
  
  
文件名
  
  
内容
  
  
axboiler.h
  
  
提供IAcadBaseObjectIAcadBaseObject2的接口声明,以及通过COM处理数据库驻留实体和非数据库驻留对象的全局函数; 仅用于从 AcDbObject 派生的对象
  
  
axtempl.h
  
  
提供基于 ATL 的模板类实现,这些实现包装了 IAcadBaseObjectIAcadBaseObject2ICategorizePropertiesIAcPiCategorizePropertiesAcPiPropCommandButtonsIAcPiPropertyDisplayIIOPMPropertyExtensi IPerPropertyBrowsing 接口
  
  
category.h
  
  
提供标准属性类别标识符和 ICategorizeProperties COM 接口的声明
  
  
acpexctl.h,acpexctl_i.c
  
  
属性编辑库存控制 (IAcPe*) 接口; MIDL 生成的文件包含 AcPEXCtl16.tlb 中描述的自动化接口的声明
  
  
acpi.h,acpi_i.c
  
  
属性检查器 (IAcPi*) 接口; MIDL 生成的文件包含 AcPi16.tlb 中描述的自动化接口声明
  
  
dynpropmgr.h
  
  
提供 AcRxDynPropManager 类定义
  
  
dynprops.h
  
  
为动态属性和动态属性管理器接口、每个实例的动态属性类和动态属性宏提供声明
  
17.2.2.1 基于 ATL 的模板类和宏
在许多情况下,PropertyInspector API 提供基于 ATL 的模板类来实现其 COM 接口。模板实现可以实现IDispatch 以及多个属性选项板 COM 接口,或者它可以实现单个专用对象。一些模板类实现了它们接口的所有方法,而另一些模板类则将部分实现留给您。但是,在大多数情况下,从模板类派生需要的编码要比直接实现底层接口少得多。
Property Inspector 模板类在 axtempl.h 文件中定义。 下表显示了模板类及其实现的接口(全部或部分)。
  
属性检查器中的模板类
  
  
模板类
  
  
实现的接口
  
  
IAcadBaseObjectImpl
  
  
IAcadBaseObject,IConnectionPointContainer
  
  
IAcadBaseObject2Impl
  
  
IAcadBaseObject2,IAcadBaseObject,  IConnectionPointContainer
  
  
IAcadObjectDispatchImpl
  
  
IDispatch, IAcadBaseObject, IAcadBaseObject2,  IRetrieveApplication, IUnknown, IConnectionPointContainer
  
  
IAcadEntityDispatchImpl
  
  
IDispatch, IAcadBaseObject, IAcadBaseObject2,  IRetrieveApplication, IUnknown, IConnectionPointContainer
  
  
IAcPiPropCommandButtonsImpl
  
  
IAcPiPropCommandButtons
  
  
IAcPiPropertyDisplayImpl
  
  
IAcPiPropertyDisplay
  
  
IAcPiCategorizePropertiesImpl
  
  
IAcPiCategorizeProperties
  
其中一些模板与映射宏一起使用。映射宏允许您以列表格式指定自定义信息,而无需实现底层纯虚拟接口。这种机制简化了属性选项板应用程序的编码过程。以下模板类的映射宏在opmimp.h 文件中声明:
IOPMPropertyExtensionImpl
IAcPiCategorizePropertiesImpl
IAcPiPropertyDisplayImpl
IAcPiPropCommandButtonsImpl
IAcPiCategorizePropertiesImpl 使用两个映射:一个用于基于IAcPiCategorizeProperties 的类别,另一个用于每个类别的命令按钮。
17.2.3 属性编辑控件
属性编辑控件实现IAcPiPropertyEditControl 和 IAcPiPropertyEditEventsSink 接口。 IAcPiPropertyEditControl 接口允许 ActiveX 编辑控件将自身与属性检查器集成。应用程序使用此接口访问控件编辑的对象和属性。
下图显示了Property Inspector 和 Property Edit 控件如何与对象或属性源交互。 Property Inspector 询问对象以发现其属性。然后它构建属性编辑控件。属性编辑控件显示属性数据,允许用户更改它。如果用户在属性编辑器控件中触发输入事件,该控件会通知属性检查器,以便它可以更新其外观。属性编辑器直接与对象通信以获取和设置属性值。图中所示的机制还支持非图形对象的属性,包括 AutoCAD 命令。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-8 09:12 , Processed in 0.340710 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表