Почему allegro автоматически обрабатывает кнопку сворачивания, но не кнопку закрытия?

Вот пример из руководства Allegro5: (чтобы увидеть исходный образец, перейдите по ссылке, я немного упростил ее для наглядности.

#include <allegro5/allegro.h>

int main(int argc, char **argv)
{
   ALLEGRO_DISPLAY *display = NULL;
   ALLEGRO_EVENT_QUEUE *event_queue = NULL;
   al_init()
   display = al_create_display(640, 480);
   event_queue = al_create_event_queue();
   al_register_event_source(event_queue, al_get_display_event_source(display));
   al_clear_to_color(al_map_rgb(0,0,0));
   al_flip_display();
   while(1)
   {
      ALLEGRO_EVENT ev;
      ALLEGRO_TIMEOUT timeout;
      al_init_timeout(&timeout, 0.06);
      bool get_event = al_wait_for_event_until(event_queue, &ev, &timeout);
      //-->// if(get_event && ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) {
      //-->//   break;
      //-->// }

      al_clear_to_color(al_map_rgb(0,0,0));
      al_flip_display();
   }

   al_destroy_display(display);
   al_destroy_event_queue(event_queue);

   return 0;
}

Если я не проверю вручную наличие ALLEGRO_EVENT_DISPLAY_CLOSE, то не смогу закрыть окно или завершить программу (без уничтожения процесса через диспетчер задач). Это я поняла. Но в этом случае я не понимаю, как кнопка сворачивания работает без моего ручного управления. Может кто-нибудь объяснить?


person Armen Tsirunyan    schedule 15.08.2011    source источник
comment
Технически есть некоторые вещи, которые вы могли бы сделать в отношении минимизации: прослушивать события изменения размера или события потери фокуса. Но, как правило, эти вещи не имеют значения, и вы можете спокойно их игнорировать.   -  person Matthew    schedule 16.08.2011


Ответы (3)


Отказ от ответственности: я не знаю Аллегро.

Минимизация окна на самом базовом уровне включает работу только процесса, который имеет дело с окнами (менеджер окон), а не самого процесса. Завершение программы обычно требует закрытия файлов, освобождения памяти или чего-то еще, что может сделать только сам процесс.

person pmg    schedule 15.08.2011

Самая большая причина, по которой вы должны обрабатывать это самостоятельно через событие, заключается в том, что закрытие (уничтожение) окна делает недействительным указатель ALLEGRO_DISPLAY *. Запрос на завершение окна исходит из другого потока, поэтому было бы небезопасно уничтожать его немедленно. Позволить вам обрабатывать его самостоятельно в удобное для вас время — это безопасно и просто, и оно соответствует модели событий, которую Allegro 5 использует для всего остального.

Есть и другие способы решения проблемы, но они не более просты, чем этот метод, и не имеют особых преимуществ.

person Matthew    schedule 15.08.2011

Я ничего не знаю об аллегро, но сворачивание окон обычно выполняется оконным менеджером без необходимости дальнейшего вмешательства вашей программы. Главное окно устанавливается в «свернутое» состояние, и ваша программа продолжает работать в фоновом режиме без видимого окна.

Вы можете проверить, минимизируется ли ваше приложение, перехватив определенные оконные сообщения (такие как WM_ACTIVATEAPP, WM_ACTIVATE или WM_SIZE). Может быть, аллегро тоже дает что-то подобное.

В отличие от этого закрытие окна должно выполняться вашей программой. Нажатие на X просто отправляет сообщение в окно (WM_CLOSE), что пользователь щелкнул его, и вы должны отреагировать соответствующим образом (сохранить состояния, выйти из программы или вы можете предотвратить это).

По крайней мере, так работает обычный winapi, и allegro, кажется, работает так же.

person Tobias Schlegel    schedule 15.08.2011