Gering Napisano Luty 9, 2019 Autor Zgłoś Udostępnij Napisano Luty 9, 2019 Witam mam pytanie dotyczące dwóch komunikatów . Są nimi WM_CLOSE i WM_DESTROY. Czym one sie róznią i czy mozna przerwac w jakis sposób ich wkonywanie ? . Z góry dziekuje za pomoc Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Juju Napisano Luty 9, 2019 Zgłoś Udostępnij Napisano Luty 9, 2019 Cze! WM_DESTROY oznacza, ze win niszczy okno na polecenie uzytkownika, komunikat ten jest wynikiem klikniecia przez uzytkownika przycisku zamknij albo zamknij z menu systemowego programu, [za Petzoldem, Programowanie Windows s. 62, 2 polska edycja ] mozesz go przechwycic, a nastepnie case WM_DESTROY: return 0; //edit A teraz o WM_CLOSE Gdy uzytkownik wybierze zamknij z menu systemowego jest generowany komunikat WM_SYSCOMMAND z w wParam rownym SC_CLOSE, procedura okna przekazuje go do DefWindowProc, a on wysyła komunikat do funkcji okna WM_CLOSE, Mozna WM_CLOSE przechwycic, i np. zapytac uzytkownika o potwierdzenie zamkniecia, aby nic on nie robił case WM_CLOSE: return 0; Jeśli się mylę to prosze o poprawienie mnie . Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Juju Napisano Luty 9, 2019 Zgłoś Udostępnij Napisano Luty 9, 2019 I jescze jedno, jeśli nie chcesz, aby ci się programik zamknął to case CLOSE: case DESTROY: return 0; wtedy bydlaka nie zamkniesz :D , chyba są też inne sposoby na niepozwolenie uzytkownikowi zamkniecie progaramu, ale ja jestem n00bem jesli chodzi o winapi p.s. aby zamknac ten programik, alt + ctrl + del, pare razy zakonczyc zadanie, prog sie zwiesi i mozna go bedzie zamknac tj, to zrobi win Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Gering Napisano Luty 9, 2019 Autor Zgłoś Udostępnij Napisano Luty 9, 2019 Dzięki , ja sonie poradziłęm w ten sposób : case WM_SYSCOMMAND: if(wParam == SC_CLOSE) { int Pytanie = MessageBox(NULL,"Czy chesz zakończyc ?","",MB_YESNO); if(Pytanie == IDNO) { return DefWindowProc(Okno,NULL,0,0); } } break; Jak by ktos nie wiedział Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Juju Napisano Luty 9, 2019 Zgłoś Udostępnij Napisano Luty 9, 2019 A nie lepiej było by przetwarzac WM_CLOSE, a WM_SYSCOMMAND zostawic dla DefWindowProc? Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Gering Napisano Luty 10, 2019 Autor Zgłoś Udostępnij Napisano Luty 10, 2019 Ja tam wolałem zrobic to w ten sposób . Nie jest zle bo chodzi i to tak jak tego chciałem . A czasmi wole sie troszeczke napisac i wiedziec co sie dzieje . Mozesz mi podac swój sposób . Ale ja od swojego nie odstąpie Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Juju Napisano Luty 10, 2019 Zgłoś Udostępnij Napisano Luty 10, 2019 Mozna zrobic to tak: int fEndp; switch (message) { case WM_CLOSE: fEndp = MessageBox(NULL,"Czy chesz zakończyc ?","",MB_YESNO); if(fEndp == IDNO) { return DefWindowProc(hWnd,NULL,0,0); } case WM_DESTROY: PostQuitMessage (0) ; break ; default: return DefWindowProc (hWnd, message, wParam, lParam) ; } WM_DESTROY musi znalezdz sie bezposrednio pod WM_CLOSE. :) Mam nadzieje ze nie popelnilem bledów Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.