Napisałem prosty kalkulator w WinAPI. Niestety kiedy uruchamiam program wyświetla się puste okno. Dodam, że w obsłudze komunikatu WM_CREATE napisałem kod tworzący przyciski i pole edycyjne, więc nie rozumiem skąd ten problem. Kod umieszczam w załączniku.
Problem z wyświetleniem kontrolek
- Rejestracja: dni
- Ostatnio: dni
- Postów: 9
- Rejestracja: dni
- Ostatnio: dni
- Postów: 787
Wywal to :
HINSTANCE*hInst;
Ma być :
hScreen = CreateWindowEx(WS_EX_CLIENTEDGE, WC_EDIT,"0", WS_CHILD | WS_VISIBLE, 5, 10, 390, 100, hWnd, 0, ((LPCREATESTRUCT)lParam)->hInstance, 0);
// Pierwszy wiersz
hC = CreateWindowEx (0, WC_BUTTON, "C", WS_CHILD | WS_VISIBLE, 10 , 110, 190, 40, hWnd,
(HMENU) C,((LPCREATESTRUCT)lParam)->hInstance, 0);
hPlusMinus = CreateWindowEx (0, WC_BUTTON , "+-", WS_CHILD | WS_VISIBLE, 210, 110, 90, 40, hWnd,
(HMENU) PLUSMINUS,((LPCREATESTRUCT)lParam)->hInstance, 0);
hDzielenie = CreateWindowEx (0, WC_BUTTON, "/", WS_CHILD | WS_VISIBLE, 310, 110, 90, 40, hWnd,
(HMENU) DZIELENIE, ((LPCREATESTRUCT)lParam)->hInstance, 0);
// Dugi wiersz
h1 = CreateWindowEx (0, WC_BUTTON, "1", WS_CHILD | WS_VISIBLE, 10, 160, 90, 40, hWnd,
(HMENU) 1, ((LPCREATESTRUCT)lParam)->hInstance, 0);
h2 = CreateWindowEx (0, WC_BUTTON, "2", WS_CHILD | WS_VISIBLE, 110, 160, 90, 40, hWnd,
(HMENU) 2, ((LPCREATESTRUCT)lParam)->hInstance, 0);
//itd we wszystkich funkcjach
Wyświetla , ale program się wywala , gdzieś tam , zamotane to mi się nie chce szukać,przetwarzanie komunikatów z buttonów leży .
Blok WM_COMMAND -> stack overflow .
- Rejestracja: dni
- Ostatnio: dni
- Postów: 9
Napisz chociaż czym może być spowodowany ten błąd, żebym wiedział czego szukać i co poprawić.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 839
Sprawdz obsluge komunikatow, jak przed case WM_DESTROY nie dasz break; to program ci sie zamknie przy pierwszym poleceniu. Zobacz, czy wywolujesz swoje okno poleceniem ShowWindow(uchwyt, WS_VISIBLE);
Oooo... Moim zdaniem uchwyt hwnd (do glownego okna powinien miec zasieg ogolny).
W ogole nie jak ci sie to skopilowalo :P. Mi kupe bledow wyskakuje :D
W petli komunikatow nie zwraca sie 0. Sa do tego odpowiednie komunikaty.
I chyba znam calego diabla. Po komunikacie WM_COMMAND nie dajesz break;, co skutkuje przejsciem do komunikatu WM_DESTROY i zamknieciem programu.
Dalsze bledy:
God Why ! Czemu po kazdym komunikacie WM_CREATE, WM_COMMAND i WM_DESTROY dajesz return? Powinno byc break;
Wtedy wykonuje sie "return DefWindowProc(hWnd, uMsg, wParam, lParam);" i ta funkcja zapetla ci wszystko czekajac na kolejny komunikat.
Jest jeszcze troszke bledow ale na transport lece potem napsize :P
- Rejestracja: dni
- Ostatnio: dni
- Postów: 9
Wykonywanie WM_DESTROY jest raczej niemożliwe, ponieważ jak sam zauważyłeś obsługę każdego komunikatu kończy polecenie return, które przecież przerywa wykonywanie całej funkcji.
Korzystałem z ebooka "Od zera do gier kodera". Tam właśnie autor zaleca obsługę każdego komunikatu kończyć poleceniem return a tylko te nieobsłużone kierować do DefWindowProc. Napisałem w ten sposób kilka prostych programów podczas nauki WinAPI i nigdy nie było z tym problemów.
Okno już mi się wyświetla, tylko kliknięcie czegokolwiek powoduje błąd stack overflow.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 787
Weź ogarnij od początku pomysł na przetwarzanie Buttonów ,bo ja nie trawie o co w tym kodzie chodzi .
Jedno jest pewne że masz Zapętlone to przetwarzanie .
...
default:
SetWindowText(hScreen, "0"); //<===== !!!!!!!!!!!!!!!!!!!!!!!
nDzialanie = wParam;
if (fLiczba == &fLiczba1){ fLiczba = &fLiczba2;}
else{
SendMessage(hWnd, WM_COMMAND, EQUAL, 0) //<========!!!!!!!!!!!!!!!!!!!!!!!
;}
bUlamek = false;
uPrzecinek = 0;
Text.clear();
return 0;
Po naciśnięciu czegokolwiek program trafia w to miejsce i wraca na początek WM_COMMAND i tak w kółko ,więc sie stos wywali .
DEBUGERA użyj .