2009-02-08 14 views
6

In Windows quando si crea una finestra, è necessario definire una (C++)procedure di messaggi Window in Linux vs di Windows

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

per gestire tutti i messaggi inviati dal sistema operativo alla finestra, come pressione dei tasti e così via.

Sto cercando di fare qualche lettura su come funziona lo stesso sistema in Linux. Forse è perché sono un po 'corto sulla terminologia ma non riesco a trovare nulla su questo attraverso google (anche se sono sicuro che ci deve essere un sacco!).

  • È ancora una sola funzione C che gestisce tutte le comunicazioni?
  • La definizione della funzione differisce su diversi WM (Gnome, KDE) o viene gestita a un livello inferiore nel sistema operativo?

Edit: Ive guardò negli strumenti come QT e WxWidgets, ma quei quadri sembra essere orientato più verso lo sviluppo di estese applicazioni GUI. Sto piuttosto cercando un modo per creare una finestra di base (limitare ridimensionamento, bordi/decorazioni) per la mia grafica OGL e recuperare input su più di una piattaforma. E secondo la mia ricerca iniziale, questo tipo di funzione è l'unico modo per recuperare quell'input.

Quale sarebbe la migliore rotta? Leggere, imparare e quindi utilizzare QT o WxWidgets? O imparando come funzionano i sistemi e implementare quelle poche funzionalità di base che voglio io?

+0

Se hai bisogno di qualcosa di semplice puoi provare SDL http://www.libsdl.org/, che è una libreria multipiattaforma mirata allo sviluppo di giochi/applicazioni semplici. – Ismael

+2

Sto iniziando a capire che la domanda è molto ampia per avere una buona risposta. – Mizipzor

risposta

4

In linea di principio è assolutamente lo stesso. Tuttavia, non ha nulla a che fare con la comunicazione con il sistema operativo (né su win32, utilizzando user32.dll è del tutto opzionale)

Un'applicazione GUI ha un ciclo di eventi da qualche parte, che elabora i messaggi da una coda a un certo livello.

Esistono molte librerie in genere utilizzate per "nascondere" questo comportamento: è possibile utilizzarle (e in effetti, è necessario). Se non altro, il sistema di eventi Xlib è ancora più perverso di quello user32.dll di Win32, ed è meno capito, quindi meno persone lo usano direttamente.


In Linux o in Windows, le applicazioni possono utilizzare la GUI di basso livello o utilizzare una libreria. La maggior parte usa una biblioteca. Le applicazioni possono anche scegliere di non fare né funzionare senza una GUI (le applicazioni server in genere lo fanno). Le applicazioni possono creare più thread, uno dei quali si trova in un ciclo di eventi e altri funzionano diversamente. Anche questo è un approccio popolare.

  • La maggior parte delle applicazioni GUI utilizzare una libreria di più alto livello per la loro interfaccia grafica
  • applicazioni non interattive, per esempio applicazioni server, non utilizzare affatto la GUI e non utilizzare le librerie (es. XLib, user32.dll)
  • Le applicazioni che non si prestano ad un "ciclo di eventi" (ad es. thread per elaborare il loro ciclo degli eventi.
  • Queste cose sono ampiamente vere su Win32 e Linux.
+0

Bello, speravo in una risposta come questa. Sto scrivendo un gioco, quindi non ci sarà molta GUI o eventi di sistema. Ma se affermassi che il ciclo degli eventi è l'unico modo per recuperare l'input dell'utente, puoi provare che mi sbaglio? – Mizipzor

+0

I giochi hanno solitamente un thread separato per l'esecuzione del ciclo degli eventi da quello che esegue la logica di gioco: il thread della logica di gioco preleva in genere i dati in variabili condivise ecc. Dal thread di elaborazione degli eventi. Ci sono tuttavia altre possibilità. – MarkR

5

È totalmente e completamente diverso. La procedura di questa finestra è specifica al 100% per il sistema operativo Windows. Per Linux, dipenderà dal gestore delle finestre (gnome, kde - come hai già detto). Se desideri realizzare uno sviluppo multipiattaforma, potresti voler guardare a cose come il QT.

Si potrebbe desiderare di dare un'occhiata ai seguenti URL:

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

7

bene a livello molto di base si ha il protocollo X Window http://en.wikipedia.org/wiki/X_Window_System_core_protocol, che possiamo essere abbastanza complessa da gestire se vuoi fare qualsiasi applicazione. Accanto allo stack c'è Xlib http://en.wikipedia.org/wiki/Xlib che è un involucro "conveniente" attorno al protocollo X, ma è comunque complesso per le applicazioni "reali". È su Xlib che viene costruita la maggior parte degli altri framework, cercando di semplificare lo sviluppo delle applicazioni. I più conosciuti sono: Xt, Gtk, Qt, ecc.

Come nella finestra si ha un "ciclo di eventi" e, se lo si desidera, è possibile implementare su di esso una metafora GetMessage/DispachMessage per simulare il comportamento di Windows. In questo modo potresti avere un WNDPROC, ma nativamente X non fornisce questa funzionalità.

Prima di reinventare la ruota è preferibile dare un'occhiata a applicazioni simili, a cosa servono.

Se avete bisogno di qualcosa di semplice potete provare SDL http://www.libsdl.org/, che è una libreria multipiattaforma mirata allo sviluppo di giochi/applicazioni semplici. Un'altra alternativa è la libreria di giochi Allegro http://www.talula.demon.co.uk/allegro/.

+0

Potresti per favore elaborare questa ultima dichiarazione? Pensavo che WNDPROC fosse il ciclo degli eventi. E in quel ciclo, creando i miei eventi personali in modo che il resto dell'app non sappia su quale sistema operativo è in esecuzione qualcosa che stavo progettando. Quello che è chiamato un sistema di spedizione? – Mizipzor

+0

Windows ha un loop di messaggi http://msdn.microsoft.com/en-us/library/ms644928(VS.85).aspx. A volte questo è nascosto dal framework che stai usando, ad esempio MFC, .NET, ecc. – Ismael

+0

Per ogni thread hai una coda messaggi, dove i messaggi WM_XXX sono memorizzati quando vengono generati, il loop dei messaggi è responsabile di dare un'occhiata a questi messaggi e consegnare loro la finestra appropriata proc. – Ismael

2

Come indicato da xhantt, ciò che trasporta i messaggi equivalenti che si cercano è il sistema X Window. Che, in effetti, può essere un po 'complesso.

Con XLib è necessario gestire gli eventi di registrazione e rimozione dei cavi nel ciclo principale. Vedere lo XLib manual per una descrizione completa su come procedere. Ma non dimenticare che catturerai solo finestre e eventi in questo modo. Non tutti i messaggi del sistema operativo.

È anche possibile cercare XCB che è una libreria più recente e probabilmente più semplice.

Se si crea l'applicazione sopra queste due librerie, verrà eseguita correttamente (quasi, non si può mai essere troppo sicuri) ogni WM. E non avrai bisogno di alcuna dipendenza che la maggior parte degli utenti Linux non abbia già nella loro installazione. Se vai con Qt, GTK, ecc ... Sarà più semplice e funzionerà con qualsiasi WM, ma potrebbe non avere la libreria installata.

+0

La finestra e gli eventi di input sono sufficienti. Come detto, voglio solo una finestra per disegnare alcuni OGL e ascoltare input, per un gioco semplice.Grazie per il link a XCB, Ill lo vedo. – Mizipzor