Почему allegro автоматически обрабатывает кнопку свертывания, но не кнопку закрытия? - PullRequest
2 голосов
/ 15 августа 2011

Вот пример из учебника 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, то я не смогу закрыть окно или завершить программу (не завершая процесс через диспетчер задач). Это я поняла. Но в этом случае я не понимаю, как работает кнопка свертывания, без ручного управления ею. Может кто-нибудь объяснить, пожалуйста?

Ответы [ 3 ]

6 голосов
/ 15 августа 2011

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

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

2 голосов
/ 16 августа 2011

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

1 голос
/ 15 августа 2011

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

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

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

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

...