Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Uso de coordenadas para el cursor del ratón

Iniciado por Tarzan, 09 de Diciembre de 2007, 11:40:37 PM

« anterior - próximo »

Tarzan

Buenos días a todos/as,

Estoy tratando de implementar una clase Gestor de Coordenadas, para poder obtener la ubicación del cursor EN CUALQUIER MOMENTO de la ejecución de la aplicación y responder con un tratamiento u otro.

Utilizo Borland c++ 6.0 y me gustaría saber qué método utiliza para la gestión de eventos. En visual creo que se llamaba MsgProc o algo así.
Aquí he visto el método WinMain pero no veo el código de la función que controla los mensajes y eventos.

Me gustaría poder controlar y obtener las coordenadas del puntero en cualquier momento.
¿Alguien sabe cómo puedo hacerlo?

Gracias y saludos.

[EX3]

No recuerdo como trabajaba Borland C++ los eventos (trato de olvidar mi corta experiencia en este compilador) pero puedes optar por leer las coordenadas de pantalla a traves de la funcion GetCursorPos() de la API de Windows y mediante ScreenToClient() pasarlas a coordenadas de la ventana cliente de tu aplicacion.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Tarzan

Buenos días Ex3,

Esas funciones de las que hablas, en qué librerías están? y lo que es más importante, ¿Cual es la función que utiliza windows para capturar los eventos de forma periódica?.. Necesito llamar a esas funciones de las que hablas desde otra función que el sistema utilice cada vez que surge un evento. En Visual c++ creo que había una función, denominada MsgProc, que se llamaba de forma automática pero en Borland no sé como funciona realmente.

He optado en usar este entorno porque tienen unas herramientas muy buenas para colocar componentes windows en un formulario y generar el código básico... Lo malo, es que este tipo de funciones, como la MsgProc en Visual, me es completamente desconocida y no la encuentro.

[EX3]

Cita de: "Tarzan"Esas funciones de las que hablas, en qué librerías están?
Mira en los enlaces a las funciones en la MSDN que te puse, ahi tienes toda la informacion sobre dichas funciones y donde estan implementadas.

Sobre lo de leerlas periodicamente, usa el bucle principal del programa o el evento del movimiento del raton (no se como se llamara en Borland, usa el listado de eventos del editor de codigo) y usa las funciones que te puse para capturar la entrada del raton.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Tarzan

Ok Ex3,

He encontrado información sobre esas funciones y son justo lo que necesito. Pero también necesito encontrar la función que utiliza windows para el intercambio de mensajes de forma automática.

Creo recordar que en Visual c++, existe la función windowProcedure. Esta función recoge toda la información y eventos que el usuario introduce en la aplicación (movimiento de ratón, clicks, etc...) y es aquí donde tengo que escribir mi código

WM_MOUSEMOVE:

int pos = GetCursorPost();
if pos == ..... etc...

Pero no sé en Borlando como se llama esa función automática que captura los enventos (no sólo los del ratón sino de todo el sistema).
En la documentación he encontrado métodos como OnmouseMove, OnMouseClick...etc... pero estos métodos se llaman de forma automática cuando el ratón se sitúa sobre el componente en cuestión y no en cualquier momento... No sé si me explico bien. SOn métodos propios del control y yo necesito un método genérico de Windows como el WindowProcedure de Visual... pero para Borland




Saludos.

[EX3]

Cita de: "Tarzan"En la documentación he encontrado métodos como OnmouseMove, OnMouseClick...etc... pero estos métodos se llaman de forma automática cuando el ratón se sitúa sobre el componente en cuestión y no en cualquier momento... No sé si me explico bien.
Pues como el programa tendra su bucle principal que lo mantendra activo en ejecucion podrias llamar a dichas funciones al principio del bucle para tener los valores actualizados en cada instante, sin necesidad de jugar con eventos o mensajes del sistema. No toque demasiado a fondo el Borland Builder C++ y ni creo recordar haber trabajado la pila de mensajes del sistema, solo los eventos de formulario y controles, pero si me parece recordar que el bucle principal de la aplicacion si estaba a vista de codigo, y no oculto al programador como hace Visual Basic 6.0 o VB.NET con el marco de aplicacion activo, por lo que a falta de mas ayuda por mi parte, te recomendaria esto ultimo.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Tarzan

No hay forma!!

Llevo toda la semana probando cosas y no doy con la solución!!.
La función principal en Borland es así:

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
   try
   {
        Application->Initialize();
        Application->CreateForm(__classid(TvPrincipal), &vPrincipal);
        Application->Run();
   }
   catch (Exception &exception)
   {
        Application->ShowException(&exception);
   }
   catch (...)
   {
        try
        {
            throw Exception("");
        }
        catch (Exception &exception)
        {
            Application->ShowException(&exception);
        }
   }
   return 0;
}


El bucle principal de la aplicación está en el interior del método Run. Si escribo un ShowMessage después de este método no aparece...
Y los 2 métodos anteriores: Initialize y CreateForm son para iniciar la ventana con todos sus componentes (paneles, botones, etc)

