在Illustrator中列表有很多种,本篇介绍的是在一般控件上扩展出来的列表(如ComboBox),包括开发指南与实际开发2部分。

开发指南:

List Suite列表功能集合
ADM List功能集合可以用来访问ADM列表对象和ADM列表项。ADM列表是标准ADM对象的扩展属性,这个功能集合中缺少许多ADM对象通用函数。但是,可以访问列表的ADM Item,在其上做通用操作。使用这个功能集中的函数,可以初始化列表,创建、销毁、自定义和遍历列表项。使用列表功能集和ADM Entry功能集一起可以深入的访问列表相关信息。

请求这个功能集
调用SPBasicSuite::AcquireSuite()来请求这个功能集。使用名字和版本参数来确定获取的具体值。

列表和列表项
ADM列表用来给任何ADM Item来提供列表选择,包括列表框、弹出列表、弹出菜单、渐变编辑框、弹出文本编辑框。一个ADM列表由多个ADM列表项组成。
ADM列表没有许多标准属性,如插件和外框;但是,在列表的ADM Item上可以定义。为了访问它,使用sADMList->GetItem()函数,获取列表的所有者。
ADM列表有些特别的属性,如一个菜单资源ID和一组列表项。ADM列表项有额外的属性,包括索引和选择状态。ADM列表功能集用这些属性来访问列表项。索引是列表项在列表中的位置。选择状态标示了用户选择了此项(在多选列表中其他项也可能被选择)。

使用列表功能集
使用sADMItem->GetList获取列表对象:
ADMListRef theItemsList = sADMItem->GetList(theItem);
一旦完成,就可以使用ADM List和ADM Entry功能集的函数来修改它。
为了初始化一个列表,指定给它一个菜单资源ID:
sADMList->SetMenuID(theItemsList, gPluginRef, 16000, “Choices”);
你同样可以创建每一个列表项,使用sADMList->InsertEntry函数:
For(index = 0; index < kNumberEntries; index++)
{
Char menuText[255];
ADMEntryRef  entry = sADMList->InsertEntry(theItemList, index);
sADMBasic->GetIndexString(thePlugin, 16000, index, menuText, 255);
sADMEntry->SetText(entry, menuText);
sADMEntry->SetID(entry, index);
}
注意:列表索引从0开始。
使用sADMList->GetActiveEntry函数来获取当前选中的项,然后获取索引,如:
Int GetListValue(ADMItem theListItem)
{
ADMListRef  theList = sADMItem->GetList(theListItem);
ADMListEntryRef  theEntry=sADMList->GetActiveEntry(theItemList);
Return sADMEntry->GetID(theEntry);
}
遍历多选项时:
Int count = sADMList->NumberOfSelectedEntries(theList);
For(index = 0; index < count; index++)
{
ADMEntryRef entry = sADMList->IndexSelectedEntry(theList, index);
doSomethingToSelectedEntry(theEntry);
}

自定义列表
可以自定义ADM列表,就和自定义其他ADM Item一样。这个工作通过定义一个或多个事件响应函数来完成。由于ADM列表和ADM列表项紧密关联,处理方式稍微有些不同。
ADM列表没有自己的事件处理函数。在单个事件中,为了对列表整体进行操作,需要设置列表事件处理函数。如,为了标注列表,设置一个绘图函数给列表。使用的是ADM Item功能集。
为了改变列表低级别的行为,设置列表项的消息处理函数。如,为了改变每一个列表项的绘图方式,设置列表项的绘图函数。使用ADM List功能集在列表级别上完成,就会应用到列表的所有列表项上。你不能直接给单个列表项设置事件处理函数。一个自定义的事件处理函数,应该可以处理列表的所有项。
为了使用列表的默认行为,使用ADM Item功能集的函数。为了使用默认的列表项行为,使用ADM Entry功能集的函数。不要使用ADM List功能集。

实际开发:

需要为地图插件添加一个标注功能,是将一个空间图形图层的各个要素的某个属性标注到另外一个图层中作为注记,如为某个省的区县标注区名。界面上包含有3个ComboBox:源图层,字段,目标图层,使用ADM列表来编写代码。主要包括列表清理和列表初始化、列表选项变化事件的处理。

