WinApi komunikaty zamkniecia okna

0

Witam. Takie krótkie pytania:
1.
Gdy klikam na "krzyżyk" aby zamknąć aplikację wywołuje się WM_CLOSE. Zwalniam wtedy HDC i BITMAPY, lecz okno się nie zamyka. Rozumiem, że domyślna obsługa wydarzenia WM_CLOSE to wywołanie po prostu WM_DESTROY i muszę w WM_CLOSE po prostu wywołać PostQuitMessage() ?

  1. (tu troszkę dłużej)
    WYJAŚNIENIE:
    Tworzę swój przycisk w taki sposób, że:
  • Tworze klasę przycisku;
  • W konstruktorze tworzę kontrolkę i przypisuję adres klasy do kontrolki za pomocą SetWindowLong (żeby potem czytać stan przycisku itp...)
  • Posiadam załóżmy bitmapę i hdc z rzeczy, które należy zwolnić.
  • Proces niszczenia kontrolki opiera się na
    • wywołaniu funkcji Destroy() wewnątrz klasy, która niszczy hwnd_Button
    • wewnątrz komunikatu WM_DESTROY natomiast niszczę dopiero klasę.
    • w destruktorze klasy zwalniam HDC i BITMAPĘ

Powycinana troszkę klasa:
http://pastebin.com/EJXxk5pz
Komunikat WM_DESTROY wewnątrz przycisku:
http://pastebin.com/5SMvFqx2
Jak tworzę i usuwam kontrolkę:

 
CreateButton *MyButton = CreateButton(&MyButton, /*jakis region*/, myDrawFunc);
MyButton->Destroy();

Ok a teraz moje pytanie:
Jak w komunikacie WM_CLOSE (lub WM_DESTROY) procedury głównego okna próbuję zniszczyć kontrolkę, okno główne mi się niby zamyka i wszystko jest ok, ale w procesach dalej widnieje mój program. Dodam, że owa sytuacja występuje losowo, raz proces znika raz nie. Coś robię nie tak w owym kodzie?

4

Gdy klikam na "krzyżyk" aby zamknąć aplikację wywołuje się WM_CLOSE. Zwalniam wtedy HDC i BITMAPY, lecz okno się nie zamyka. Rozumiem, że domyślna obsługa wydarzenia WM_CLOSE to wywołanie po prostu WM_DESTROY i muszę w WM_CLOSE po prostu wywołać PostQuitMessage() ?

Zupełnie nie tak.

Kliknięcie na krzyżyk albo naciśnięcie Alt-F4 powoduje wysłanie WM_CLOSE. Standardowe WM_CLOSE wywołuje DestroyWindow. We własnym WM_CLOSE można np. wyświetlić MessageBoksa „czy na pewno?” albo „czy zapisać zmiany?” i w zależności od odpowiedzi, wywołać DestroyWindow albo nie. Jeśli okno ma się zamykać zawsze bezwarunkowo, nie obsługujemy WM_CLOSE.

DestroyWindow wysyła WM_DESTROY, a następnie niszczy okno. W tym momencie losy okna są już przesądzone - niezależnie od tego co zrobimy w WM_DESTROY, okno zostanie zamknięte. Standardowe WM_DESTROY nie robi nic. Własne WM_DESTROY to miejsce na zwolnienie jakichś zasobów i ewentualne wywołanie PostQuitMessage, które wyśle WM_QUIT i przerwie pętlę komunikatów.

W twoim przypadku:

  • WM_CLOSE zostaw w spokoju (nie obsługuj)
  • w WM_DESTROY zwolnij co chcesz zwolnić i wykonaj PostQuitMessage.

ak w komunikacie WM_CLOSE (lub WM_DESTROY) procedury głównego okna próbuję zniszczyć kontrolkę, okno główne mi się niby zamyka i wszystko jest ok, ale w procesach dalej widnieje mój program.

DestroyWindow na oknie rodzica niszczy również wszystkie jego okna potomne (kontrolki). Ale standardowo nie przerywa pętli komunikatów while (GetMessage(...)), to robi dopiero PostQuitMessage.

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