• 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

Object Storage Arubacloud
0 głosów
230 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 (194,920 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 (194,920 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 342 wizyt
pytanie zadane 11 stycznia 2022 w C i C++ przez MKolaj15 Bywalec (2,270 p.)
0 głosów
3 odpowiedzi 303 wizyt
0 głosów
1 odpowiedź 505 wizyt
pytanie zadane 2 kwietnia 2019 w C i C++ przez Sic Dyskutant (8,510 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...