//对话框的初始化Proc

ASErr ASAPI MdLabel::InitProc(ADMDialogRef dialog)
{
 ASErr error = kNoErr;
 ADMItemRef srcLayerItemRef = sADMDialog->GetItem(dialog, IDC_COMBO_SRCLAYER);
 sADMItem->SetNotifyProc(srcLayerItemRef, SrcLayerPopupProc);
 ADMItemRef desLayerItemRef = sADMDialog->GetItem(dialog, IDC_COMBO_DESLAYER);
 sADMItem->SetNotifyProc(desLayerItemRef, DesLayerPopupProc); 
 ADMItemRef fieldItem = sADMDialog->GetItem(dialog, IDC_COMBO_FIELD);
 sADMItem->SetNotifyProc(fieldItem, FieldPopupProc);
 ADMItemRef btnItem = sADMDialog->GetItem(dialog, IDC_BUTTON_OK);
 sADMItem->SetNotifyProc(btnItem, OkButtonProc);

gPlugin->fLabel->fDialogRef = dialog;
 gPlugin->fLabel->UpdateLayer();
 gPlugin->fLabel->fFieldIndex = -1;

return error;
}

//清理列表

void MdLabel::ClearList(ADMListRef list)
{
 ADMInt32 count = sADMList->NumberOfEntries(list);
 for(ADMInt32 i = 0; i < count; i++)
 {
  sADMList->RemoveEntry(list, i);
 }
}

//更新图层信息

void MdLabel::UpdateLayer()
{
 vector<string> layerVec;
 GetLayers(layerVec);

//设置源图层
 ADMItemRef srcLayerItemRef = sADMDialog->GetItem(fDialogRef, IDC_COMBO_SRCLAYER);
 ADMListRef srcLayerListRef = sADMItem->GetList(srcLayerItemRef);
 ClearList(srcLayerListRef);
 int index = 0;
 for(vector<string>::iterator itr = layerVec.begin(); itr != layerVec.end(); ++itr)
 {
  ADMEntryRef entry = sADMList->InsertEntry(srcLayerListRef, index);
  sADMEntry->SetText(entry, itr->c_str());
  sADMEntry->SetID(entry, index++);
 }

//设置目标图层
 ADMItemRef desLayerItemRef = sADMDialog->GetItem(fDialogRef, IDC_COMBO_DESLAYER);
 ADMListRef desLayerListRef = sADMItem->GetList(desLayerItemRef);
 ClearList(desLayerListRef);
 index = 0;
 for(vector<string>::iterator itr = layerVec.begin(); itr != layerVec.end(); ++itr)
 {
  ADMEntryRef entry = sADMList->InsertEntry(desLayerListRef, index);
  sADMEntry->SetText(entry, itr->c_str());
  sADMEntry->SetID(entry, index++);
 }
}

//列表选项变化

void ASAPI MdLabel::SrcLayerPopupProc(ADMItemRef item, ADMNotifierRef notifier)
{
 if(sADMNotifier->IsNotifierType(notifier, kADMUserChangedNotifier))
 {
  ADMListRef listRef = sADMItem->GetList(item);
  ADMEntryRef activeEntry = sADMList->GetActiveEntry(listRef);
  ASInt32 layerId =  sADMEntry->GetID(activeEntry);
  AILayerHandle layer = nil;
  sAILayer->GetNthLayer(layerId, &layer);
  //改变源图层
  gPlugin->fLabel->SrcLayerChange(layer);
  //更新字段
  gPlugin->fLabel->UpdateFields();
 }
}

