0

我在 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,但无法真正理解它的用途。无论如何它都没有用。

有人有想法吗?

问候, 雷米

4

1 回答 1

0

问题是GetDragItem 的参数。在 PC 上为 1。在 Mac 上这是一个奇怪的值(类似于 719853)。我发现的唯一肮脏的解决方案是从从 CanAcceptTypes 方法中的 dataIter 检索到的对象执行 memcpy,并在 ProcessDragDropCommand 方法中使用它。

于 2012-01-27T12:32:50.790 回答