MOUSEMOVE ??

22/04/2007 - 15:46 por Orfao | Informe spam
Hola a todos..
Tengo un commandbuttom incrustado en en la hoja1
cuando el cursor esta sobre el boton cambia la propiedad picture del mismo
eso lo hago a travez del metodo mousemove del control
la pregunta es como detectar cuando muevo el cursor fuera del contrrol para
poder volver a cambiar el picture a su estado original.
Como detecto la ubicacion del cursor sobre una celda determinada ?
hay alguna forma o manera de lograr esa informacion ?
como detectar el movimiento del mouse sobre una hoja ?
Gracias por cualquier respuesta...

Me alimento del conocimiento de todos

Preguntas similare

Leer las respuestas

#6 Orfao
23/04/2007 - 04:42 | Informe spam
Mis disculpas Miguel
en verdad si lei los ptos 1,2 y 3
pero como tu bien dices podrian haber otras opciones
me preguntaba si al igual que tu sugieres que seleccione la celda D3 para
salir del bucle pudiera igualmente desactivarlo valiendome del valor de un
'flag' (variable) y asi detener o reanudar el DoEvents solo cuando este sobre
el boton y al finalizar cualquier otra macro asociada al boton y luego
reactivarlo cuando se coloque nuevamente sobre este.

P.D. Se que puedes hacerlo...

l
Me alimento del conocimiento de todos


"Héctor Miguel" wrote:

hola, moises !

> el procedimiento PosicionDelCursor solo deberia activarse cuando este sobre el boton para saber exactamente cuando sale de el
> una vez fuera del boton no necesito conocer su ubicacion solo que esta afuera
> y justo cuando me vuelvo a colocar sobre el boton comienza de nuevo el procedimiento a ver cuando sale.
> por otro lado, al hacer click sobre el boton debera ejecutar la macro que le haya asignado
> pero no sin antes interrumpir el procedimiento PosicionDelCursor y luego activarlo al finalizar la macro.
> me explique?

[creo que solo 'viste' el codigo con el ejemplo, pero te saltaste los comentarios de los puntos 1, 2 y 3] -???- [me re-explico]...

para estar en condiciones de 'detectar' [y exactamente] 'cuando'... el puntero se anda paseando [o no]... 'sobre' el boton...

op1: o mantienes un codigo en 'ejecucion constante y repetitiva'... [como la API]...

-> [te sugiero]... re-lee y analiza los comentarios de los puntos 1, 2 y 3 del mensaje anterior... ya que 'tal como lo solicitas'...
o utilizas esta opcion [con el consecuente consumo/desgaste/... de los recursos por la utilizacion de la instruccion 'DoEvents']
o nos vamos a seguir probando con la siguiente opcion:

op2: o dependes del evento '_mousemove' para detectar la entrada/salida del puntero por las coordenadas del boton [es decir]...
te 'sujetas' a las condiciones de 'rapidez' para que el evento '_mousemove' pueda establecer las coordenadas del puntero

es probable que existan mas alternativas, solo te recuerdo que mientras no puedas aprovechar los eventos 'naturales' de los objetos...
necesitaras recurrir a las API's, y estas 'necesitan' ser [re}activadas/llamadas/puestas en marcha/... por 'algo/alguien/de algun modo/...

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.



Respuesta Responder a este mensaje
#7 Héctor Miguel
23/04/2007 - 20:34 | Informe spam
hola, moises !

... si lei los ptos 1,2 y 3 > pero como tu bien dices podrian haber otras opciones
me preguntaba si al igual que tu sugieres que seleccione la celda D3 para salir del bucle
pudiera igualmente desactivarlo valiendome del valor de un 'flag' (variable)
y asi detener o reanudar el DoEvents solo cuando este sobre el boton
y al finalizar cualquier otra macro asociada... reactivarlo cuando se coloque nuevamente sobre este...



[probablemente] si 'le cambiamos la optica' a...
-> las opciones/alternativas/medios/metodos/... disponibles a vba...
-> para 'detectar' por donde se anda 'paseando' el puntero son [hasta donde se]...

a) utilizar eventos 'naturales' como el '_mousemove' de formularios y controles de formularios incrustados en hojas...
b) llamar a la API [GetCursorPos] para aquellos objetos que NO tienen 'medios naturales' para hacer la 'deteccion'
-> aqui 'entran' objetos como libros, hojas, rangos, etc. :-((

[como ya lo comprobaste]...
1) la opcion con el evento '_mousemove' tiene el 'inconveniente' de la 'rapidez' [de paso del puntero] sobre el objeto
-> este evento NO necesita el 'DoEvents' puesto que el mismo puede detectar cuando el puntero anda sobre el objeto

2) la opcion de la API tiene el 'inconveniente' de que necesita 'obligadamente'...
a) acciones del usuario para lanzar/repetir/mantener/suspender/re-activar/...la llamada a la API o...
b) un codigo en constante ejecucion [con el consabido desgaste/abuso/consumo/... de los recursos por el 'DoEvents']
-> esto es mandatorio, cuando el puntero ande sobre objetos que NO detectan su paso sobre ellos [libros/hojas/rangos/...]

