WINAPI moment zamknięcia procesu [WM_QUIT]

Odpowiedz Nowy wątek
2011-08-06 17:51
0

Witam, mam następującą zagwozdkę. Tworzę okienko, coś tam sobie rysuje i takie tam bzdety. Tym niemniej kiedy chcę zamknąć to okno, program nie wstawia do kolejki komunikatów WM_QUIT. Zatem okno znika, ale proces nadal leci. Stąd prośba o pomoc z Waszej strony, jak zamknąć to cholerstwo? :D Poniżej fragmenty kodu z procedury okna oraz pętli wiadomości:

 
//procedura okienkowa
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HGLRC hRC;                       //kontekst tworzenia grafiki
    static HDC hDC;                         //kontekst urządzenia
    int width, height;                      //szerokość i wysokość okno
 
    switch(message)
    {
        case WM_CREATE:                     //okno jest tworzone
 
            hDC = GetDC(hwnd);              //pobiera kontekst urządzenia
            g_HDC = hDC;
            SetupPixelFormat(hDC);          //wywołuje funkcję określającą format pikseli
 
            //tworzy kontekst tworzenia grafiki i czyni go bieżącym
            hRC = wglCreateContext(hDC);
            wglMakeCurrent(hDC, hRC);
 
            return 0;
 
        case WM_CLOSE:                      //okno jest zamykane
 
            if(IDYES == MessageBox(hwnd, "Czy na pewno zamknąć okno?", "?", 
                                                                                   MB_YESNO |   MB_ICONQUESTION))
            {
                //dezaktywuje bieżacy kontekst i usuwa go
                wglMakeCurrent(hDC, NULL);
                wglDeleteContext(hRC);
                return DefWindowProc(hwnd, message, wParam, lParam);
            }
            else 
                return 0;
 
        case WM_DESTROY:
            MessageBox(hwnd, "Koniec działania programu", "info", MB_OK);
            PostQuitMessage(0);
            return 0;
//tutaj więcej przetwarzanych komunikatów....

/****/

 
//pętla przetwarzania komunikatów
    while(!done)
    {
        PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE);
 
        if(msg.message == WM_QUIT)          //jeśli otrzymanu komunikat WM_QUIT
        {
            done = true;
            break;              //jeśli tak, to aplikacja kończy działanie
        }
 
        else
        {
            //tworzy grafikę
            //zeruje bufor ekranu i bufor głębi
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                               //Bam bam....

Pozostało 580 znaków

2011-08-20 16:06
gość
0

Po co ustawiasz done = true, skoro zaraz i tak wychodzisz z pętli za pośrednictwem break'a?

Może to jest wnętrze innej pętli wykorzystującej zmienną "done". - Wibowit 2011-08-20 16:09
rzeczywiście jakiś kwiatek mi wyszedł :D Tym niemniej, trochę pokombinowałem i teraz proces się zamyka tylko wtedy gdy zamykam okno za pomocą klawy (alt + F4), jeśli zamkne okno za pomocą myszki - proces leci dalej. Nie ograniam i moge sobie tylko powiedzieć: "wiedz, że coś się dzieje" - satirev 2011-08-20 16:45

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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