我在 InDesign 中有一个 Flex 面板,我可以从中拖动一个 URL。如果我将此 URL 放在文本编辑器或 Web 浏览器上,它就可以工作。但是当我尝试将它放在我的 InDesign 文档上时,它有点难。
我已经实现了 CDragDropTargetFlavorHelper 的子类。drop 在 Windows 上完美运行。但是在 mac 上,我的方法 CouldAcceptTypes 有问题:
DragDrop::TargetResponse AutocatDNDCustomFlavorHelper::CouldAcceptTypes(const DragDropTarget* target, DataObjectIterator* dataIter, const IDragDropSource* fromSource, const IDragDropController* controller) const
{
if (0 != dataIter && 0 != target)
{
DataExchangeResponse response = dataIter->FlavorExistsWithPriorityInAllObjects(kURLDExternalFlavor);
if (response.CanDo())
{
...
}
}
}
问题是 response.canDo() 在 Windows 上回答 kTrue,但在 Mac 上回答 kFalse。我试图探索 dataIter 的内容,但对 dataIter->First() 的调用返回 nil。我尝试了一个控制器->GetItemCount(),它返回 1。但是如果我尝试一个控制器->GetDragItem(1),我得到一个零指针。我有印象没有项目。不过,正如我所说,该 drop 在 InDesign 以外的其他应用程序上也有效。
是内化的问题吗?或者是其他东西 ?它让我干了。
提前致谢
- - - - - - - - - - - - - 编辑 - - - - - - - - - - - - ------------ 我解决了这个问题,但发现了另一个问题。弹性面板发送的风格已更改,因此它是文本风格而不是 URL 风格。我的方法 canAcceptType 现在可以工作了:
DragDrop::TargetResponse AutocatDNDCustomFlavorHelper::CouldAcceptTypes(const DragDropTarget* target, DataObjectIterator* dataIter, const IDragDropSource* fromSource, const IDragDropController* controller) const
{
if (0 != dataIter && 0 != target)
{
// Check for URL Flavor in the drag
DataExchangeResponse response = dataIter->FlavorExistsWithPriorityInAllObjects(kTEXTExternalFlavor);
if (response.CanDo())
{
return DragDrop::TargetResponse(response, DragDrop::kDropWillCopy);
}
}
return DragDrop::kWontAcceptTargetResponse;
}
现在问题出在 ProcessDragDropCommand 方法中。这是代码:
ErrorCode AutocatDNDCustomFlavorHelper::ProcessDragDropCommand(IDragDropTarget* target, IDragDropController* controller, DragDrop::eCommandType action)
{
// retrieve drop data
IPMDataObject* dragDataObject = controller->GetDragItem(1);
uint32 dataSize = dragDataObject->GetSizeOfFlavorData(kTEXTExternalFlavor) ;
...
}
问题是我得到的 IMPDataObject 为零。控制器中没有项目。但是,CoulAcceptTypes 方法中有一些项,在 DataObjectIterator 中。那么,我的物品在哪里?
我尝试使用自定义 CDataExchangeHandlerFor,但无法真正理解它的用途。无论如何它都没有用。
有人有想法吗?
问候, 雷米