[Dev-C++] Projekt winapi

0

Witam

Chciałem w ramach testu dodać ikonkę do programu. Dlatego też w Dev-C++ (ver. 4.9.9.0) odpaliłem nowy projekt, dodałem plik, napisałem kod.

Rzecz w tym, że gdy program się uruchomi, nie da się w żaden sposób zamknąć okna (jedynie URUCHOM ->Zeruj Program) lub gdy odpalamy Exe nie z Deva, a spod systemu - Zakończ zadanie z Menedżera zadań.

Co dziwne (dla mnie), ten sam plik skompilowany nie jako projekt, tylko jako oddzielny plik działa zupełnie zgodnie z oczekiwaniami.

Dodam, że mam własną procedurę obsługi okna. Jeśli ta procedura wywoła tylko funkcję DefWindowProc, to wszystko jest OK.

Procedura obsługi okna (jeśli to ważne), wygląda tak:

/*   Funkcja obslugujaca okno   */
LRESULT CALLBACK ProcObslugi (HWND hOkno, UINT uMsg, WPARAM wPar, LPARAM lPar)
{
   switch (uMsg)
   {
      case WM_CLOSE:
         if (MessageBox(hOkno,"Czy na pewno chcesz zamknąć to okno?","Potwierdź",MB_YESNO 
             | MB_ICONQUESTION | MB_APPLMODAL | MB_DEFBUTTON2)==IDYES)
         {
            MessageBox(hOkno,"Potwierdziłeś zamknięcie okna!","Zgoda",MB_OK | MB_ICONINFORMATION );
            DestroyWindow(hOkno);
         }   
         break;
      
      case WM_KEYDOWN:
         if (wPar==VK_ESCAPE || wPar==VK_RETURN) //VK_RETURN - ENTER
            //DestroyWindow(hOkno); // tak jest bez potwierdzenia
            PostMessage(hOkno,WM_CLOSE,0,0); // zwracamy komunikat do samego siebie WM_CLOSE
         else if (wPar==VK_UP)
            PostMessage(hOkno, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
         else if (wPar==VK_DOWN)
            PostMessage(hOkno, WM_SYSCOMMAND, SC_MINIMIZE, 0);
         break;
      default:
         return DefWindowProc(hOkno,uMsg,wPar,lPar); 
   }
}

Gdzie jest haczyk?

Pozdrawiam

0

Hmmmm dziwne ale spróbuj dostawić do switch'a to:
case WM_DESTROY:
PostQuitMessage(0);
break;

0

WM_CLOSE:
{
PostQuitMessage(0);
}

samo obsluzenie destroy moze nie pomoc gdyz forma nie jest niszczona.. jak opisal kolega
(chyba ze sie myle)

//dop. niewykluczone :)
ale zauwaz ze w moim sposobie ten proces jest konczony od razu, nie potrzeba odczekiwac pewnego okresu czasu aby przeczytac komunikat i go obsluzyc ;)
sa to ulamki sek. ale zawsze cus ;)

0

Fakt ale w tamtym programie jest już WM_CLOSE i w nim jest DestroyWindow() to z kolei powoduje wysłanie komunikaty WM_DESTROY w wyniku tego zostaje dopełniony proces eliminacji ;)

0

Dziwna sprawa ale jeżeli chodzi o obsługę WM_ClOSE zrobiłem sobie podobny przykładzik i nie zależnie od tego czy kliknę na nie lub tak okienko zamyka się z tą różnicą ,że jak wcisnę tak to mi wyskakuje potwierdzenie...

0

Ogolnie to haczyk jest w tym, ze zapomniales za switchem napisac return 0;

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