2009-02-08 2 views
6

В Windows при создании окна, вы должны определить (с ++)процедура Окна сообщений в Linux против Windows,

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

обрабатывать все сообщения, отправленные из ОСА в окно, как нажатия и тому подобные.

Я хочу немного почитать о том, как работает одна и та же система в Linux. Возможно, это потому, что я немного отстаю от терминологии, но я не могу найти что-либо на этом через Google (хотя я уверен, что должно быть много!).

  • Это еще одна функция C, которая обрабатывает все сообщения?
  • Различается ли определение функции на разных WM (Gnome, KDE) или обрабатывается на более низком уровне в ОС?

Edit: Ive посмотрел на инструменты, такие как QT и WxWidgets, но эти рамки, кажется, больше ориентирован на развитие GUI широкое применение. Im скорее ищет способ создать базовое окно (ограничить размер, границы/декорации) для моей графики OGL и получить ввод на нескольких платформах. И, согласно моим первоначальным исследованиям, такая функция - единственный способ получить этот вход.

Какой будет лучший маршрут? Чтение, обучение, а затем использование QT или WxWidgets? Или узнать, как работают системы и реализовать те немногие основные функции, которые я хочу сам?

+0

Если вам нужно что-то простое, вы можете попробовать SDL http://www.libsdl.org/, который представляет собой библиотеку кросс-платформы, предназначенную для разработки игр/простых приложений. – Ismael

+2

Я начинаю понимать, что вопрос - это способ широких, чтобы на самом деле иметь хороший ответ. – Mizipzor

ответ

4

В принципе это абсолютно то же самое. Тем не менее, он не имеет ничего общего с общением с ОС (и не делает это на win32, используя user32.dll полностью необязательно)

Приложение GUI где-то имеет цикл событий, который обрабатывает сообщения из очереди на некотором уровне.

Существует множество библиотек, которые обычно используются для «скрытия» этого поведения - вы можете использовать их (и действительно, вам следует). Во всяком случае, система событий Xlib еще более извращена, чем user32.dll Win32, и ее менее понимают, поэтому меньше людей используют ее напрямую.


В Linux или Windows приложения могут использовать низкоуровневый графический интерфейс или могут использовать библиотеку. Большинство используют библиотеку. Приложения также могут не использовать и работать без графического интерфейса (обычно это делают серверные приложения). Приложения могут создавать несколько потоков, один из которых находится в цикле событий, а другие работают по-разному. Это популярный подход.

  • Большинство GUI приложения используют более высокий уровень библиотеки для их GUI
  • Номера интерактивных приложений, например, серверных приложений, вообще не использовать графический интерфейс и не использовать библиотеки (например, XLib, user32.dll)
  • Приложения, которые не поддаются «циклу событий» (например, Игры), обычно используют отдельный поток для обработки цикла событий.
  • Эти вещи в основном верны для Win32 и Linux.
+0

Ничего, я надеялся на такой ответ. Я пишу игру, поэтому не будет много графических или системных событий. Но если бы я утверждал, что цикл событий является единственным способом получить входные данные от пользователя, можете ли вы доказать, что я не прав? – Mizipzor

+0

Игры обычно имеют отдельный поток для запуска цикла событий из того, который запускает логику игры - игровой логический поток обычно захватывает данные в общих переменных и т. Д. Из потока обработки событий. Однако есть и другие возможности. – MarkR

5

Это совершенно и совершенно другое. Эта оконная процедура на 100% зависит от ОС Windows. Для linux это будет зависеть от оконного менеджера (gnome, kde - как вы уже упоминали). Если вы хотите сделать кросс-платформенную разработку, вы можете посмотреть на такие вещи, как QT.

Вы можете посмотреть по следующим адресам:

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

7

Ну на самом базовом уровне, у вас есть протокол X Window http://en.wikipedia.org/wiki/X_Window_System_core_protocol, который мы можем быть довольно сложным для обработки если вы хотите сделать какое-либо приложение. Далее в стеке есть Xlib http://en.wikipedia.org/wiki/Xlib, который является «удобной» оболочкой вокруг протокола X, но все же является сложным для приложений «реальной жизни». На вершине Xlib построено большинство других фреймворков, пытаясь упростить разработку приложений. Наиболее известными являются: Xt, Gtk, Qt и т. Д.

Как в окне у вас есть «цикл событий», и если вы хотите, вы можете реализовать поверх него метафору GetMessage/DispachMessage, чтобы имитировать поведение окон. Таким образом, у вас может быть WNDPROC, но изначально X не обеспечивает такую ​​вещь.

Прежде чем изобретать колесо, желательно взглянуть на аналогичные приложения, что они используют.

Если вам нужно что-то простое, вы можете попробовать SDL http://www.libsdl.org/, который представляет собой библиотеку кросс-платформы, предназначенную для разработки игр/простых приложений. Другой альтернативой является игровая библиотека Allegro http://www.talula.demon.co.uk/allegro/.

+0

Не могли бы вы рассказать о последнем заявлении? Я думал, что WNDPROC - это цикл событий. И в этом цикле, создавая мои собственные события, чтобы остальная часть приложения не знала, какая ОС, на которой он работает, была тем, что я планировал. Это то, что называется диспетчерской системой? – Mizipzor

+0

У Windows есть конвейер сообщений http://msdn.microsoft.com/en-us/library/ms644928(VS.85).aspx. Иногда это скрывает используемая вами инфраструктура, то есть MFC, .NET и т. Д. – Ismael

+0

Для каждого потока у вас есть очередь сообщений, где сообщения WM_XXX хранятся при их создании, цикл сообщений отвечает за просмотр этих сообщений и доставьте им соответствующее окно proc. – Ismael

2

Как указано xhantt, то, что транспортирует эквивалентные сообщения, которые вы ищете, это X Window System. Который, действительно, может быть немного сложным.

С XLib вам нужно будет обрабатывать события, регистрирующие и декурирующие в вашем основном цикле. См. XLib manual для полного описания того, как действовать. Но не забывайте, что вы только поймаете окна и вводите события таким образом. Не все сообщения ОС.

Вы также можете найти XCB, который является более новой и, вероятно, более простой библиотекой.

Если вы создадите приложение поверх этих двух библиотек, оно будет работать плавно под (почти, мы никогда не можем быть уверены) каждый WM. И вы не будете требовать никакой зависимости, которую большинство пользователей Linux еще не имеет при их установке. Если вы идете с Qt, GTK и т. Д. Это будет проще и работать под любым WM, но у них может не быть установленной библиотеки.

+0

Достаточно оконных и входных событий. Как уже было сказано, я хочу, чтобы окно рисовало OGL и слушало вход для простой игры.Спасибо за ссылку на XCB, я смотрю это вверх. – Mizipzor