C++工程处理Adobe Illustrator插件工程分发的消息

2015-01-24 05:42:16 · 作者: · 浏览: 5
在上篇文章提到,建立好的Adobe Illustrator工程界面发出消息需要C++工程进行处理响应,这篇文章就介绍C++工程如何响应Adobe Illustrator面板发出的消息。 新建一个PanelController继承自FlashUIController,在你的PanelController需要实现下面几个方法
 csxs::event::EventErrorCode RegisterCSXSEventListeners();

 csxs::event::EventErrorCode RemoveEventListeners();

 ASErr SendData();

 void ParseData(const char* eventData);

其中RegisterCSXSEventListeners()方法是在当前工程下注册监听,RemoveEventListeners()是AI关闭时回收这些监听,SendData()是在UI面板展示的时候向它发送数据,ParseData(const char* eventData)是处理UI面板发送过来的数据。
其中,在AI启动的时候,消息机制下,运行到error = Notify(msg);这里的时候
  if (fPanelController != NULL)
  {
   fPanelController->RegisterCSXSEventListeners();
  }
运行上面的代码,这里的fPanelController是你的PanelController的实例化对象。具体注册的代码如下:
csxs::event::EventErrorCode TestPanelController::RegisterCSXSEventListeners()
{
 csxs::event::EventErrorCode result = csxs::event::kEventErrorCode_Success;
 do
 {
  result = fPPLib.AddEventListener(DIALOG_READY, PanelReadyFunc, this);
  if ( result != csxs::event::kEventErrorCode_Success )
  {
   break;
  }

  result = fPPLib.AddEventListener(GET_PARAMS_RESP, GetParamsFromPanel, this);
  if ( result != csxs::event::kEventErrorCode_Success )
  {
   break;
  }
 }
 while ( false );

 return result;
}
其中, static const char* GET_PARAMS_RESP = "com.lm.shpToAI.shpToAIGetParamsResp"; static const char* DIALOG_READY = "com.lm.shpToAI.shpToAIDialogReady"; 如果你细心,你会发现,添加监听的第一个参数是上一篇文章UI中的参数,这里的第一个参数一定要相对应,第二个参数就是响应的TestPanelController下你自定义的方法,分别是PanelReadyFunc,GetParamsFromPanel 值得注意的是DIALOG_READY这个消息代表的是面板快展示调用的方法,这里在C++工程函数是,PanelReadyFunc,里面调用了SendData(),代码如下:
ASErr SHP2AIPanelController::SendData()
{
 stringstream payload;
 payload << "
  
   ";

 ai::int16 numOfConstants = sizeof(params) / sizeof(ParamConstant);
 for (ai::int16 i = 0; i < numOfConstants; i++)
 {
  payload << "<" << params[i].label << ">"
   << "<" << CORNERS_TAG << ">"
   << params[i].params.corners
   << "
   "
   << "<" << SIZE_TAG << ">"
   << params[i].params.size
   << "
   "
   << "
   ";
 }

 payload << "
  ";

 std::string payload_str = payload.str();

 const char* payload_cstr = payload_str.c_str();

 csxs::event::Event event =
 {
  GET_PARAMS_REQ,
  csxs::event::kEventScope_Application,
  "SHP2AI",
  NULL,
  payload_cstr
 };

 fPPLib.DispatchEvent(&event);

 return kNoErr;
}
可以很明显看到 fPPLib.DispatchEvent(&event);证明这里向UI界面,也就是Adobe Illustrator界面程序发送了消息,看我的上一篇文章发现,第一行监听了这个GET_PARAMS_REQ
这样就可以很好理解两个编译工具之间的消息交互了,具体机制可以看下面的图。