Problem z wyświetleniem kontrolek

Problem z wyświetleniem kontrolek
KH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

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.

dzejo
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 787
0

Wywal to :
HINSTANCE*hInst;
Ma być :

Kopiuj
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 .

KH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Napisz chociaż czym może być spowodowany ten błąd, żebym wiedział czego szukać i co poprawić.

gswidwa
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 839
0

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

KH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

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.

dzejo
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 787
0

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 .

Kopiuj
	...		

				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 .

KH
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Dziękuję za pomoc.To wreszcie pomogło. A co do przetwarzania buttonów to rzeczywiście może być trochę mało czytelne.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.