Domingo 6 de Octubre de 2024, 15:28
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
Visual Basic 6.0 e inferiores
(Moderador:
F_Tanori
) »
Clic copiar, clic pegar
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Clic copiar, clic pegar (Leído 2636 veces)
Mombasa
Nuevo Miembro
Mensajes: 6
Clic copiar, clic pegar
«
en:
Miércoles 17 de Abril de 2013, 18:06 »
0
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.
Tweet
Nebire
Miembro HIPER activo
Mensajes: 670
Re:Clic copiar, clic pegar
«
Respuesta #1 en:
Viernes 7 de Junio de 2013, 21:18 »
0
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
With
End
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 If
End
Sub
Acomodarlo a tus necesidades ya es trabajo tuyo...
«Ma non troppo»
----> ModoVacaciones = False<----
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
Visual Basic 6.0 e inferiores
(Moderador:
F_Tanori
) »
Clic copiar, clic pegar