c ++ - hvordan kommer allegro automatisk at håndtere minimere knappen, men ikke lukke knappen?

Indlæg af Hanne Mølgaard Plasc

Problem



Her er en prøve fra Allegro5 tutorial: (for at se den oprindelige prøve, følg linket, har jeg forenklet det lidt til illustrative formål. [4]


#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;
}


Hvis jeg ikke manuelt tjekker for ALLEGRO\_EVENT\_DISPLAY\_CLOSE, kan jeg ikke lukke vinduet eller afslutte programmet (uden at dræbe processen gennem opgaveadministrator). Jeg forstår dette. Men i dette tilfælde forstår jeg ikke, hvordan knappen minimeres, uden at jeg manuelt håndterer den. Kan nogen forklare det?

Bedste reference


Ansvarsfraskrivelse: Jeg ved ikke Allegro.


Minimering af et vindue på det mest grundlæggende niveau involverer kun arbejde fra processen, der beskæftiger sig med windows (Window Manager), ikke selve processen.
Afslutter et program, kræver normalt filer, der skal lukkes eller hukommelsen skal frigøres eller noget andet, som kun selve processen kan gøre.

Andre referencer 1


Den største grund til, at du selv skal håndtere det via en begivenhed, er at lukke (ødelægge) et vindue ugyldiggør ALLEGRO\_DISPLAY * pegeren. Anmodningen om at opsige vinduet kommer fra en anden tråd, så det ville være usikkert at ødelægge det med det samme. At give dig mulighed for at behandle det selv på din egen tid er sikkert og nemt og passer ind i den hændelsesmodel, som Allegro 5 bruger til alle andre ting.


Der er andre måder at løse problemet på, men de er ikke mere enkle end denne metode og har ingen væsentlige fordele.

Andre referencer 2


Jeg ved ikke noget om allegro, men minimering af vinduer håndteres generelt af vindueslederen uden behov for yderligere indgriben fra dit program. Hovedvinduet er indstillet til en 'minimeret' -stat, og dit program fortsætter med at køre i baggrunden uden et synligt vindue.


Du kan tjekke, om din app bliver minimeret ved at opfange bestemte vinduesbeskeder (de er WM\_ACTIVATEAPP, WM\_ACTIVATE eller WM\_SIZE). Måske giver allegro noget sådan også.


I modsætning til at lukke vinduet skal gøres ved hjælp af dit program. Ved at klikke på X sendes der simpelthen en besked til vinduet (WM\_CLOSE), at brugeren har klikket på den, og du skal svare i overensstemmelse hermed (gem staten, afslut programmet eller undgå det).


I det mindste er det sådan, hvordan den normale winapi virker, og allegro synes at virke på samme måde.