funkcja CreateWindowEx - skąd zna ustawienia klasy?

0

Cześć,
Uczę się WinApi. W celu utworzenia okna trzeba utworzyć obiekt klasy WNDCLASSEX. Jedną ze zmiennych składowych tej klasy jest jej nazwa. Następnie wywołuje funkcję CreateWindowEx, która tworzy okno. Jednak nie wprowadza się do niej stworzonego obiektu z ustawieniami, tylko jej nazwę.
I teraz pytanie: skąd ta funkcja ma dostęp zmiennych składowych tego obiektu? Jak ona się z nim komunikuje?

0

Nie przekazujesz "zmiennej będącej nazwą obiektu", tylko po prostu obiekt.

0

Zaraz zaraz.. WinApi pisane w C, a ty mówisz o "klasach"?

0
spartanPAGE napisał(a):

Nie przekazujesz "zmiennej będącej nazwą obiektu", tylko po prostu obiekt.

Ale LPCTSTR lpszClassName jest wskaźnikiem na char(?). Więc przekazuję tylko ciąg znaków - to nawet nie jest zmienna.

_wait_what napisał(a):

Zaraz zaraz.. WinApi pisane w C, a ty mówisz o "klasach"?

Tak, masz rację. Chodziło mi o struktury.

0

I jak, nikt nie wie? :-(

0

Windowsy mają pewnie zmapowane zarejestrowana_nazwa -> obiekt WNDCLASSEX.

0
_wait_what napisał(a):

Zaraz zaraz.. WinApi pisane w C, a ty mówisz o "klasach"?

Bo nie chodzi o klasę w sensie OOP, tylko klasę okna.

0
_13th_Dragon napisał(a):

Windowsy mają pewnie zmapowane zarejestrowana_nazwa -> obiekt WNDCLASSEX.

Dzięki.

1

Ja dodam, że zamiast stringa można podać wartość, którą zwraca RegisterClass (odpowiedno rzutowaną), czyli:

HWND hWnd = CreateWindowEx(
        ...
        MAKEINTATOM(RegisterClass(&wc)),
        ...
);

gdzie makro MAKEINTATOM() rzutuje ATOM na LPCTSTR, jest więc to równoważne

HWND hWnd = CreateWindowEx(
        ...
        (LPCTSTR)RegisterClass(&wc),
        ...
);

przy czym jeśli RegisterClass zwróci błąd to i CreateWindow[Ex] też się nie powiedzie - dzięki temu zaoszczędzamy kilka linijek kodu, a i nazwę klasy okna podajemy w całym kodzie tylko raz.

Przykładowy kod z mojego projektu:

	WNDCLASS wc = {};
	wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
	wc.hIcon = LoadIcon(nullptr, IDI_APPLICATION);
	wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE+1);
	wc.lpszClassName = TEXT("cpp_winapi_dupa");
	wc.lpfnWndProc = MyWindow::windowProc;
	wc.hInstance = hInstance;
	wc.style = CS_HREDRAW|CS_VREDRAW;

	HWND hWnd = CreateWindow(
		MAKEINTATOM(RegisterClass(&wc)),
		TEXT("Ala ma kota"),
		WS_OVERLAPPEDWINDOW | WS_VISIBLE,
		CW_USEDEFAULT,  nCmdShow,
		400, 300, // size
		0, // parent
		0, // menu
		hInstance,
		this
	);

nie wygląda standardowo, ale wszystko jest zgodne z dokumentacją Microsoftu.
Kod nie wymaga też ShowWindow, okno od razu się pokaże.

0
Azarien napisał(a):

... przy czym jeśli RegisterClass zwróci błąd to i CreateWindow[Ex] też się nie powiedzie
Nie jest to do końca prawda, dla tego funkcje zostali rozdzielone.

1 użytkowników online, w tym zalogowanych: 0, gości: 1