Programación General > Visual Basic 6.0 e inferiores

 Clic copiar, clic pegar

(1/1)

Mombasa:
Consulta:
Supongamos que tengo un formulario dividido en dos: de un lado varias imágenes.
Lo que deseo es hacer un clic sobre alguna de ellas, ir hacia el otro sector del formulario y pegar la imagen clickeada.
Pegarla en cualquier parte del form y la cantidad de veces que haga clic.
¿Es factible realizar esto? Ustedes me dirán si debo realizarlo con un PictureBox ó Image.

Muchas gracias.

Nebire:
Tienes que usar los métodos DragDrop dragover y hacer uso de las propiedades Dragicon y Dragmode

Te pongo un poco de código...
- Pon 3 controles image con estos nombres:
  ImageOrigen
  ImageDestino
 ImageMini
Al control imageOrigen en la propiedad Index pole el valor 0, para forzar un array de controles, el resto se hace desde el código.

El código lo divido en 2 partes, lo que sucede cuando se carga el formulario y el trabajo propio de arrastrar y soltar

Aquí el código de carga del formulario:

--- Código: Visual Basic --- Private IcoDrag As IPictureDisp Private Sub Form_Load()    Dim pic As IPictureDisp    Dim ruta As String, nombre As String    Dim posLeft As Long, k As Long        Set IcoDrag = LoadPicture("c:\ruta\iconoarrastrar.ico") ' ruta a un icono que sugiera arrastrar la imagen...        With Me        .Show   ' para poder cómo se carga mientras se realiza la carga del formulario        .ScaleMode = vbPixels        .WindowState = 2 ' maximizado        .AutoRedraw = True    End With              ' damos propiedades a la imagen de origen, los demás controles que creemos se basan en este y  copiarán casi todas sus propiedades (visible siempre es false de entrada)    posLeft = 6    With ImageOrigen(0)        Call .Move(posLeft, 10, 64, 64)        .Stretch = True        .DragMode = 1 ' automático        .BorderStyle = 1 ' con borde        Set .DragIcon = IcoDrag    End With        ruta = VBA.Environ$("windir") & "\web\wallpaper\"   ' en esta ruta suele encontrarse imágenes, para probar... el ejmplo enteramente    nombre = Dir(ruta)    Do While nombre <> ""        Set pic = LoadPicture(ruta & nombre)                If pic <> 0 Then ' si se cargó la imagen... pic tendrá un valor distinto de 0.            With ImageOrigen(k)                Call .Move(posLeft, 10)   ' posicionamos el control image                Set .Picture = pic          ' asignamos el picture                .Visible = True               ' es obligatorio, porque al cargarlo siempre está invisible                'Me.Refresh                   ' retira el comentario, para ir viendo la carga una a una.            End With            posLeft = posLeft + 70 ' 64px. de la imagen + 6 de espacio libre entre ellos            If posLeft > Me.ScaleWidth Then Exit Do  ' solo cargamos las que quepan en el ancho de la ventana.            k = k + 1            Load ImageOrigen(k) ' crear un nuevo control Image copia del ImageOrigen(0) , un array        End If        nombre = Dir  'tomamos siguiente nombre en la misma ruta...    Loop    ' posicionamos la imagen destino, debajo de la fila de imágenes de origen y le damos un tamaño de 300x400    With ImageDestino        Call .Move(10, 80, 300, 400)        .Stretch = True        .DragMode = 0 ' manual (no lo usaremos como origen)        Me.Line (10, 80)-(310, 480), vbBlack, BF ' dejamos un recuadro donde está la imagen destino, porque no tiene propiedad backcolor.    End With        ' Posicionamos el otro control de imagen, centrada de 81x108 (mucho más pequeña), se usará para indicar que admite desde el origen o no la imagen...    With ImageMini        Call .Move(0, 0, 81, 108) ' dimensiones        Call .Move(ImageDestino.Left + ((ImageDestino.Width - .Width) \ 2), ImageDestino.Top + ((ImageDestino.Height - .Height) \ 2))   ' centrado en la imagen receptora.        .Stretch = True        .ZOrder 1 ' la enviamos al fondo, debajo de ImageDestino    End With        ' Esta imagen es para simular otro objeto de arrastrar y soltar, pero que en teoría no debería tener como destino ImageDestino y así ver como lo rechazamos.    With ImageOtro        Call .Move(600, 80, 80, 128)        .Stretch = True        .DragMode = 1        .BorderStyle = 1        Set .Picture = ImageOrigen(0).Picture        Set .DragIcon = IcoDrag    End WithEnd Sub 
Ahora sólo nos falta el código de las operaciones...

--- Código: Visual Basic ---' El arrastre lo marcamos manual, luego podemos aprovechar este evento, para indicarlo'    Nota como el valor del parámetro de DRAG, podría ser una variable cuyo valor se basara en condciones del programa.Private Sub ImageOrigen_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)    ImageOrigen(Index).Drag (1) ' comienza el arrastre 'manual'End Sub ' Destino detecta una señal de enfoque o pérdida de foco, en un arrastre procedente de un objeto image.'   Nota, como 'filtramos' para aceptar solo del origen deseado, Private Sub ImageDestino_DragOver(Source As Control, X As Single, Y As Single, State As Integer)    If Source.Name = "ImageOrigen" Then    'If TypeName(Source) = "Image" Then        If State = 0 Then  ' destino detecta origen invadiendo su 'zona'            'ImageDestino.BorderStyle = 1 ' se señala            ImageMini.ZOrder 0            ImageMini.Picture = Source.Picture        ElseIf State = 1 Then            'ImageDestino.BorderStyle = 0 ' se retira            ImageMini.ZOrder 1            ImageMini.Picture = Nothing        End If    Else        'ImageDestino.BorderStyle = 0        If (State Mod 2) = 0 Then           ImageMini.ZOrder 1  ' escondemos la imagen debajo de ImageDestino           'Beep ' no admitimos otro origen...        Else            '        End If    End If '  Se suelta en destino, primero comprobamos si el origen era el control del que se espera recibir, no otro.'   Nota como el control de typename, podríamos usarlo para filtrar el resto de tipos de controles de un plumazo y en la 2ª comprobación lo hacemos específico al control del que se acepta el origen.Private Sub ImageDestino_DragDrop(Source As Control, X As Single, Y As Single)    'If TypeName(Source) = "Image" Then        If Source.Name = "ImageOrigen" Then            'ImageDestino.BorderStyle = 0            Set ImageDestino.Picture = Source.Picture            ImageMini.ZOrder 1        'Else            ' Beep          End If    'End IfEnd Sub 
Acomodarlo a tus necesidades ya es trabajo tuyo...

Navegación

[0] Índice de Mensajes

Ir a la versión completa