Illustrator插件开发之ADM列表相关推荐

  1. vscode插件开发之Swagger生成Ts

    vscode插件开发之Swagger生成Ts 当后端同学给到我们Swagger接口文档的时候,是不是在为要写接口类型烦恼,为了偷懒,那么就any吧.any一时爽,同事泪两行.为了高质量的偷懒,来开发个 ...

  2. android 监听安装来源_Flutter插件开发之APK自动安装

    点击上方的终端研发部,右上角选择"设为星标" 每日早9点半,技术文章准时送上 公众号后台回复"学习",获取作者独家秘制精品资料 往期文章 记五月的一个Andro ...

  3. Jmeter Kafka插件开发之Sampler篇

    Jmeter Kafka插件开发之Sampler篇 背景:在项目中经常需要往kafka里面写数据,并拿生成的数据执行后续的操作,并且有些接口中也需要用到kafka里的数据,小编使用JMeter做接口测 ...

  4. Idea插件开发之Gradle

    Idea插件开发之Gradle 1. 前言 作为Java开发者,Intellij Idea可以说是必备开发工具,Jetbrains提供了丰富的插件库.但是,有时候我们都在做重复.繁琐.无意义的操作,我 ...

  5. CDR插件开发之CPG插件001 - 什么是CPG插件

    CPG,英文缩写 Corel Plugin,中文含义是 Corel 插件,简称CPG插件,典型代表有魔镜.CDR是鼎鼎大名的创意图形设计软件,几乎是广告.印刷行业的标准,而正是由于CDR在日常的排版. ...

  6. CDR插件开发之Application(应用程序)

    在CorelDRAW提供的对象模型中,Application是被开发者经常使用的一个对象,也是最顶级的对象.本文对CorelDRAW(以下简称CDR)对象模型中的 Application 类做了一个简 ...

  7. CDR插件开发之CPG插件002 - CPG插件开发环境准备和搭建

    上篇文章对什么是CPG插件做了简单的介绍,读者只需要心中有个概念即可.那么,本篇文章就直接开始动手,正式踏上CPG插件开发之路的必经步骤:开发环境搭建.CPG插件不像GMS插件那样,可以在CDR自带的 ...

  8. 插件开发之VSCode

    欢迎各位大家关注本人微信公众号:程序员JC,小程序:RobotJC 里面包含很多本人之前做的小案例,也许这里有你想要的东西哦. 鉴于我前两周研究了并开发了一个VSCode插件的情况,这次就讲一下插件开 ...

  9. jQuery插件开发之windowScroll

    回首望,曾经洋洋得意的代码现在不忍直视.曾经看起来碉堡的效果现在也能稍微弄点出来.社会在往前发展,人也得向前迈进. 参考于搜狗浏览器4.2版本首页的上下滚动效果.主要实现整个窗口的上下和左右滚动逻辑, ...

最新文章

  1. unittest+discover批量处理自动化脚本
  2. 反射工具类,如斯优雅
  3. stm32 独立看门狗学习
  4. php mongodb 子查询,MongoDB数组子查询elemMatch
  5. 如何免费试用SAP的Fiori应用
  6. 无意间看到的浏览器记录......
  7. 创建 floating IP - 每天5分钟玩转 OpenStack(106)
  8. geoserver动态颜色参数样式、动态sql配置实现
  9. Python学习9 面向对象 类和对象
  10. python中msg是什么意思_python下载.msg文件的附件
  11. dh算法 理论依据_DH算法原理
  12. Apache Spark技术实战之1 -- KafkaWordCount
  13. java图书推荐系统源代码_基于Web图书推荐系统设计
  14. html背景纯白,纯白色背景图片全白
  15. 红外测距模块 51单片机_基于51单片机的红外发射和接收程序。
  16. WinCC7.4 与扫码枪串口通讯
  17. 大唐杯5G题库大全(1)
  18. 讲座记录——科技论文写作及科研方法
  19. 服务器自动更新不能关闭,Windows2008服务器如何关闭系统自动更新?
  20. 计算机主机号怎么产看,怎么查看笔记本电脑出厂编号

热门文章

  1. 通熟易懂的设计模式(一)
  2. React项目 antd 修改主题颜色
  3. 电子邮箱为何依然重要?企业办公邮箱的使用好处
  4. VOA英语广播收听技巧
  5. python批量整理地籍项目的文件夹
  6. 修改ETM,用Ogre实现《天龙八部》地形与部分场景详解(附源码)
  7. 油管:The Truth About Lab-Grown Meat
  8. 后真相时代(post-truth)出现的原因及影响
  9. 在线客服系统源码,多商户在线客服系统可开机器人自动聊天多商户在线客服源码
  10. keep-alive原理