[C++/DirectX11] Windows-Fenster erstellen

XoR_1337

Mitglied
Hallo allerseits.

Seit kurzem beschäftige ich mich mit DirectX11 und habe mir deshalb ein Buch dafür gekauft, doch schon beim zweiten Kapitel, welches sich der Erstellung und Anzeige eines Windows-Fensters widmet scheitere ich.

Ich habe den Code aus dem Buch abgeschrieben, dennoch will es kein Fenster anzeigen :(
(leider keine CD vorhanden von der ich den Code kopieren könnte).

Der Compiler beendet das Programm mit dem Code -2, deshalb muss der Fehler zwischen Zeile 24 und 30 sein, doch ich finde ihn nicht.

Hier mein Code:
Code:
#include <Windows.h>


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


int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE prevInstance, LPWSTR cmdLine, int cmdShow) {

	UNREFERENCED_PARAMETER(prevInstance);
	UNREFERENCED_PARAMETER(cmdLine);

	WNDCLASSEX wndClass = {0};
	wndClass.cbSize = sizeof(WNDCLASSEX);
	wndClass.style = CS_HREDRAW | CS_VREDRAW;
	wndClass.lpfnWndProc = WndProc;
	wndClass.hInstance = hInstance;
	wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
	wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wndClass.lpszMenuName = NULL;
	wndClass.lpszClassName = "DX11BookWindowClas";

	if(!RegisterClassEx(&wndClass))
		return -1;

	RECT rc = {0, 0, 640, 480};
	AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);

	HWND hwnd = CreateWindowA("DX11BookWindowClass", "Blank Win32 Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
								rc.right - rc.left, rc.bottom - rc.top, NULL, NULL, hInstance, NULL);

	if(!hwnd)
		return -2;

	ShowWindow(hwnd, cmdShow);


	
	MSG msg = {0};

	while(msg.message != WM_QUIT) {

		if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {

			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else {

			//GameLoop
		}
	}


	return 0;
}


LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {

	PAINTSTRUCT paintStruct;
	HDC hDC;

	switch(message) {

		case WM_PAINT:
			hDC = BeginPaint(hwnd, &paintStruct);
			EndPaint(hwnd, &paintStruct);
			break;

		case WM_DESTROY:
			PostQuitMessage(0);
			break;

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

	return 0;
}

Sicherheitshalber auch noch die Compilermeldung:
Code:
"BlankWindow.exe": "XXXXXXXXXX\Debug\BlankWindow.exe" geladen, Symbole wurden geladen.
"BlankWindow.exe": "C:\Windows\SysWOW64\ntdll.dll" wurde geladen
"BlankWindow.exe": "C:\Windows\SysWOW64\kernel32.dll" wurde geladen
"BlankWindow.exe": "C:\Windows\SysWOW64\KernelBase.dll" wurde geladen
"BlankWindow.exe": "C:\Windows\SysWOW64\user32.dll" wurde geladen
"BlankWindow.exe": "C:\Windows\SysWOW64\gdi32.dll" wurde geladen
"BlankWindow.exe": "C:\Windows\SysWOW64\lpk.dll" wurde geladen
"BlankWindow.exe": "C:\Windows\SysWOW64\usp10.dll" wurde geladen
"BlankWindow.exe": "C:\Windows\SysWOW64\msvcrt.dll" wurde geladen
"BlankWindow.exe": "C:\Windows\SysWOW64\advapi32.dll" wurde geladen
"BlankWindow.exe": "C:\Windows\SysWOW64\sechost.dll" wurde geladen
"BlankWindow.exe": "C:\Windows\SysWOW64\rpcrt4.dll" wurde geladen
"BlankWindow.exe": "C:\Windows\SysWOW64\sspicli.dll" wurde geladen
"BlankWindow.exe": "C:\Windows\SysWOW64\cryptbase.dll" wurde geladen
"BlankWindow.exe": "C:\Windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb\msvcr90d.dll" wurde geladen
"BlankWindow.exe": "C:\Windows\SysWOW64\imm32.dll" wurde geladen
"BlankWindow.exe": "C:\Windows\SysWOW64\msctf.dll" wurde geladen
"BlankWindow.exe": "C:\Windows\SysWOW64\uxtheme.dll" wurde geladen
Das Programm "[8524] BlankWindow.exe: Systemeigen" wurde mit Code -2 (0xfffffffe) beendet.


Wenn ich nun den Code aus Zeile 31 und 32 entferne, wird keine Fehlermeldung seitens des Compilers ausgegeben, sondern schlichtweg kein Fenster angezeigt und nach ca. 1sec das Programm fehlerlos beendet.


Ich bedanke mich wie immer bei allen im Vorraus! :)

MFG XoR_1337
 
Der Class-Name in der WINDOWCLASS und bei CreateWindow stimmen nicht überein!


Tip#1: Das return DefWindowProc würde ich immer nach dem Switch hinpacken. Es wird Messages geben, die du handeln willst, die aber auch an DefWindowProc weitergereicht werden müssen. Return 0 ist NICHT für alle Messages geeignet.

Tip#2: Keine Variablen in WindowProc global anlegen (paintStruct, hDC). Die werden bei jeder einzelnen Message neu am Stack angelegt und wieder runtergeworfen. Pack die lieber lokal bei der Message rein, die diese benötigt.
 
Ups, wie peinlich :-(.
Habe nur ständig den Code zwischen 24 und 30 kontrolliert, da ich davon ausgegangen bin, dass der obige Code stimmt, da das Programm nicht mit -1 beendet wird :-(.
Zudem ein Dankeschön für die Tipps, die du mir mit auf den Weg gibst. Hatte den Code wie gesagt aus dem Buch und deshalb nicht auf Optimierung geachtet.

Alles in Allem ein großes Dankeschön! Hast mir weitere nervige Stunden erspaart, in denen ich nach dem Fehler suche.
 
Zurück