Os traigo un ejemplo de uso del contenedor llamado scrollview, que nos permite trabajar con formulario o imágenes que tengan grandes dimensiones, y movernos atreves de ellos mediante scrollbar horizontales y verticales
En este ejemplo podeis crear objetos dentro del scrollview (unos muñecos de nieve o un arbol), cogerlos y moverlos a lo largo del fondo para colocarlos donde querais.
He tenido bastantes problemas para usar este contenedor, ya que los objetos, al mover la barras de scroll, no me dejaba volverlos seleccionar.
Al final, Shordi, un compañero del foro de gambas-es.org, me dio la pista para resolverlo, usando las coordenadas absolutas de los objetos en vez de las coordenadas relativas. Gracias Shordi !!!
Os comento, los objetos tienen propiedades X, e Y, que son la posición con respecto al contendor que los contiene (son las llamadas coordenadas relativas). Ademas tienen las coordendas ScreenX, y ScreenY, que son las coordenadas respecto a nuestro escritorio (coordenadas absolutas).
El problema era que cuando se movia la vista del scrollview, las coordenadass relativas cambiaban, y el bucle que usaba para detectar los objetos cuando apretaba el boton del raton, no los encontraba.
Al final usando las coordenadas absolutas, pude resolver este problema.
Además, también tuve que añadir los eventos relacionados con la imagen de fondo y del propio scrollview, para que cuando se pulsara el boton (_MouseDown() y _MouseUp() ) , o se arrastrara ( _MouseMove() ), también se comprobara si la posición del ratón coincidía con la posición de algunos de los objetos.
Aqui os dejo parte del código que he usado, al final del articulo teneis el enlace de descarga del codigo completo.
-->
Public
Sub
Obs_MouseDown()
Print
"Evento
en Obs.....mousedoww"
capturaDown(Mouse.ScreenX,
Mouse.screeny)
End
Public
Sub
Obs_MouseUp()
Print
"Evento
en Obs....up"
capturaUp()
End
Public
Sub
obs_MouseMove()
Print
"Evento
en Obs...mousemove"
capturaMoviendo(Mouse.screenx,
Mouse.screeny)
End
'------------------------------------------------------------------------
'
up, down, y move
'------------------------------------------------------------------------
Public
Sub
capturaUp()
'suelta
el boton...
If
Not
IsNull(objetoCapturado)
Then
If
objetoCapturado.tipo
=
"Buenos"
Then
objetoCapturado.Picture
=
imagenBuenos
Else
If
objetoCapturado.tipo
=
"Malosfesor"
Then
objetoCapturado.Picture
=
imagenMalos
Endif
Endif
LabelCoordenada.x
=
objetoCapturado.x
LabelCoordenada.y
=
objetoCapturado.y
-
20
LabelCoordenada.text
=
"("
&
objetoCapturado.x
&
","
&
objetoCapturado.y
&
")"
LabelTextoPersona.Visible
=
False
LabelCoordenada.Visible
=
False
objetoCapturado =
Null
Endif
End
Public
Sub
capturaMoviendo(mousex As
Integer,
mousey As
Integer)
If
Not
IsNull(objetoCapturado)
Then
objetoCapturado.X
+=
(MouseX -
objetoCapturado.ScreenX)
/
escalafoto
objetoCapturado.y
+=
(Mousey -
objetoCapturado.ScreenY)
/
escalafoto
LabelTextoPersona.x
=
objetoCapturado.x
LabelTextoPersona.y
=
objetoCapturado.y
+
imagenMalos.h
/
escalafoto
LabelTextoPersona.Visible
=
True
LabelCoordenada.x
=
objetoCapturado.x
LabelCoordenada.y
=
objetoCapturado.y
-
20
LabelCoordenada.text
=
"("
&
objetoCapturado.x
&
","
&
objetoCapturado.y
&
")"
LabelCoordenada.Visible
=
True
Endif
End
Public
Sub
capturaDown(mouseScreenx As
Integer,
mouseScreeny As
Integer)
Dim
objtemp As
ClassMejorPictureBox
'busco
si algun array
For
Each
objtemp In arrayBox
Print
"
Objeto:", objtemp.screenX,
objtemp.screenY
Print
"
scrollX:", ScrollView1.Scrollx
If
(MousescreenX +
50)
>=
objtemp.screenX
And
objtemp.screenX
>=
(MousescreenX -
20)
Then
If
(MousescreenY -
20)
<=
objtemp.ScreenY
And
(MousescreenY +
50)
>=
objtemp.screenY
Then
objetoCapturado =
objtemp
If
objetoCapturado.tipo
=
"Buenos"
Then
objetoCapturado.Picture
=
imagenBuenosDes
LabelTextoPersona.text
=
objetoCapturado.Texto
LabelCoordenada.x
=
objetoCapturado.x
LabelCoordenada.y
=
objetoCapturado.y
-
20
LabelCoordenada.text
=
"("
&
objetoCapturado.x
&
","
&
objetoCapturado.y
&
")"
LabelCoordenada.Visible
=
True
Break
Else
If
objetoCapturado.tipo
=
"Malosfesor"
Then
objetoCapturado.Picture
=
imagenMalosDes
LabelTextoPersona.text
=
objetoCapturado.Texto
LabelCoordenada.x
=
objetoCapturado.x
LabelCoordenada.y
=
objetoCapturado.y
-
20
LabelCoordenada.text
=
"("
&
objetoCapturado.x
&
","
&
objetoCapturado.y
&
")"
LabelCoordenada.Visible
=
True
Break
Endif
Endif
Break
Endif
Endif
Next
End
Enlace de descarga del ejemplo completo: https://www.box.com/s/if3jjqbom2bysvas10lx
Nota:
La descarga es gratuita, solo teneis que ver los anuncios, esperar 5 segundos y pulsar sobre el botón superior derecho que os sale despues de la cuenta atrás.