Gering Napisano Luty 9, 2019 Autor Zgłoś 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
Juju Napisano Luty 9, 2019 Zgłoś 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
Juju Napisano Luty 9, 2019 Zgłoś 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
Gering Napisano Luty 9, 2019 Autor Zgłoś 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
Juju Napisano Luty 9, 2019 Zgłoś Napisano Luty 9, 2019 A nie lepiej było by przetwarzac WM_CLOSE, a WM_SYSCOMMAND zostawic dla DefWindowProc? Cytuj
Gering Napisano Luty 10, 2019 Autor Zgłoś 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
Juju Napisano Luty 10, 2019 Zgłoś 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
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.