Interfaces de Transferência de Dados
A interfaceIDataObjectfornece aos consumidores de dados métodos para obter e definir dados de um objeto, determinar quais formatos o objeto dá suporte e registrar e receber notificações quando os dados no objeto forem alterados. Ao obter dados, um chamador pode especificar o formato no qual deseja renderizar os dados. No entanto, a fonte dos dados determina a mídia de armazenamento, que retorna em um parâmetro out fornecido pelo chamador.
Por si só, IDataObject fornece todas as ferramentas necessárias para implementar transferências de área de transferência do Windows ou transferências de documentos compostos em seus aplicativos. Se você também quiser dar suporte a transferências de arrastar e soltar, será necessário implementar as interfaces IDropSource e IDropTarget juntamente com IDataObject.
A interface deIDataObject combinada com APIs de área de transferência OLE fornecem todos os recursos das APIs da área de transferência do Windows. Geralmente, não é necessário usar as duas APIs de área de transferência. Os fornecedores de dados que dão suporte a transferências de arrastar e soltar ou documentos compostos OLE devem implementar a interface IDataObject. Se o aplicativo oferecer suporte apenas a transferências de área de transferência agora, mas você pretende adicionar documentos de arrastar e soltar ou compostos em versões posteriores, convém implementar IDataObject e as APIs da área de transferência OLE agora para minimizar o tempo gasto em recodificação e depuração posteriormente. Talvez você também queira implementar IDataObject para utilizar mídia de transferência diferente da memória global.
A tabela a seguir resume quais serão usadas, dependendo de quais tipos de transferência de dados você deseja dar suporte:
Para dar suporte | Usar |
---|---|
Documentos compostos |
IDataObject |
Arrastar e soltar transferências |
IDataObject, IDropSource, IDropTarget, DoDragDrop (ou o equivalente) |
Transferências de área de transferência usando memória global exclusivamente |
de API da Área de Transferência |
Transferências de área de transferência usando meios de troca diferentes da memória global. |
IDataObject |
Transferências de área de transferência agora, mas arrastar e soltar ou documentos compostos mais tarde |
IDataObject e as interfaces e a função listadas acima para "Arrastar e soltar transferências" |
Quando um usuário inicia uma operação de transferência de dados, o aplicativo de origem cria uma instância de IDataObject e, por meio dele, disponibiliza os dados em um ou mais formatos. Em uma transferência de área de transferência, o aplicativo chama a função OleSetClipboard para passar um ponteiro de objeto de dados para OLE. (OleSetClipboard também oferece formatos de dados de área de transferência padrão para aplicativos OLE versão 1 e não OLE.) Em uma transferência de arrastar e soltar, o aplicativo chama a função DoDragDrop em vez disso.
No lado receptor da transferência, o destino recebe o ponteiro IDataObject como um argumento para uma invocação de IDropTarget::D rop ou chamando a funçãoOleSetClipboard, dependendo se a transferência é por meio de arrastar e soltar ou a área de transferência. Tendo obtido esse ponteiro, as chamadas de destino IDataObject::EnumFormatEtc para saber quais formatos estão disponíveis para recuperação e sobre quais tipos de mídia eles podem ser obtidos. Armado com essas informações, o aplicativo receptor solicita os dados com uma chamada para IDataObject::GetData.