SoloCodigo

Programación General => Visual Basic 6.0 e inferiores => Mensaje iniciado por: Mombasa en Miércoles 17 de Abril de 2013, 18:06

Título: Clic copiar, clic pegar
Publicado por: Mombasa en Miércoles 17 de Abril de 2013, 18:06
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.

Título: Re:Clic copiar, clic pegar
Publicado por: Nebire en Viernes 7 de Junio de 2013, 21:18
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
  1.  
  2. Private IcoDrag As IPictureDisp
  3.  
  4. Private Sub Form_Load()
  5.     Dim pic As IPictureDisp
  6.     Dim ruta As String, nombre As String
  7.     Dim posLeft As Long, k As Long
  8.    
  9.     Set IcoDrag = LoadPicture("c:\ruta\iconoarrastrar.ico") ' ruta a un icono que sugiera arrastrar la imagen...
  10.    
  11.     With Me
  12.         .Show   ' para poder cómo se carga mientras se realiza la carga del formulario
  13.        .ScaleMode = vbPixels
  14.         .WindowState = 2 ' maximizado
  15.        .AutoRedraw = True
  16.     End With
  17.          
  18.    
  19. ' 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)
  20.    posLeft = 6
  21.     With ImageOrigen(0)
  22.         Call .Move(posLeft, 10, 64, 64)
  23.         .Stretch = True
  24.         .DragMode = 1 ' automático
  25.        .BorderStyle = 1 ' con borde
  26.        Set .DragIcon = IcoDrag
  27.     End With
  28.    
  29.     ruta = VBA.Environ$("windir") & "\web\wallpaper\"   ' en esta ruta suele encontrarse imágenes, para probar... el ejmplo enteramente
  30.    nombre = Dir(ruta)
  31.     Do While nombre <> ""
  32.         Set pic = LoadPicture(ruta & nombre)
  33.        
  34.         If pic <> 0 Then ' si se cargó la imagen... pic tendrá un valor distinto de 0.
  35.            With ImageOrigen(k)
  36.                 Call .Move(posLeft, 10)   ' posicionamos el control image
  37.                Set .Picture = pic          ' asignamos el picture
  38.                .Visible = True               ' es obligatorio, porque al cargarlo siempre está invisible
  39.                'Me.Refresh                   ' retira el comentario, para ir viendo la carga una a una.
  40.            End With
  41.             posLeft = posLeft + 70 ' 64px. de la imagen + 6 de espacio libre entre ellos
  42.            If posLeft > Me.ScaleWidth Then Exit Do  ' solo cargamos las que quepan en el ancho de la ventana.
  43.            k = k + 1
  44.             Load ImageOrigen(k) ' crear un nuevo control Image copia del ImageOrigen(0) , un array
  45.        End If
  46.         nombre = Dir  'tomamos siguiente nombre en la misma ruta...
  47.    Loop
  48.    
  49. ' posicionamos la imagen destino, debajo de la fila de imágenes de origen y le damos un tamaño de 300x400
  50.    With ImageDestino
  51.         Call .Move(10, 80, 300, 400)
  52.         .Stretch = True
  53.         .DragMode = 0 ' manual (no lo usaremos como origen)
  54.        Me.Line (10, 80)-(310, 480), vbBlack, BF ' dejamos un recuadro donde está la imagen destino, porque no tiene propiedad backcolor.
  55.    End With
  56.    
  57.     ' 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...
  58.    With ImageMini
  59.         Call .Move(0, 0, 81, 108) ' dimensiones
  60.        Call .Move(ImageDestino.Left + ((ImageDestino.Width - .Width) \ 2), ImageDestino.Top + ((ImageDestino.Height - .Height) \ 2))   ' centrado en la imagen receptora.
  61.        .Stretch = True
  62.         .ZOrder 1 ' la enviamos al fondo, debajo de ImageDestino
  63.    End With
  64.    
  65.     ' 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.
  66.    With ImageOtro
  67.         Call .Move(600, 80, 80, 128)
  68.         .Stretch = True
  69.         .DragMode = 1
  70.         .BorderStyle = 1
  71.         Set .Picture = ImageOrigen(0).Picture
  72.         Set .DragIcon = IcoDrag
  73.     End With
  74. End Sub
  75.  

Ahora sólo nos falta el código de las operaciones...
Código: Visual Basic
  1. ' El arrastre lo marcamos manual, luego podemos aprovechar este evento, para indicarlo
  2. '    Nota como el valor del parámetro de DRAG, podría ser una variable cuyo valor se basara en condciones del programa.
  3. Private Sub ImageOrigen_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
  4.     ImageOrigen(Index).Drag (1) ' comienza el arrastre 'manual'
  5. End Sub
  6.  
  7. ' Destino detecta una señal de enfoque o pérdida de foco, en un arrastre procedente de un objeto image.
  8. '   Nota, como 'filtramos' para aceptar solo del origen deseado,
  9. Private Sub ImageDestino_DragOver(Source As Control, X As Single, Y As Single, State As Integer)
  10.     If Source.Name = "ImageOrigen" Then
  11.     'If TypeName(Source) = "Image" Then
  12.        If State = 0 Then  ' destino detecta origen invadiendo su 'zona'
  13.            'ImageDestino.BorderStyle = 1 ' se señala
  14.            ImageMini.ZOrder 0
  15.             ImageMini.Picture = Source.Picture
  16.         ElseIf State = 1 Then
  17.             'ImageDestino.BorderStyle = 0 ' se retira
  18.            ImageMini.ZOrder 1
  19.             ImageMini.Picture = Nothing
  20.         End If
  21.     Else
  22.         'ImageDestino.BorderStyle = 0
  23.        If (State Mod 2) = 0 Then
  24.            ImageMini.ZOrder 1  ' escondemos la imagen debajo de ImageDestino
  25.           'Beep ' no admitimos otro origen...
  26.        Else
  27.             '
  28.        End If
  29.     End If
  30.  
  31. '  Se suelta en destino, primero comprobamos si el origen era el control del que se espera recibir, no otro.
  32. '   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.
  33. Private Sub ImageDestino_DragDrop(Source As Control, X As Single, Y As Single)
  34.     'If TypeName(Source) = "Image" Then
  35.        If Source.Name = "ImageOrigen" Then
  36.             'ImageDestino.BorderStyle = 0
  37.            Set ImageDestino.Picture = Source.Picture
  38.             ImageMini.ZOrder 1
  39.         'Else
  40.            ' Beep  
  41.        End If
  42.     'End If
  43. End Sub
  44.  

Acomodarlo a tus necesidades ya es trabajo tuyo...