• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Błąd przy wyświetlaniu okna WINAPI

0 głosów
478 wizyt
pytanie zadane 10 stycznia 2019 w C i C++ przez Sic Dyskutant (8,510 p.)

Rozpocząłem naukę podstaw WinApi mam nietypowy błąd związany z wyświetleniem okna, dla pewności kleiłem gotowy kod, biorąc pod uwagę poprawki ze względu na kompilator Visual Studio. Nie wyświetla mi tego okna co powinno(wyświetla "komunikat błędu"), natomiast powinien okno z przyciskiem. Oto kod:

#include <windows.h>

LPCWSTR NazwaKlasy = L"Okienko";
LPCWSTR Nazwa_okna = L"Moje okienko";
MSG Komunikat;

// przyciski
HWND g_hPrzycisk;

// pola tekstowe
HWND hText;
HWND hText2;

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	// WYPEŁNIANIE STRUKTURY
	WNDCLASSEX wc;

	wc.style = 0;
	wc.lpfnWndProc = WndProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInstance;
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wc.lpszMenuName = NULL;
	wc.lpszClassName = NazwaKlasy;

	// REJESTROWANIE KLASY OKNA
	if (!RegisterClassEx(& wc))
	{
		MessageBox(NULL, L"Błędne okno", L"Niestety...",
			MB_ICONEXCLAMATION | MB_OK);
		return 1;
	}

	// TWORZENIE OKNA
	HWND hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, NazwaKlasy, Nazwa_okna, WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hInstance, NULL);

	g_hPrzycisk = CreateWindowEx(WS_EX_CLIENTEDGE, L"BUTTOM", L"Nasz Przycisk", WS_CHILD | WS_VISIBLE,
		100, 100, 150, 30, hwnd, NULL, hInstance, NULL);

	if (hwnd == NULL)
	{
		MessageBox(NULL, L"Okno odmówiło przyjścia na świat!", L"Ale kicha...", MB_ICONEXCLAMATION);
		return 1;
	}

	ShowWindow(hwnd, nCmdShow); // Pokaż okienko...
	UpdateWindow(hwnd);

	// Pętla komunikatów
	while (GetMessage(&Komunikat, NULL, 0, 0))
	{
		TranslateMessage(&Komunikat);
		DispatchMessage(&Komunikat);
	}

	return Komunikat.wParam;
}

// OBSŁUGA ZDARZEŃ
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch (msg)
	{
		case WM_COMMAND:
			if ((HWND)lParam == g_hPrzycisk)
				MessageBox(hwnd, L"Nacisnąłeś przycisk!", L"Ha!", MB_ABORTRETRYIGNORE);
		break;

		case WM_CLOSE:
			DestroyWindow(hwnd);
			break;

		case WM_DESTROY:
			PostQuitMessage(0);
			break;

		default:
			return DefWindowProc(hwnd, msg, wParam, lParam);
			break;
	}

	return 0;
}

 

1 odpowiedź

+1 głos
odpowiedź 10 stycznia 2019 przez monika90 Pasjonat (22,940 p.)
wybrane 11 stycznia 2019 przez Sic
 
Najlepsza

Należy określić rozmiar struktury. Po WNDCLASSEX wc;
dopisz:  wc.cbSize = sizeof wc;

Poza tym, zamiast BUTTON napisałeś BUTTOM.

komentarz 10 stycznia 2019 przez Sic Dyskutant (8,510 p.)

Dopisałem i poprawiłem, mimo to dalej przeważa ten warunek:

// REJESTROWANIE KLASY OKNA
	if (!RegisterClassEx(& wc))
	{
		MessageBox(NULL, L"Błędne okno", L"Niestety...",
			MB_ICONEXCLAMATION | MB_OK);
		return 1;
	}

 

1
komentarz 11 stycznia 2019 przez j23 Mędrzec (195,220 p.)

Zobacz, co zwraca GetLastError. Jeśli się nie mylę, w pliku winerror.h powinieneś mieć jakiś opis błędów zwróconych przez tę funkcję.

1
komentarz 11 stycznia 2019 przez monika90 Pasjonat (22,940 p.)

Trzeba jeszcze wyzerować strukturę, np. za pomocą klamer

    WNDCLASSEX wc{};

komentarz 11 stycznia 2019 przez Sic Dyskutant (8,510 p.)
Klamra załatwiła sprawę dziękuję, ale dlaczego nigdzie o tym nie pisali ? Przeszukałem wiele dokumentacji.
komentarz 11 stycznia 2019 przez j23 Mędrzec (195,220 p.)
Takich rzeczy pisać nie trzeba. Każde pole struktury powinno mieć ustawioną jakąś wartość. Wartości przypadkowe mogą powodować problemy.

Podobne pytania

0 głosów
0 odpowiedzi 943 wizyt
pytanie zadane 11 stycznia 2022 w C i C++ przez MKolaj15 Bywalec (2,270 p.)
0 głosów
3 odpowiedzi 520 wizyt
0 głosów
1 odpowiedź 763 wizyt
pytanie zadane 2 kwietnia 2019 w C i C++ przez Sic Dyskutant (8,510 p.)

93,741 zapytań

142,676 odpowiedzi

323,294 komentarzy

63,322 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...