2009-02-08 9 views
6

En Windows Cuando se crea una ventana, debe definir un (C++)procedimientos de mensajes de ventana en Linux vs Ventanas

LRESULT CALLBACK message_proc(HWND Handle, UINT Message, WPARAM WParam, LPARAM LParam); 

para manejar todos los mensajes enviados desde el sistema operativo a la ventana, como las pulsaciones de teclas y tal.

Estoy buscando leer sobre cómo funciona el mismo sistema en Linux. Tal vez sea porque me quedo un poco corto con la terminología, pero no consigo encontrar nada en esto a través de Google (¡aunque estoy seguro de que debe haber suficiente!).

  • ¿Sigue siendo una sola función C la que maneja todas las comunicaciones?
  • ¿La definición de la función difiere en diferentes WM (Gnome, KDE) o se maneja en un nivel inferior en el sistema operativo?

Editar: Ive miró a herramientas como QT y WxWidgets, pero esos marcos parece estar más orientada hacia el desarrollo de extensas aplicaciones GUI. Más bien estoy buscando una forma de crear una ventana básica (restringir el tamaño, bordes/decoraciones) para mis gráficos OGL y recuperar datos en más de una plataforma. Y de acuerdo con mi investigación inicial, este tipo de función es la única forma de recuperar esa entrada.

¿Cuál sería la mejor ruta? Leyendo, aprendiendo y luego usar QT o WxWidgets? ¿O aprender cómo funcionan los sistemas e implementar esas pocas características básicas que quiero?

+0

Si necesita algo simple, puede probar SDL http://www.libsdl.org/, que es una biblioteca multiplataforma destinada a desarrollar juegos/aplicaciones simples. – Ismael

+2

Estoy empezando a darme cuenta de que la pregunta es demasiado amplia para que realmente tenga una buena respuesta. – Mizipzor

Respuesta

4

En principio, es absolutamente lo mismo. Sin embargo, no tiene nada que ver con la comunicación con el SO (ni en win32, el uso de user32.dll es completamente opcional)

Una aplicación GUI tiene un bucle de eventos en algún lugar, que procesa los mensajes de una cola en algún nivel.

Hay muchas bibliotecas normalmente utilizadas para "ocultar" este comportamiento; puede usarlas (y de hecho, debería hacerlo). En todo caso, el sistema de eventos de Xlib es incluso más perverso que el de user32.dll de Win32, y se lo entiende menos, por lo tanto, menos personas lo usan directamente.


En Linux o en Windows, las aplicaciones pueden usar la GUI de bajo nivel o pueden usar una biblioteca. La mayoría usa una biblioteca. Las aplicaciones también pueden optar por no hacer ninguna de las dos cosas y operar sin una GUI (las aplicaciones de servidor suelen hacer esto). Las aplicaciones pueden crear múltiples hilos, uno de los cuales se encuentra en un bucle de eventos, y otros funcionan de manera diferente. Este es un enfoque popular también.

  • La mayoría de las aplicaciones GUI utilizan una biblioteca de nivel superior para su interfaz gráfica de usuario
  • aplicaciones no interactivas, por ejemplo aplicaciones de servidor, no use la GUI en absoluto y no use las bibliotecas (por ejemplo, XLib, user32.dll)
  • Las aplicaciones que no se prestan a un "bucle de eventos" (por ejemplo, juegos) suelen utilizar un hilo para procesar su bucle de evento.
  • Estas cosas son en gran parte verdad en Win32 y Linux.
+0

Bien, esperaba una respuesta como esta. Estoy escribiendo un juego, por lo que no habrá mucha GUI o eventos del sistema. Pero si yo afirmo que el ciclo de eventos es la única manera de recuperar los datos del usuario, ¿puede probar que estoy equivocado? – Mizipzor

+0

