Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: _Grey en 16 de Julio de 2005, 05:09:03 PM

Título: Capturar El Movimiento Del Raton Con Win32 Api
Publicado por: _Grey en 16 de Julio de 2005, 05:09:03 PM
 Estoy usando los mensajes de windows para controlar el desplazamiento del raton (WM_MOUSEMOVE, y los de pulsaciones de botonts).

Pero con estos lo que realmente consigo es obtener la posicion del cursor en pantalla, se puede obtener el "desplazamiento" de este en lugar de su posicion en ventana como lo tengo ahora?? con win32API nada de DirectX.

gracias.

Saludos.
Título: Capturar El Movimiento Del Raton Con Win32 Api
Publicado por: ajmendoza en 16 de Julio de 2005, 05:15:06 PM
 Seguramente me confundo, pero en winapi (he programado taaaan poco con esto) la posicion del raton no se conseguia con el parametro lparam?

WORD Posicionx  = LOWORD(lParam); //---> Posicion Horizontal
WORD Posiciony = HIWORD(lParam);   //---> Posicion Vertical

Para calcular el desplazamiento, supongo que solo tendrás que restar.  
Título: Capturar El Movimiento Del Raton Con Win32 Api
Publicado por: BeRSeRKeR en 16 de Julio de 2005, 05:16:52 PM
 Que yo recuerde no existe ningún mensaje que te devuelva el incremento de la posición del ratón (supongo que a eso te refieres con lo de desplazamiento) por lo que tendrás que calcularlo tú mismo.

Saludos.
Título: Capturar El Movimiento Del Raton Con Win32 Api
Publicado por: vincent en 16 de Julio de 2005, 05:19:08 PM
 La WinAPI sólo te devuelve las posiciones absolutas. También las puedes capturar con la siguiente función:

POINT Coordenadas;
GetCursorPos(&Coordenadas);
Título: Capturar El Movimiento Del Raton Con Win32 Api
Publicado por: Pogacha en 16 de Julio de 2005, 05:26:53 PM
 He! vamos que es un delta nada mas!

static int dx, dy; // EDIT: Esto es lo que buscas
static int Posicion_Actualx, Posicion_Actualy; // esta la agarras como dijo vincent
static int Ultima_Posicionx, Ultima_Posiciony; // al incializar arreglar para que valgan posicion_actual

void mouse_update(void) // invokesela cada vez que quieras updatar las dx y dy
{
  POINT p;
  GetCursorPos(&P);
  Posicion_Actulalx= P.x;
  Posicion_Actulaly= P.y; // no recuerdo si estos eran los miembros.
   dx= Posicion_Actualx - Ultima_Posicionx;
   dy= Posicion_Actualy - Ultima_Posiciony;
  Centrar_Mouse(); // no me acuerdo pero es facil.
  Ultima_Posicionx = Posicion_Actualx;
  Ultima_Posiciony = Posicion_Actualy;
}



A no ser que lo que quieras es trabajar sin centrar el raton en ningun momento, donde puede haber problemas con los bordes da la pantalla, pues si hay un desplazamiento contra el borde windows lo recorta. Esto no se como se hace.

Saludos.
Título: Capturar El Movimiento Del Raton Con Win32 Api
Publicado por: _Grey en 16 de Julio de 2005, 05:39:28 PM
 es exactamente lo que dice BeRSeRKeR.

Ya se me paso por la cabeza esta otra posibilidad, pero me extrañaba que con win32API no se pudiera.

Bueno entonces para capturar siempre el desplazamiento del raton deberia reposicionar con SetCursorPos() en el centro del area cliente de la ventana, y aqui me surge otro problemilla.... ;

Con GetClientRect() obtengo las coordenadas de un area cliente de una ventana, pero estas son relativas a la ventana; es decir solo consigo altura y ancho.

Con GetWindowRect() saco las coordenadas de la zona de la ventana pero como esta tiene barra de titulo y bordes......

Hay alguna manera de deducir la posicion en pantalla del area cliente de una ventana?
Título: Capturar El Movimiento Del Raton Con Win32 Api
Publicado por: BeRSeRKeR en 16 de Julio de 2005, 06:01:37 PM
 Para pasar las coordenadas de ventana a coordenadas de pantalla tienes que utilizar la función:

BOOL ClientToScreen(
 HWND hWnd,       // handle to window
 LPPOINT lpPoint  // screen coordinates
);


Supongo que te refieres a eso...

Saludos.
Título: Capturar El Movimiento Del Raton Con Win32 Api
Publicado por: _Grey en 16 de Julio de 2005, 06:08:29 PM
 Pues si bastaria con pasarle 0,0 para obtener la posicion del area cliente en coordenadas de pantalla.

Muchas gracias, es era funcion completamente desconocida para mi.

Saludos.