si vuelves a analizar 'lo que pides'... con lo que existe 'disponible' :))
comentas 'por donde le damos' ?

saludos,
hector.
Respuesta Responder a este mensaje
#8 Orfao
24/04/2007 - 01:46 | Informe spam
Hola Miguel,
Tal vez quisiera algo asi como esto o parecido ¿Podria ser?

una vez el el procedimiento mousemove se cambia la imagen y se ejecuta el
posiciondelcursor
y este al encontrar las cordenadas fuera del boton cambiaria nuevamente la
imagen y se desactiva el doevents "Sale del procedimiento"
¿esto haria retomar el codigo restante del procedimiento mousemove, o ya por
el simple hecho de estar fuera del boton no terminaria de ejecutarse ?
Es una idea, que tal ves pueda desrrollarse, Me das tu opinion al respecto ?
Gracias

sub commandbuttom1.mousemove()
commandutton.picture=imagen1
flag=true
PosicionDelCursor
end sub


Sub PosicionDelCursor()
Dim PosicionActual As Puntero
Do Until flag
GetCursorPos PosicionActual
x = ActiveWindow.PointsToScreenPixelsX(PosicionActual.X)
y = ActiveWindow.PointsToScreenPixelsY(PosicionActual.Y)
' if x fuera del boton o x fuera del boton then flag=false :
commandbuttom1.picture=imagen2
DoEvents
Loop
End Sub ' Retorna al mousemove? o no?
alguna forma o manera de programar algo similar a esta idea?

GRACIASSSSS...

Me alimento del conocimiento de todos


"Héctor Miguel" wrote:

hola, moises !

> ... si lei los ptos 1,2 y 3 > pero como tu bien dices podrian haber otras opciones
> me preguntaba si al igual que tu sugieres que seleccione la celda D3 para salir del bucle
> pudiera igualmente desactivarlo valiendome del valor de un 'flag' (variable)
> y asi detener o reanudar el DoEvents solo cuando este sobre el boton
> y al finalizar cualquier otra macro asociada... reactivarlo cuando se coloque nuevamente sobre este...

[probablemente] si 'le cambiamos la optica' a...
-> las opciones/alternativas/medios/metodos/... disponibles a vba...
-> para 'detectar' por donde se anda 'paseando' el puntero son [hasta donde se]...

a) utilizar eventos 'naturales' como el '_mousemove' de formularios y controles de formularios incrustados en hojas...
b) llamar a la API [GetCursorPos] para aquellos objetos que NO tienen 'medios naturales' para hacer la 'deteccion'
-> aqui 'entran' objetos como libros, hojas, rangos, etc. :-((

[como ya lo comprobaste]...
1) la opcion con el evento '_mousemove' tiene el 'inconveniente' de la 'rapidez' [de paso del puntero] sobre el objeto
-> este evento NO necesita el 'DoEvents' puesto que el mismo puede detectar cuando el puntero anda sobre el objeto

2) la opcion de la API tiene el 'inconveniente' de que necesita 'obligadamente'...
a) acciones del usuario para lanzar/repetir/mantener/suspender/re-activar/...la llamada a la API o...
b) un codigo en constante ejecucion [con el consabido desgaste/abuso/consumo/... de los recursos por el 'DoEvents']
-> esto es mandatorio, cuando el puntero ande sobre objetos que NO detectan su paso sobre ellos [libros/hojas/rangos/...]

si vuelves a analizar 'lo que pides'... con lo que existe 'disponible' :))
comentas 'por donde le damos' ?

saludos,
hector.



Respuesta Responder a este mensaje
#9 Héctor Miguel
24/04/2007 - 10:25 | Informe spam
hola, moises !

1) del desarrollo que solicitas, te expongo [lo que creo] en ejemplo +/- 'acercado' a tu idea al final del presente ;)

2) al 'mezclar' la API [GetCursorPos] con el evento del control [_MouseMove] surge una 'interferencia' [conflicto de jerarquias ?]
si antes era inconveniente la rapidez al pasear el puntero sobre el control... ahora el inconveniente es si el paseo es 'lento' :-((
el 'DoEvents' [necesario ahora solo cuando el puntero anda sobre el control] ocasiona una ejecucion constante del 'MouseMove'
la 'razon' ?... [supongo que] al 'detenerse' el paseo sobre el control [o pasearlo lento sobre el mismo]...
-> la API [GetCursorPos] devuelve coordenadas en ceros, con lo que el 'flag' se vuelve 'false' y el evento se dispara de nuevo
lo que indudablemente ocasionaria tambien la tambien constante repeticion del codigo que necesites ejecutar 'en el inter' :-((

3) a lo anterior... deberas agregar que las coordenadas del area usable de la aplicacion (0,0) 'dependen' de los objetos graficos mostrados
[p.e.] si hay barras de menus/herramientas 'estacionadas', si esta visible la barra de formulas, si se esta en modo de pantalla completa...
ademas de que los puntos de documento equivalen +/- a 72 ppp, y las coordenadas 'de pantalla' son generalmente en pixeles [96 ppp]
por lo que se requiere de una conversion multiplicando las coordenadas por 1.3333333... [96/72] o dividirlas por 0.75 [1/1.3333333...]

sigue el ejemplo [obviamente] en el modulo de codigo de la hoja donde esta incrustado el commandbutton
-> quita la marca de comentario a la linea con el MsgBox para que 'aprecies' el efecto de repeticiones del evento '_mousemove' :D

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

Private Declare Function GetCursorPos _
Lib "user32" (lpPoint As Puntero) As Long
Private Type Puntero
X As Long: Y As Long
End Type
Dim bLeft As Single, bRight As Single, _
bTop As Single, bBottom As Single, _
EnObjeto As Boolean, On_toy As Puntero
Private Sub CommandButton1_MouseMove( _
ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
If EnObjeto Then GoTo Sigue
' MsgBox "Iniciando acciones..."
With CommandButton1
bLeft = .Left: bRight = .Left + .Width
bTop = .Top: bBottom = .Top + .Height
With ActiveWindow
bLeft = .PointsToScreenPixelsX(bLeft) / 0.75
bRight = .PointsToScreenPixelsX(bRight) / 0.75
bTop = .PointsToScreenPixelsY(bTop) / 0.75
bBottom = .PointsToScreenPixelsY(bBottom) / 0.75
End With
.BackColor = &H80FF&
EnObjeto = True
End With
Sigue:
PosicionDelCursor
End Sub
Private Sub PosicionDelCursor()
Do While EnObjeto
GetCursorPos On_toy
EnObjeto = (On_toy.X > bLeft And On_toy.X < bRight _
And On_toy.Y > bTop And On_toy.Y < bBottom)
[d8] = "Puntos X: " & On_toy.X
[d9] = "Puntos Y: " & On_toy.Y
DoEvents
Loop
CommandButton1.BackColor = &H8000000F
End Sub

__ la consulta original __
Tal vez quisiera algo asi como esto o parecido Podria ser?
una vez en el procedimiento mousemove se cambia la imagen y se ejecuta el posiciondelcursor
y este al encontrar las cordenadas fuera del boton cambiaria nuevamente la imagen y se desactiva el doevents "Sale del procedimiento"
esto haria retomar el codigo restante del procedimiento mousemove
o ya por el simple hecho de estar fuera del boton no terminaria de ejecutarse ?
Es una idea, que tal ves pueda desrrollarse, Me das tu opinion al respecto ?
sub commandbuttom1.mousemove()
commandutton.picture=imagen1
flag=true
PosicionDelCursor
end sub
Sub PosicionDelCursor()
Dim PosicionActual As Puntero
Do Until flag
GetCursorPos PosicionActual
x = ActiveWindow.PointsToScreenPixelsX(PosicionActual.X)
y = ActiveWindow.PointsToScreenPixelsY(PosicionActual.Y)
' if x fuera del boton o x fuera del boton then flag=false :
commandbuttom1.picture=imagen2
DoEvents
Loop
End Sub ' Retorna al mousemove? o no?
alguna forma o manera de programar algo similar a esta idea?
Respuesta Responder a este mensaje
#10 Orfao
26/04/2007 - 03:36 | Informe spam
Hola Miguel.
Estoy AGRADECIDISIMO...
funciono a las mil maravillas
justo lo que andaba buscando.
Me tarde un poco en agradecertelo porque estaba probando el codigo
que inicialmente titilaba cuando se instalaba el cursor sobre el boton pero...
probando y probando y probando conclui que el problema se presentaba gracias
a que no habias considerado el marco de la hoja "los titulos", "barras de
erramientas",Etc. Luego al quitar todas las barras superiores y los
encabezados de filas y columnas y , seleccionar ver a pantalla completa ...
entonces si funciona perfectamente..y ya no titila... eres sencillamente
Genial...de nuevo GRACIAS.

Me alimento del conocimiento de todos


"Héctor Miguel" wrote:

hola, moises !

1) del desarrollo que solicitas, te expongo [lo que creo] en ejemplo +/- 'acercado' a tu idea al final del presente ;)

2) al 'mezclar' la API [GetCursorPos] con el evento del control [_MouseMove] surge una 'interferencia' [conflicto de jerarquias ?]
si antes era inconveniente la rapidez al pasear el puntero sobre el control... ahora el inconveniente es si el paseo es 'lento' :-((
el 'DoEvents' [necesario ahora solo cuando el puntero anda sobre el control] ocasiona una ejecucion constante del 'MouseMove'
la 'razon' ?... [supongo que] al 'detenerse' el paseo sobre el control [o pasearlo lento sobre el mismo]...
-> la API [GetCursorPos] devuelve coordenadas en ceros, con lo que el 'flag' se vuelve 'false' y el evento se dispara de nuevo
lo que indudablemente ocasionaria tambien la tambien constante repeticion del codigo que necesites ejecutar 'en el inter' :-((

3) a lo anterior... deberas agregar que las coordenadas del area usable de la aplicacion (0,0) 'dependen' de los objetos graficos mostrados
[p.e.] si hay barras de menus/herramientas 'estacionadas', si esta visible la barra de formulas, si se esta en modo de pantalla completa...
ademas de que los puntos de documento equivalen +/- a 72 ppp, y las coordenadas 'de pantalla' son generalmente en pixeles [96 ppp]
por lo que se requiere de una conversion multiplicando las coordenadas por 1.3333333... [96/72] o dividirlas por 0.75 [1/1.3333333...]

sigue el ejemplo [obviamente] en el modulo de codigo de la hoja donde esta incrustado el commandbutton
-> quita la marca de comentario a la linea con el MsgBox para que 'aprecies' el efecto de repeticiones del evento '_mousemove' :D

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

Private Declare Function GetCursorPos _
Lib "user32" (lpPoint As Puntero) As Long
Private Type Puntero
X As Long: Y As Long
End Type
Dim bLeft As Single, bRight As Single, _
bTop As Single, bBottom As Single, _
EnObjeto As Boolean, On_toy As Puntero
Private Sub CommandButton1_MouseMove( _
ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
If EnObjeto Then GoTo Sigue
' MsgBox "Iniciando acciones..."
With CommandButton1
bLeft = .Left: bRight = .Left + .Width
bTop = .Top: bBottom = .Top + .Height
With ActiveWindow
bLeft = .PointsToScreenPixelsX(bLeft) / 0.75
bRight = .PointsToScreenPixelsX(bRight) / 0.75
bTop = .PointsToScreenPixelsY(bTop) / 0.75
bBottom = .PointsToScreenPixelsY(bBottom) / 0.75
End With
.BackColor = &H80FF&
EnObjeto = True
End With
Sigue:
PosicionDelCursor
End Sub
Private Sub PosicionDelCursor()
Do While EnObjeto
GetCursorPos On_toy
EnObjeto = (On_toy.X > bLeft And On_toy.X < bRight _
And On_toy.Y > bTop And On_toy.Y < bBottom)
[d8] = "Puntos X: " & On_toy.X
[d9] = "Puntos Y: " & On_toy.Y
DoEvents
Loop
CommandButton1.BackColor = &H8000000F
End Sub

__ la consulta original __
> Tal vez quisiera algo asi como esto o parecido Podria ser?
> una vez en el procedimiento mousemove se cambia la imagen y se ejecuta el posiciondelcursor
> y este al encontrar las cordenadas fuera del boton cambiaria nuevamente la imagen y se desactiva el doevents "Sale del procedimiento"
> esto haria retomar el codigo restante del procedimiento mousemove
> o ya por el simple hecho de estar fuera del boton no terminaria de ejecutarse ?
> Es una idea, que tal ves pueda desrrollarse, Me das tu opinion al respecto ?
> sub commandbuttom1.mousemove()
> commandutton.picture=imagen1
> flag=true
> PosicionDelCursor
> end sub
> Sub PosicionDelCursor()
> Dim PosicionActual As Puntero
> Do Until flag
> GetCursorPos PosicionActual
> x = ActiveWindow.PointsToScreenPixelsX(PosicionActual.X)
> y = ActiveWindow.PointsToScreenPixelsY(PosicionActual.Y)
> ' if x fuera del boton o x fuera del boton then flag=false :
> commandbuttom1.picture=imagen2
> DoEvents
> Loop
> End Sub ' Retorna al mousemove? o no?
> alguna forma o manera de programar algo similar a esta idea?



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida