2009-02-08 7 views
6

W systemie Windows podczas tworzenia okna, należy zdefiniować (C++)procedury wiadomość okno w Linux vs systemu Windows

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

obsłużyć wszystkie wiadomości wysłane z systemu operacyjnego do okna, jak znakom i takie.

Chciałbym przeczytać, jak działa ten sam system w systemie Linux. Może dlatego, że trochę brakuje mi terminologii, ale nie uda mi się znaleźć niczego na ten temat przez Google (chociaż jestem pewien, że musi być ich mnóstwo!).

  • Czy to wciąż tylko jedna funkcja C, która obsługuje całą komunikację?
  • Czy definicja funkcji różni się w różnych WM (Gnome, KDE), czy jest obsługiwana na niższym poziomie w systemie operacyjnym?

Edit: Ive spojrzał narzędzi, takich jak QT i wxWidgets, ale te ramy wydaje się być bardziej ukierunkowana na rozwijanie GUI rozbudowane aplikacje. Raczej szukam sposobu na stworzenie podstawowego okna (ograniczenie rozmiaru, obramowanie/dekoracje) dla mojej grafiki OGL i pobieranie danych wejściowych na więcej niż jednej platformie. I według moich wstępnych badań, ten rodzaj funkcji jest jedynym sposobem na odzyskanie tego wejścia.

Jaka byłaby najlepsza trasa? Czytanie, uczenie się, a następnie używanie QT lub WxWidgets? Albo ucząc się, jak działają systemy i wdrażam te kilka podstawowych funkcji, które sam chcę?

+0

Jeśli potrzebujesz czegoś prostego, możesz wypróbować SDL http://www.libsdl.org/, która jest biblioteką między platformami, której celem jest tworzenie gier/prostych aplikacji. – Ismael

+2

Zaczynam rozumieć, że pytanie jest na tyle szerokie, aby rzeczywiście mieć dobrą odpowiedź. – Mizipzor

Odpowiedz

4

Co do zasady jest to absolutnie to samo. Nie ma to jednak nic wspólnego z komunikacją z systemem operacyjnym (ani nie na win32, użycie user32.dll jest całkowicie opcjonalne)

Aplikacja GUI ma gdzieś pętlę zdarzeń, która przetwarza wiadomości z kolejki na pewnym poziomie.

Istnieje wiele bibliotek używanych zazwyczaj do "ukrywania" tego zachowania - możesz z nich korzystać (a nawet powinieneś). Jeśli tak, system zdarzeń Xlib jest jeszcze bardziej perwersyjny niż system Win32 user.dll, i jest mniej powszechnie rozumiany, dlatego mniej osób korzysta z niego bezpośrednio.


W systemach Linux lub Windows aplikacje mogą korzystać z GUI niskiego poziomu lub mogą korzystać z biblioteki. Większość korzysta z biblioteki. Aplikacje mogą także nie wykonywać żadnej z nich i działać bez GUI (zazwyczaj aplikacje serwera to robią). Aplikacje mogą tworzyć wiele wątków, z których jeden znajduje się w pętli zdarzeń, a inne działają inaczej. To także popularne podejście.

  • Większość aplikacji GUI użyć biblioteki wyższy poziom ich GUI
  • dla interaktywnych aplikacji, na przykład aplikacje serwerowe, w ogóle nie korzystaj z GUI i nie korzystaj z bibliotek (np. XLib, user32.dll).
  • Aplikacje, które nie nadają się do "Pętli zdarzeń" (np. Gry), zwykle używają oddzielnych wątek do przetworzenia ich pętli zdarzeń.
  • Te rzeczy są w dużej mierze prawdziwe na Win32 i Linux.
+0

Miło, miałem nadzieję na taką odpowiedź. Piszę grę, więc nie będzie dużo GUI ani zdarzeń systemowych. Ale jeśli mogę twierdzić, że pętla zdarzeń jest jedynym sposobem na pobranie danych wejściowych od użytkownika, czy możesz udowodnić, że się mylę? – Mizipzor

+0

Gry mają zwykle osobny wątek do uruchamiania pętli zdarzeń od tej, która uruchamia logikę gry - wątek logiki gry zwykle zbiera dane we wspólnych zmiennych itp. Z wątku przetwarzania zdarzeń. Są jednak inne możliwości. – MarkR

5

Jest całkowicie i całkowicie odmienny. Ta procedura okna jest w 100% specyficzna dla systemu operacyjnego Windows. W przypadku Linuksa będzie to zależeć od menedżera okien (gnome, kde - jak już wspomniano). Jeśli chcesz tworzyć wiele platform, możesz spojrzeć na takie rzeczy jak QT.

Możesz chcieć przyjrzeć się następującymi adresami:

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

7

Dobrze na bardzo podstawowym poziomie masz protokół X Window http://en.wikipedia.org/wiki/X_Window_System_core_protocol, której możemy być dość skomplikowane w obsłudze jeśli chcesz zrobić jakąkolwiek aplikację. Dalej na stosie znajduje się Xlib http://en.wikipedia.org/wiki/Xlib, który jest "wygodnym" opakowaniem dla protokołu X, ale nadal jest skomplikowany dla aplikacji "prawdziwego życia". Na szczycie Xlib powstaje większość innych frameworków, próbujących uprościć tworzenie aplikacji. Najbardziej znane to: Xt, Gtk, Qt itp.

Podobnie jak w oknie masz "pętlę zdarzeń", a jeśli chcesz, możesz zaimplementować na niej metaforę GetMessage/DispachMessage, aby naśladować zachowanie Windows. W ten sposób możesz mieć WNDPROC, ale natywnie X tego nie zapewnia.

Przed ponownym wynalezieniem koła lepiej jest zapoznać się z podobnymi aplikacjami, z których korzystają.

Jeśli potrzebujesz czegoś prostego, możesz wypróbować SDL http://www.libsdl.org/, która jest biblioteką między platformami, której celem jest tworzenie gier/prostych aplikacji. Kolejną alternatywą jest biblioteka gier Allegro http://www.talula.demon.co.uk/allegro/.

+0

Czy mógłbyś rozwinąć to ostatnie stwierdzenie? Myślałem, że WNDPROC jest pętlą zdarzeń. I w tej pętli, tworząc własne wydarzenia, aby reszta aplikacji nie wiedziała, na którym systemie operacyjnym jest coś, co planowałem. Czy to się nazywa system Dispatch? – Mizipzor

+0

Windows ma pętlę wiadomości http://msdn.microsoft.com/en-us/library/ms644928 (VS.85).aspx. Czasami jest to ukrywane przez framework, z którego korzystasz, np. MFC, .NET, itp. – Ismael

+0

Dla każdego wątku masz kolejkę wiadomości, w której wiadomości WM_XXX są przechowywane, gdy są generowane, pętla wiadomości jest odpowiedzialna za wyświetlenie tych wiadomości i dostarczyć im odpowiednie okno proc. – Ismael

2

Jak podaje xhantt, jaki transport odpowiadającym wiadomościom, których szukasz, to X Window System. Co w rzeczywistości może być nieco skomplikowane.

Z XLib będziesz musiał obsługiwać zdarzenia rejestrujące i odkurzane w głównej pętli. Zobacz XLib manual, aby uzyskać pełny opis postępowania. Ale nie zapominaj, że w ten sposób będziesz przechwytywał tylko zdarzenia dotyczące okien i danych wejściowych. Nie wszystkie wiadomości systemu operacyjnego. Można również poszukać XCB, która jest nowszą i prawdopodobnie łatwiejszą biblioteką.

Jeśli stworzysz swoją aplikację na tych dwóch bibliotekach, będzie działał płynnie pod (prawie, nigdy nie możemy być zbyt pewni) każdego WM. I nie będziesz potrzebował żadnej zależności, której większość użytkowników Linuksa nie ma jeszcze na swojej instalacji. Jeśli pójdziesz z Qt, GTK, itp. ... Będzie łatwiej i będzie działać pod dowolnym WM, ale mogą nie mieć zainstalowanej biblioteki.

+0

Wystarczą okna i zdarzenia wejściowe. Jak stwierdziłem, chcę tylko, aby okno narysowało trochę OGL i słuchało wejścia, dla prostej gry.Dzięki za link do XCB, zerknę na to. – Mizipzor