Los juegos generalmente tienen un hilo separado para ejecutar el bucle de eventos desde el que ejecuta la lógica del juego: el hilo lógico del juego típicamente recoge datos en variables compartidas, etc. del hilo de procesamiento del evento. Sin embargo, hay otras posibilidades. – MarkR

5

Es totalmente y completamente diferente. Ese procedimiento de ventana es 100% específico para el sistema operativo Windows. Para Linux, dependerá del administrador de ventanas (gnome, kde - como ya lo mencionó). Si desea hacer un desarrollo multiplataforma, es posible que desee ver cosas como QT.

Es posible que desee echar un vistazo a las siguientes direcciones URL:

http://www.qtsoftware.com/products/appdev
http://en.wikipedia.org/wiki/Qt_toolkit

7

bien a nivel muy básico que tiene el protocolo X Window http://en.wikipedia.org/wiki/X_Window_System_core_protocol, que podemos estar bastante compleja de manejar si quieres hacer cualquier aplicación. El siguiente en la pila es Xlib http://en.wikipedia.org/wiki/Xlib que es un contenedor "conveniente" alrededor del protocolo X, pero aún es complejo para aplicaciones de "vida real". Está encima de Xlib que la mayoría de los otros marcos están construidos, tratando de simplificar el desarrollo de aplicaciones. Los más conocidos son: Xt, Gtk, Qt, etc.

Al igual que en la ventana tiene un "bucle de eventos", y si lo desea, puede implementar encima una metáfora GetMessage/DispachMessage para imitar el comportamiento de Windows. De esa manera, es posible que tengas un WNDPROC, pero nativamente X no proporciona tal cosa.

Antes de reinventar la rueda es preferible echar un vistazo a las aplicaciones similares, lo que están utilizando.

Si necesita algo simple, puede probar SDL http://www.libsdl.org/, que es una biblioteca multiplataforma destinada a desarrollar juegos/aplicaciones simples. Otra alternativa es la biblioteca de juegos Allegro http://www.talula.demon.co.uk/allegro/.

+0

¿Podría por favor elaborar esa última declaración? Pensé que el WNDPROC era el ciclo de eventos. Y en ese ciclo, crear mis propios eventos para que el resto de la aplicación no sepa en qué sistema operativo se ejecuta fue algo que estaba planeando. ¿Es eso lo que se llama un sistema de envío? – Mizipzor

+0

Windows tiene un bucle de mensaje http://msdn.microsoft.com/en-us/library/ms644928(VS.85).aspx. A veces esto está oculto por el marco que estás usando, es decir, MFC, .NET, etc. – Ismael

+0

Para cada hilo tienes una cola de mensajes, donde los mensajes WM_XXX se almacenan cuando se generan, el ciclo de mensajes es responsable de mirar estos mensajes y entregarles el procedimiento de ventana apropiado. – Ismael

2

Según lo expresado por xhantt, lo que transporta los mensajes equivalentes que está buscando es el sistema X Window. Lo cual, de hecho, puede ser un poco complejo.

Con XLib necesitará manejar los eventos que se registran y eliminan en su bucle principal. Consulte el XLib manual para obtener una descripción completa de cómo proceder. Pero no olvide que solo verá eventos de ventana e insumos de esta manera. No todos los mensajes del sistema operativo.

También puede buscar XCB que es una biblioteca más nueva y probablemente más sencilla.

Si construye su aplicación en la parte superior de esas dos bibliotecas, se ejecutará sin problemas bajo (casi, nunca podemos estar seguros) cada WM. Y no requerirá ninguna dependencia que la mayoría de los usuarios de linux aún no tengan en su instalación. Si usa Qt, GTK, etc ... Será más fácil y funcionará bajo cualquier WM, pero puede que no tenga la biblioteca instalada.

+0

Eventos de ventana y entrada son suficientes. Como dije, solo quiero una ventana para dibujar algunos OGL y escuchar la entrada, para un juego simple.Gracias por el enlace a XCB, lo buscaré. – Mizipzor

Cuestiones relacionadas