Arrastar e soltar do OLE

O recurso de arrastar e soltar do OLE é principalmente um atalho para copiar e colar dados. Quando você usa a Área de Transferência para copiar ou colar dados, várias etapas são necessárias. Você seleciona os dados e escolhe Recortar ou Copiar no menu Editar. Em seguida, você passa para o aplicativo ou janela de destino e coloca o cursor no local de destino. Por fim, você escolhe Editar>Colar no menu.

O recurso de arrastar e soltar do OLE é diferente do mecanismo de arrastar e soltar do Gerenciador de Arquivos. O Gerenciador de Arquivos só pode manipular nomes de arquivo e foi projetado especificamente para transferir nomes de arquivo para aplicativos. Arrastar e soltar no OLE é muito mais geral. Ele permite que você arraste e solte quaisquer dados que também poderiam ser colocados na Área de Transferência.

Ao usar arrastar e soltar no OLE, você remove duas etapas do processo. Você seleciona os dados na janela de origem (a "fonte para soltar") e os arrasta para o destino (o "destino para soltar"). Você solta liberando o botão do mouse. A operação elimina a necessidade de menus e é mais rápida do que a sequência de cópia/colagem. Há apenas um requisito: tanto a fonte quanto o destino para soltar devem estar abertos e, pelo menos, parcialmente visíveis na tela.

Usando arrastar e soltar do OLE, os dados podem ser transferidos facilmente de um local para outro: dentro de um documento, entre documentos diferentes ou entre aplicativos. Isso pode ser implementado em um contêiner ou em um aplicativo de servidor. Qualquer aplicativo pode ser uma fonte para soltar, um destino para soltar ou ambos. Se um aplicativo implementar o suporte para ser fonte e destino para soltar, você poderá arrastar e soltar entre as janelas filho ou dentro de uma janela. Esse recurso torna seu aplicativo muito mais fácil de usar.

Os artigos sobre Objetos de dados e fontes de dados (OLE) explicam como implementar a transferência de dados em seus aplicativos. Também é útil examinar os exemplos OCLIENT e HIERSVR do OLE do MFC.

Implementar uma fonte para soltar

Para que seu aplicativo forneça dados para uma operação de arrastar e soltar, implemente uma fonte para soltar. A implementação básica de uma fonte para soltar é relativamente simples. A primeira etapa é determinar quais eventos iniciam uma operação de arrastar. As diretrizes de interface do usuário recomendadas definem o início de uma operação de arrastar como quando um evento WM_LBUTTONDOWN ocorre em um ponto dentro de alguns dados selecionados. Os exemplos OCLIENT e HIERSVR do OLE do MFC seguem essas diretrizes.

Se o aplicativo for um contêiner e os dados selecionados forem um objeto vinculado ou inserido do tipo COleClientItem, chame sua função membro DoDragDrop. Caso contrário, construa um objeto COleDataSource, inicialize-o com a seleção e chame a função membro DoDragDrop do objeto de fonte de dados. Se o aplicativo for um servidor, use COleServerItem::DoDragDrop. Para obter informações sobre como personalizar o comportamento padrão de arrastar e soltar, consulte a seção Personalizar arrastar e soltar.

Se DoDragDrop retornar DROPEFFECT_MOVE, exclua os dados de origem do documento de origem imediatamente. Nenhum outro valor retornado de DoDragDrop tem qualquer efeito sobre uma fonte para soltar.

Para obter mais informações, consulte Objetos de dados e fontes de dados OLE: criação e destruição e Objetos de dados e fontes de dados OLE: manipulação.

Implementar um destino para soltar

É necessário um pouco mais de trabalho para implementar um destino para soltar do que uma fonte para soltar, mas ainda é relativamente simples.

Para implementar um destino para soltar do OLE

  1. Se ainda não estiver lá, adicione uma chamada para AfxOleInit à função membro InitInstance do aplicativo. Essa chamada é necessária para inicializar as bibliotecas de OLE.

  2. Adicione uma variável membro a cada exibição no aplicativo que você deseja que seja um destino para soltar. Essa variável membro deve ser do tipo COleDropTarget ou uma classe derivada dele.

  3. Na função da classe de exibição que manipula a mensagem WM_CREATE (normalmente OnCreate), chame a função membro Register da nova variável membro. Revoke será chamado automaticamente para você quando sua exibição for destruída.

  4. Substitua as funções a seguir. Se você quiser o mesmo comportamento em todo o aplicativo, substitua essas funções em sua classe de exibição. Se quiser modificar o comportamento em casos isolados ou habilitar o recurso de soltar em janelas não CView, substitua essas funções em sua classe derivada de COleDropTarget.

    Substituições Para permitir
    OnDragEnter Operações de soltar na janela. Chamado quando o cursor entra primeiro na janela.
    OnDragLeave Comportamento especial quando a operação de arrastar deixa a janela especificada.
    OnDragOver Operações de soltar na janela. Chamado quando o cursor está sendo arrastado pela janela.
    OnDrop Manipulação de dados que estão sendo soltos na janela especificada.
    OnScrollBy Comportamento especial para quando a rolagem é necessária na janela de destino.

Confira o arquivo MAINVIEW.CPP que faz parte do exemplo OCLIENT do OLE do MFC para obter um exemplo de como essas funções funcionam juntas.

Para obter mais informações, consulte Objetos de dados e fontes de dados OLE: criação e destruição e Objetos de dados e fontes de dados OLE: manipulação.

Personalizar o recurso de arrastar e soltar

A implementação padrão do recurso de arrastar e soltar é suficiente para a maioria dos aplicativos. No entanto, alguns aplicativos podem exigir que você altere esse comportamento padrão. Esta seção explica as etapas necessárias para alterar esses padrões. Você pode usar essa técnica para tornar aplicativos que não dão suporte a documentos compostos em fontes para soltar.

Se estiver personalizando o comportamento padrão de arrastar e soltar do OLE ou tiver um aplicativo que não seja OLE, você precisará criar um objeto COleDataSource para conter os dados. Quando o usuário inicia uma operação de arrastar e soltar, seu código deve chamar a função DoDragDrop desse objeto em vez de outras classes que dão suporte a operações de arrastar e soltar.

Opcionalmente, você pode criar um objeto COleDropSource para controlar o processo de soltar e substituir algumas de suas funções, dependendo do tipo de comportamento que deseja alterar. Esse objeto de fonte para soltar é, então, passado para COleDataSource::DoDragDrop para alterar o comportamento padrão dessas funções. Essas opções diferentes proporcionam muita flexibilidade na forma como você dá suporte a operações de arrastar e soltar no aplicativo. Para obter mais informações sobre fontes de dados, confira o artigo Objetos de dados e fontes de dados (OLE).

Você pode substituir as seguintes funções para personalizar operações de arrastar e soltar:

Substituições Para personalizar
OnBeginDrag Como a operação de arrastar começa depois que você chama DoDragDrop.
GiveFeedback Resposta visual, como a aparência do cursor, para diferentes resultados de soltar.
QueryContinueDrag O encerramento de uma operação de arrastar e soltar. Essa função permite que você verifique os estados da tecla modificadora durante a operação de arrastar.

Confira também

OLE
Objetos de dados e fontes de dados OLE
Objetos de dados e fontes de dados OLE: criação e destruição
Objetos de dados e fontes de dados OLE: manipulação
COleClientItem::DoDragDrop
COleDataSource classe
COleDataSource::DoDragDrop
Classe COleDropSource
Classe COleDropTarget
CView::OnDragLeave