VB .NET - Arrastando e soltando imagens em um formulário com Drag and Drop


 Neste artigo eu vou mostrar como podemos arrastar e soltar imagens em um formulário de uma aplicação Windows Forms usando a linguagem VB .NET e os recursos drag and drop da plataforma .NET.

Para começar uma operação de arrastar-e-soltar, você chama o método DoDragDrop de um controle Windows Forms. O método DoDragDrop é implementado na classe System.Windows.Forms.Control, o que significa que ela está disponível em todos os controles dentro de namespace do Windows Forms.

Além disso dois eventos importantes devem ser tratados durante a operação de arrastar e soltar:

O método DoDragDrop leva dois argumentos: os dados a serem arrastados, e as operações de arrasto que esse controle permite. Você pode chamar o método DoDragDrop a qualquer momento, embora com mais frequência que você vai querer usar o evento MouseDown como uma maneira de provocar arrastando quando o usuário espera.

Ao arrastar (drag) um arquivo para o formulário temos que tratar quando o arquivo é solto (drop) no formulário pois o Windows Explorer já trata a operação de arrastar. Para arrastar um arquivo para o formulário primeiro configuramos a propriedade AllowDrop do formulário para true de forma que o formulário possa aceitar objetos que sejam arrastados.

O manipulador de eventos verifica se ao soltar o objeto (drop) temos um item do tipo DataFormat.FileDrop, ou seja, permitimos que somente arquivos sejam arrastados,  em seguida ele extrai o nome do DataObject no argumento DragEvent e usa o nome do arquivo para carregar a imagem e colocá-la no controle correspondente onde o arquivo esta sendo descarregado.

O campo DataFormat.FileDrop define o formato de arquivos do sistema de arquivos do Windows para a operação drop.(soltar)

Neste processo a enumeração DragDropEffects descreve o efeito do cursor que pode ser representado durante a operação e não irá garantir que o objeto será movido. Abaixo vemos os seus valores:

Membro Descrição
All  Os dados são copiados , removido da fonte arrastar , e rolado no destino.
Copy  Os dados são copiados para o destino
Link  Os dados são vinculados ao destino
Move  Os dados são movidos para o destino
None  O destino não aceita os dados
Scroll  A Rolagem está prestes a começar ou ocorrendo atualmente no alvo.

Qualquer controle pode aceitar dados de uma operação de arrastar-e-soltar em andamento. Para designar um controle como uma zona para soltar, você deve fazer três coisas:

  1. Definir a propriedade AllowDrop do controle como True.
  2. Lidar com a propriedade DragEnter do controle.
  3. Lidar com a propriedade DragDrop do controle.

O evento DragEnter ocorre quando uma operação de arrastar-e-soltar está em andamento (ou seja, algum controle chamou o método DoDragDrop) e o cursor entra o controle. Este evento passa um argumento da classe System.Windows.Forms.DragEventArgs. Você deve definir a propriedade Effects argumento para um valor a partir da Tabela acima para indicar a ação que será tomada caso a operação seja concluída neste controle. O sistema usará este valor para pegar o cursor de soltar indicado para exibir.

È isso que vamos fazer.

Recursos Usados :

Criando o projeto no Visual Studio 2013 Express for Windows Desktop

Abra o VS Express 2013 for Windows Desktop e clique em New Project;

A seguir selecione a linguagem Visual C# e o template Windows Forms Application;

Informe o nome Drag_Drop_Imagens e clique no botão OK;

Agora vamos definir o código para habilitar a operação de arrastar e soltar no formulário  form1.vb do projeto.

1 - No evento Load temos o código que define AllowDrop igual a True permitindo o controle receber dados; a seguir define a propriedade BackgroundImageLayout como Stretch de forma a ajustar a imagem no formulário e trata os eventos DragDrop e DragEnter usando o operador AddressOf que cria um delegado de função que aponta para a função especificada, no caso, os eventos Form_DragDrop e FormDragEnter:

 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.AllowDrop = True
        Me.BackgroundImageLayout = ImageLayout.Stretch
        AddHandler Me.DragDrop, AddressOf Form_DragDrop
        AddHandler Me.DragEnter, AddressOf Form_DragEnter
    End Sub

 

2- No evento DragDrop criamos um array de strings (Arquivos()) onde os arquivos serão armazenados e exibimos o arquivo imagem em um controle Image via propriedade BackGroundImage do formulário:

   Private Sub Form_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs)
        If e.Data.GetDataPresent(DataFormats.FileDrop) Then
            Dim Arquivos() As String
            Arquivos = e.Data.GetData(DataFormats.FileDrop)
            Dim img As Image
            img = Image.FromFile(Arquivos(0))
            Me.Width = img.Width
            Me.Height = img.Height
            Me.BackgroundImage = img
        End If
    End Sub

3- No evento DragEnter permitimos que  apenas arquivos sejam arrastados  usando DataFormatas.FileDrop, e definimos a enumeração DragDropEffects como All:

Nota: DragDropEffects especifica os possíveis efeitos de uma operação de arrastar-e-soltar. All indica uma combinação dos efeitos Copy, Move e Scrool.

 Private Sub Form_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs)
        If e.Data.GetDataPresent(DataFormats.FileDrop) Then
            e.Effect = DragDropEffects.All
        End If
    End Sub

Executando o projeto e abrindo uma pasta com imagem ao lado do formulário podemos selecionar uma imagem e arrastar a imagem para o formulário:

Ao soltar a imagem no formulário iremos obter a visualização da imagem conforme abaixo:

Pegue o projeto completo aqui : Drag_Drop_Imagens.zip

    Porque nem mesmo seus irmãos criam nele.
    Disse-lhes, pois, Jesus: Ainda não é chegado o meu tempo, mas o vosso tempo sempre está pronto.
    O mundo não vos pode odiar, mas ele me odeia a mim, porquanto dele testifico que as suas obras são más.
   
João 7:5-7

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti