Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Drácula en 01 de Enero de 1970, 01:00:00 AM

Título: Como hacer que el ratón...
Publicado por: Drácula en 01 de Enero de 1970, 01:00:00 AM
                                Vereis, quiero que cuando el ratón llegue a los bordes de la ventana, vuelva a posicionarse en el otro borde . Por ejemplo, muevo el ratón a la derecha, y cuando llego al borde, quiero que aparezca por la izquierda.

Lo necesito porque cuando llego al final de la pantalla ya no puedes mover más el ratón hacia ese lado y claro...¡sería conveniente en los juegos que esto se hiciera!

Sé que con DirectInput no hay problemas, pero prefiero no utilizarlo para que el debug sea mucho más cómodo.

(por favor, én este post preferiría un poco de código en lugar de teoría)

Gracias                                
Título: Como hacer que el ratón...
Publicado por: Lord Trancos en 01 de Enero de 1970, 01:00:00 AM
                                Wenoooo,... tienes un mensaje de windows que te dice cuando el ratón ha sido movido : WM_MOUSEMOVE y las coordenadas en las que se encuentra;



WM_MOUSEMOVE



fwKeys = wParam;        // key flags

xPos = LOWORD(lParam);  // horizontal position of cursor

yPos = HIWORD(lParam);  // vertical position of cursor



...peroooo ese mensaje no lo recibiras si el raton sale de tu ventana... pero (como no...) para eso tienes otro mensaje:



The WM_CAPTURECHANGED message is sent to the window that is losing the mouse capture.



Entre esos dos mensajes, y las funciones del API: SetCursorPos y GetCursorPos, no deberias de tener problemas para hacer lo que quieres...

...siento no postearte código, pero seguro que no te hace falta. :ojo:                                
Título: Como hacer que el ratón...
Publicado por: fiero en 01 de Enero de 1970, 01:00:00 AM
                                Hola,
Lo que quiere Dracula no se puede resolver con la posición actual del cursor, con los mensajes WM_MOUSEMOVE, etc...

Si por ejemplo estamos en una pantalla de 800x600 y tenemos el ratón en la posición 799,400 (o sea a la derecha del todo) y en ese momento movemos el ratón a la derecha, el cursor no se va a mover ya que está en el límite de pantalla, sin embargo queremos detectar ese caso para situar el cursor en la posición 0+DESPLAZAMIENTOX,400 de la pantalla. Movimiento tipo 3DMAX cuando giras o mueves objetos.

Los mensajes WM_MOUSEMOVE no se activan, ya que el cursor no se ha movido, hay que detectar el movimiento antes de eso, o inventarse algun truquillo...

saludos                                
Título: Como hacer que el ratón...
Publicado por: fiero en 01 de Enero de 1970, 01:00:00 AM
                                Hola,
Bueno, al final siempre resulta que hay una solución facil, esto puesto en tu bucle principal de animación funciona bastante bien:

   

   POINT pos;
   
int moverCursor=0,xPantalla=1024,yPantalla=768;
   GetCursorPos(&pos);
   
if(pos.x==xPantalla-1)
   {
       pos.x=1;
       moverCursor=1;
   }
   
else if(pos.x==0)
   {
       pos.x=xPantalla-2;
       moverCursor=1;
   }
   
if(pos.y==yPantalla-1)
   {
       pos.y=1;
       moverCursor=1;
   }
   
else if(pos.y==0)
   {
       pos.y=yPantalla-2;
       moverCursor=1;
   }
   
if(moverCursor) SetCursorPos(pos.x,pos.y);



un saludo                                
Título: Como hacer que el ratón...
Publicado por: BeRSeRKeR en 01 de Enero de 1970, 01:00:00 AM
                                Existen unas funciones que pueden servirte y son SetCapture y ReleaseCapture. Lo que haces con SetCapture es que asocias el cursor con tu ventana y aunque te salgas de los bordes de ésta, el ratón seguirá enviando mensajes a tu ventana. Ahora bien, si haces click fuera de la ventana, perderas dicha asociación. Con ReleaseCapture pues rompes la asociación...

Un saludo
                               
Título: Como hacer que el ratón...
Publicado por: Drácula en 01 de Enero de 1970, 01:00:00 AM
                                Gracias a todos. La solución de fiero me parece que es la que yo necesito, por las necesidades que tengo.                                
Título: Como hacer que el ratón...
Publicado por: Ithaqua en 01 de Enero de 1970, 01:00:00 AM
                                El SetCursorPos no generará otro WM_MOUSEMOVE?
                               
Título: Como hacer que el ratón...
Publicado por: fiero en 01 de Enero de 1970, 01:00:00 AM
                                Hola Ithaqua,
el SetCursorPos sí genera un mensaje WM_MOUSEMOVE, pero aunque se ponga este código en respuesta a ese mensaje, la segunda llamada no cumple ninguna condición para que se vuelva a llamar a SetCursorPos, por lo que no hay riesgo de bucle infinito.

un saludo                                
Título: Como hacer que el ratón...
Publicado por: Ithaqua en 01 de Enero de 1970, 01:00:00 AM
                                Me refería a la hora de hallar los deltas del cursor. Para filtrar los WM_MOUSEMOVE que son generados con SetCursorPos()

                               
Título: Como hacer que el ratón...
Publicado por: fiero en 01 de Enero de 1970, 01:00:00 AM
                                bueno, perdonar que suba otra vez este post. Estoy haciendo un minieditor y he metido el código de ahí arriba a la hora de girar y mover los objetos. Aquí esta el código completo que he usado, modificando los deltas como bien dice Ithaqua...por si alguien que esté aprendiendo le pueda servir...

   

void CEditor::OnMouseMove(UINT nFlags, CPoint point)
{
   POINT pos;
   
int moverCursor=0;
   GetCursorPos(&pos);
   
if(pos.x==m_visor.m_xPantalla-1)
   {
       m_pointAnterior.x=m_pointAnterior.y-pos.x;
       pos.x=1;
       moverCursor=1;
   }
   
else if(pos.x==0)
   {
       pos.x=m_visor.m_xPantalla-2;
       m_pointAnterior.x=pos.x+m_pointAnterior.x;
       moverCursor=1;
   }
   
if(pos.y==m_visor.m_yPantalla-1)
   {
       m_pointAnterior.y=m_pointAnterior.y-pos.y;
       pos.y=1;
       moverCursor=1;
   }
   
else if(pos.y==0)
   {
       pos.y=m_visor.m_yPantalla-2;
       m_pointAnterior.y=pos.y+m_pointAnterior.y;
       moverCursor=1;
   }
   
if(moverCursor)
   {
       SetCursorPos(pos.x,pos.y);
       
return;
   }
   
   
//...

   m_pointAnterior = point;



un saludo

[ Este Mensaje fue editado por: fiero el 2002-05-10 19:58 ]