WPF - Realizando operações com o ClipBoard - II


 No artigo de hoje vou mostrar como podemos realizar as operações de copiar e colar envolvendo o ClipBoard.

 

Na primeira parte deste artigo eu mostrei como podemos copiar e colar textos para a área de transferência do Windows em uma aplicação WPF, agora vou mostrar como podemos copiar e colar imagens para e a partir do ClipBoard.
 

Recursos usados :

Copiando Imagens de e para o ClipBoard

Abra o projeto Usando_ClipBoard  criado no artigo anterior e no menu PROJECT clique em Add Window e informe o nome WindowImagem.xaml;

A seguir abra o arquivo WindowImagem.xaml e vamos usar os seguintes controles a partir da ToolBox:

Para isso inclua neste arquivo o código XAML abaixo:

<Window x:Class="WindowImagem"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Copiando e Colando Imagens" Height="311" Width="537">
    <Grid>
        <Label Content="Arquivo" HorizontalAlignment="Left" Margin="20,10,0,0" VerticalAlignment="Top" Width="64"/>
        <Label x:Name="lblArquivo" Content="" HorizontalAlignment="Left" Margin="89,10,0,0" Background="Aqua" VerticalAlignment="Top" Width="326"/>
        <Button x:Name="btnCarregarImagem" Content="Procurar" HorizontalAlignment="Left" Margin="420,10,0,0" VerticalAlignment="Top" Width="75" Height="26" Click="btnCarregarImagem_Click"/>
        <Image x:Name="imgArquivo" HorizontalAlignment="Left" Height="203" Margin="89,52,0,0" VerticalAlignment="Top" Width="326" Opacity="0.5"/>
        <Button x:Name="btnCopiar" Content="Copiar" HorizontalAlignment="Left" Margin="420,236,0,0" VerticalAlignment="Top" Width="75" Height="26" Click="btnCopiar_Click"/>
        <Button x:Name="btnColar" Content="Colar" HorizontalAlignment="Left" Margin="420,199,0,0" VerticalAlignment="Top" Width="75" Height="27" Click="btnColar_Click"/>
    </Grid>
</Window>

O leiaute da aplicação deverá esta conforme a figura abaixo:

No evento Click do botão Procurar no arquivo WindowImagem.xaml.vb inclua o código a seguir para abrir a caixa de diálogo OpenFileFialog e permitir a seleção de uma imagem pelo usuário:

  Private Sub btnCarregarImagem_Click(sender As Object, e As RoutedEventArgs)
        Dim dlg As New OpenFileDialog()
        dlg.InitialDirectory = "c:\dados"
        dlg.Filter = "Imagens (*.jpg)|*.jpg|Todos (*.*)|*.*"
        dlg.RestoreDirectory = True
        If dlg.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
        Else
            Dim arquivoSelecionado As String = dlg.FileName
            lblArquivo.Content = arquivoSelecionado
            Dim bitmap As New BitmapImage()
            bitmap.BeginInit()
            bitmap.UriSource = New Uri(arquivoSelecionado)
            bitmap.EndInit()
            imgArquivo.Source = bitmap
        End If
 End Sub
 

Neste código após selecionar a imagem estamos criando objeto da classe BitMapImage que Fornece um BitmapSource especializado que é otimizado para carregar imagens usando o Extensible Application Markup Language (XAML).

A seguir definimos a fonte URi para o BitmapImage como sendo o arquivo selecionado e exibimos o arquivo no controle imgArquivo usando a propriedade Source.

A seguir no evento Click do botão Copiar inclua o código abaixo:

    Private Sub btnCopiar_Click(sender As Object, e As RoutedEventArgs)
        Try
            Dim width As Double = imgArquivo.ActualWidth
            Dim height As Double = imgArquivo.ActualHeight
            Dim bmpCopied As New RenderTargetBitmap(CInt(Math.Round(width)), CInt(Math.Round(height)), 96, 96, PixelFormats.[Default])
            Dim dv As New DrawingVisual()
            Using dc As DrawingContext = dv.RenderOpen()
                Dim vb As New VisualBrush(imgArquivo)
                dc.DrawRectangle(vb, Nothing, New Rect(New Point(), New Size(width, height)))
            End Using
            bmpCopied.Render(dv)
            Clipboard.SetImage(bmpCopied)
        Catch ex As Exception
             MessageBox.Show(ex.Message)
        End Try
    End Sub

Para concluir, inclua o código abaixo no evento Click do botão Colar :

 Private Sub btnColar_Click(sender As Object, e As RoutedEventArgs)
        Try
            If Clipboard.ContainsImage() Then
                Dim clipboardData As System.Windows.Forms.IDataObject = System.Windows.Forms.Clipboard.GetDataObject()
                If clipboardData IsNot Nothing Then
                    If clipboardData.GetDataPresent(System.Windows.Forms.DataFormats.Bitmap) Then
                        Dim bitmap As System.Drawing.Bitmap = DirectCast(clipboardData.GetData(System.Windows.Forms.DataFormats.Bitmap), System.Drawing.Bitmap)
                        imgArquivo.Source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(), IntPtr.Zero, 
Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions())
                    End If
                End If
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

Agora vamos testar...

Execute o projeto e clique  no botão Procurar e selecione uma imagem qualquer exibindo no controle Image como vemos na figura abaixo:

1- Copiando do programa para o ClibBoard

Para copiar para o ClipBoard basta clicar no botão Copiar e a seguir abrir qualquer editor de arquivos. No exemplo eu estou abrindo o Paint e selecionando a opção Colar do menu para exibir a imagem que foi copiada para o ClipBoard no Paint:

2- Colando do ClipBoard para o programa

Agora abra o Paint e carregue uma imagem conforme mostra a figura abaixo. Selecione a imagem e depois clique na opção Copiar do menu. Isso irá copiar a imagem para a área de transferência.

Agora execute o projeto e a seguir clique no botão Colar e você verá a imagem exibida no controle Image (imgArquivo) da janela WindowImagem:

Pegue o projeto completo aqui: Usando_ClipBoard_1.zip

Porque pela graça sois salvos, por meio da fé; e isto não vem de vós, é dom de Deus.
Não vem das obras, para que ninguém se glorie;
Efésios 2:8,9

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