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
Ir a la versión completa