No veo DÓNDE puedo introducir el tratamiento de las coordenadas o cualquier cosa que quiera escribir durante la ejecución del programa.


Si creo la ventana utilizando la API de Windows desde CERO, entonces sí que tengo un acceso total: Usando un WinMain propio, con su Dispatch de mensajes y su WindowProcedure para el tratamiento de eventos.
Pero si lo hago así, entonces pierdo la relación entre el Form y los compònentes visuales (paneles, botones, labels...) que Borland permite seleccionar y pegar en el Form sin escribir código...

¿Alguien sabe QUÉ puedo hacer?... Si creo una aplicación con Borland, aparece un Formulario en el que puedo pegar cualquier componente sin escribir código y tengo unas herramientas muy cómodas para crear aplicaciones windows pero pierdo control sobre el bucle principal y control de eventos o paso de mensajes...

De la otra forma, creo yo la ventana y controlo los mensajes pero no sé como relacionar esa ventana que he creado con el Formulario para poder usar las herramientas de pinchar y arrastrar componentes del Borland...

Por favor... algo de luz......


Saludos

[EX3]

Ya veo, no recordaba este estrecho parecido con Visual Basic 6.0.

Pues visto lo visto, haz como haria un programador de Visual Basic :P, coloca un control Timer a 1 milisegundo de intervalo y coloca en su evento el codigo para obtener las coordenadas del raton.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Tarzan

Es una solución que puede resultar muy buena [EX3].
La tendré en cuenta!!

De todas formas, me gustaría saber si se puede hacer lo siguiente:

Quisiera poder utilizar el Builder c++, crear una un Proyecto de Aplicación para usar las herramientas RAD (Añadir componentes visuales con pinchar y arrastrar) pero SUSTITUIR el código de generación de la ventana por uno WinMain PROPIO con su Dispatch y su WindowProcedure.

Es decir, enlazar el formulario que crea el Builder de forma interna con el WinMain que se suele utilizar de forma genérica en cualquier compilador de C++.

Debe haber una forma de enlazar el formulario con la clase ventana:

poner este código:

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hThisInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpszArgument,
                   int nFunsterStil)
{
   HWND hwnd;               /* Manipulador de ventana */
   MSG mensaje;             /* Mensajes recibidos por la aplicación */
   WNDCLASSEX wincl;        /* Estructura de datos para la clase de ventana */

   /* Estructura de la ventana */
   wincl.hInstance = hThisInstance;
   wincl.lpszClassName = "NUESTRA_CLASE";
   wincl.lpfnWndProc = WindowProcedure;      /* Esta función es invocada por Windows */
   wincl.style = CS_DBLCLKS;                 /* Captura los doble-clicks */
   wincl.cbSize = sizeof (WNDCLASSEX);

   /* Usar icono y puntero por defector */
   wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
   wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
   wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
   wincl.lpszMenuName = NULL;                 /* Sin menú */
   wincl.cbClsExtra = 0;                      /* Sin información adicional para la */
   wincl.cbWndExtra = 0;                      /* clase o la ventana */
   /* Usar el color de fondo por defecto para la ventana */
   wincl.hbrBackground = GetSysColorBrush(COLOR_BACKGROUND);

   /* Registrar la clase de ventana, si falla, salir del programa */
   if(!RegisterClassEx(&wincl)) return 0;

   /* La clase está registrada, crear la ventana */
   hwnd = CreateWindowEx(
          0,                   /* Posibilidades de variación */
          "NUESTRA_CLASE",     /* Nombre de la clase */
          "Ejemplo 001",       /* Texto del título */
          WS_OVERLAPPEDWINDOW, /* Tipo por defecto */
          CW_USEDEFAULT,       /* Windows decide la posición */
          CW_USEDEFAULT,       /* donde se coloca la ventana */
          544,                 /* Ancho */
          375,                 /* Alto en pixels */
          HWND_DESKTOP,        /* La ventana es hija del escritorio */
          NULL,                /* Sin menú */
          hThisInstance,       /* Manipulador de instancia */
          NULL                 /* No hay datos de creación de ventana */
   );
   
   /* Mostrar la ventana */
   ShowWindow(hwnd, SW_SHOWDEFAULT);
   
   /* Bucle de mensajes, se ejecuta hasta que haya error o GetMessage devuelva FALSE */
   while(TRUE == GetMessage(&mensaje, NULL, 0, 0))
   {
       /* Traducir mensajes de teclas virtuales a mensajes de caracteres */
       TranslateMessage(&mensaje);
       /* Enviar mensaje al procedimiento de ventana */
       DispatchMessage(&mensaje);
   }

   /* Salir con valor de retorno */
   return mensaje.wParam;
}


y enlazar el formulario.

En lugar de este:

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TvPrincipal), &vPrincipal);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}


¿Alguien lo ha hecho?

Gracias por todo.

Saludos.







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.