3

这是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,则无法关闭窗口或终止程序(无需通过任务管理器终止进程)。我明白这一点。但在这种情况下,如果没有我手动处理,我不明白最小化按钮是如何工作的。有人可以解释一下吗?

4

3 回答 3

5

免责声明:我不知道 Allegro。

在最基本的层面上最小化一个窗口只涉及处理窗口的进程(窗口管理器)的工作,而不是进程本身。终止程序通常需要关闭文件或释放内存或其他只有进程本身才能执行的操作。

于 2011-08-15T19:47:19.640 回答
2

您必须通过事件自己处理它的最大原因是关闭(销毁)窗口会使ALLEGRO_DISPLAY *指针无效。终止窗口的请求来自不同的线程,因此立即销毁它是不安全的。让您在自己的时间自己处理它既安全又容易,并且适合 Allegro 5 用于所有其他事情的事件模型。

还有其他解决问题的方法,但它们并不比这种方法更简单,并且没有任何主要优势。

于 2011-08-15T22:54:26.863 回答
1

我对allegro一无所知,但最小化窗口通常由窗口管理器处理,无需您的程序进一步干预。主窗口设置为“最小化”状态,您的程序继续在后台运行,没有可见窗口。

您可以通过拦截特定的窗口消息(即 WM_ACTIVATEAPP、WM_ACTIVATE 或 WM_SIZE)来检查您的应用程序是否正在被最小化。也许 allegro 也提供了类似的东西。

相反,关闭窗口确实需要由您的程序完成。单击 X 只会向窗口 (WM_CLOSE) 发送一条消息,表明用户已单击它,并且您必须做出相应的响应(保存状态、退出程序,或者您可以阻止它)。

至少普通的winapi是这样工作的,allegro似乎也是这样工作的。

于 2011-08-15T19:45:36.420 回答