Dziwne zamykanie aplikacji...

0

Witam,

Mam sobie taki oto kod:

#define WIN32_LEAN_AND_MEAN      //zapobiega dołączaniu do kodu wynikowego
                                 //aplikacji zbędnych modułów, które nie
                                 //zostaną wykorzystane
#include <windows.h>

//procedura okienkowa
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   PAINTSTRUCT paintStruct;
   HDC hDC; //kontekst urządzenia
   char string[] = "Witka!";

   switch(message)
   {
      case WM_CREATE:
         return 0; break;
      case WM_CLOSE:
         PostQuitMessage(0); return 0; break;
      case WM_PAINT:
         hDC = BeginPaint(hwnd, &paintStruct);
         //wybiera kolor niebieski
         SetTextColor(hDC, COLORREF(0x00FF0000));
         //wyświetla tekst w środku okna
         TextOut(hDC, 150, 150, string, sizeof(string)-1);
         EndPaint(hwnd, &paintStruct);
         return 0;
         break;
      default:
         break;
   }
   return (DefWindowProc(hwnd, message, wParam, lParam));
}

//tu zaczyna się aplikacja
int WINAPI
WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
   WNDCLASSEX windowClass; //klasa okna
   HWND hwnd;              //uchwyt okna
   MSG msg;                //komunikat
   bool done;              //znacznik zakończenia aplikacji

   //tworzymy strukturę definiującą klasę okna
   windowClass.cbSize = sizeof(WNDCLASSEX);
   windowClass.style = CS_HREDRAW | CS_VREDRAW;
   windowClass.lpfnWndProc = WndProc;
   windowClass.cbClsExtra = 0;
   windowClass.cbWndExtra = 0;
   windowClass.hInstance = hInstance;
   windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);            //domyślna ikona
   windowClass.hCursor= LoadCursor(NULL, IDC_ARROW);               //domyślny kursor
   windowClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//białe tło
   windowClass.lpszMenuName = NULL;                                //bez menu
   windowClass.lpszClassName = "MojaKlasa";
   windowClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO);              //logo Windows jako mała ikonka

   //rejestruj klasę okna
   if (!RegisterClassEx(&windowClass))
      return 0;

   //tworzymy okno
   hwnd = CreateWindowEx(NULL,                        //bez rozszerzonego stylu
   "MojaKlasa",                                       //nazwa klasy
   "Prawdziwa aplikacja Windows!",                    //nazwa aplikacji
   WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_SYSMENU,     //styl okna
   100,100,                                           //współrzędne x, y
   400,400,                                           //szerokość, wysokość
   NULL,                                              //uchwyt okna nadrzędnego
   NULL,                                              //uchwyt menu
   hInstance,                                         //instancja aplikacji
   NULL);                                             //bez dodatkowych paramentrów

   //sprawdza czy utworzenie okna się powiodło (wtedy hwnd będzie NULL)
   if (!hwnd)
      return 0;

   done = false;  //inicjuje zmienną warunku pętli

   //pęla przetwarzania komunikatów
   while (!done)
   {
      PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE);

      if (msg.message==WM_QUIT)
      {
         done = true;
      }
      else
      {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
      }
   }

   return msg.wParam;
}

Po uruchomieniu pojawia się okno aplikacji z napisem.
Problem polega na tym, że gdy chcę zamknąć program wykorzystując przycisk "zamknij" (krzyżyk) w prawym górnym rogu okna - nic się nie dzieje!
Mało tego, przycisk zaczyna działać dopiero w momencie przeskalowania okna lub przesunięciu go w inne miejsce ekranu.
Co to ma być?!

system: WindowsXP; kompilator: Visual C++

Pozdrawiam

P.S. 1. Ten kod to pierwszy przykład z książki "OpenGL. Programowanie Gier";
P.S. 2. Przepraszam, jeżeli to już było, ale nie mogłem znaleźć na forum.

0

Myślę, że przeniesienie:

return (DefWindowProc(hwnd, message, wParam, lParam));

kilka linijek wyżej (dokładnie pod

default:

) rozwiąże problem.

0

Hmm... zrobiłem jak kazałeś i faktycznie przycisk działa teraz bez problemu.
Tylko, że teraz z kolei samo okno znika, ale "Menedżer zadań Windows" pokazuje w dalszym ciągu aktywny proces (tej aplikacji)... a procesor jest zajęty w 100%.
Teraz to już w ogóle nie mam pojęcia co jest grane. :(
Mimo wszystko dziękuję za zainteresowanie i pomoc.

Pozdrawiam

0

Możesz(chyba nawet powinieneś) obsłużyć komunikat WM_DESTROY zamiast WM_CLOSE
case WM_DESTROY:
PostQuitMessage(0);
break;

Podejrzanie wygląda też pętla przetwarzania komunikatów, wywal zmienną

bool done;

a samą pętlę zamień na standardową:

while(GetMessage(&msg, NULL, 0, 0))
{
      TranslateMessage(&msg);
      DispatchMessage(&msg);
}

Jeżeli dalej nie pójdzie, to zajrzyj na <url>www.winapi.org</url> i poczytaj artykuły :)

0

OK - dziękuję jeszcze raz za pomoc (i link) - pomogło.
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1