I'm about to trash my computer - Tried to find the problem for hours

I have left some //Comments to help you navigate through the issue

I have Main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd)
{
	Game game;

	game.Initialize(hInst);
	game.MainMenu();

	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return 0;
}



Game.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#pragma once

#define WIN32_LEAN_AND_MEAN

/*Various includes*/

template<class Interface>
inline void SafeRelease(Interface** ppInterfaceToRelease)
{
	if (*ppInterfaceToRelease != NULL)
	{
		(*ppInterfaceToRelease)->Release();

		(*ppInterfaceToRelease) = NULL;
	}
}


class Game{
public:
	Game();
	~Game();

	HRESULT Initialize(HINSTANCE);

	void MainMenu();

	void OnResize(UINT width, UINT height);

	void OnRender();

private:
	static LRESULT CALLBACK WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

private:
	HWND m_hWnd;
	ID2D1Factory* pD2DFactory;
	ID2D1HwndRenderTarget* pRT;

};



And Game.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include "Game.h"
#include <comdef.h>

Game::Game() :
	pD2DFactory(NULL),
	pRT(NULL)
{
}

Game::~Game()
{
	SafeRelease(&pD2DFactory);
	SafeRelease(&pRT);
}

HRESULT Game::Initialize(HINSTANCE hInst)
{
	HRESULT hr;

	// Create factory
	hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory);

	// Create a window class
	WNDCLASSEX wClass;
	ZeroMemory(&wClass,sizeof(WNDCLASSEX));
	wClass.cbClsExtra=NULL;
	wClass.cbSize=sizeof(WNDCLASSEX);
	wClass.cbWndExtra=NULL;
	wClass.hbrBackground=(HBRUSH)COLOR_WINDOW;
	wClass.hCursor=LoadCursor(NULL,IDC_ARROW);
	wClass.hIcon=NULL;
	wClass.hIconSm=NULL;
	wClass.hInstance=hInst;
	wClass.lpfnWndProc=Game::WinProc;
	wClass.lpszClassName="Window Class";
	wClass.lpszMenuName=NULL;
	wClass.style=CS_HREDRAW|CS_VREDRAW;

	m_hWnd=CreateWindowEx(NULL,
			"Window Class",
			"Game", // Replace with gameName
			WS_OVERLAPPEDWINDOW|WS_MAXIMIZE,
			CW_USEDEFAULT,
			CW_USEDEFAULT,
			CW_USEDEFAULT,
			CW_USEDEFAULT,
			NULL,
			NULL,
			hInst,
			NULL);

	RECT rc;
	GetClientRect(m_hWnd,&rc);

	// Creates render target
	if(SUCCEEDED(hr))
	{
		pD2DFactory->CreateHwndRenderTarget(
		D2D1::RenderTargetProperties(),
		D2D1::HwndRenderTargetProperties(
										m_hWnd,
										D2D1::SizeU(
												rc.right - rc.left,
												rc.bottom - rc.top)),
										&pRT);
	}

	ShowWindow(m_hWnd,SW_MAXIMIZE); //When my program gets there, WinProc gets called with the WM_PAINT message. The problem then happens.
	UpdateWindow(m_hWnd);

	return hr;
}

void Game::OnRender()
{
	// The following code will eventually be deleted. It is left for test purpose only.
	HRESULT hr;

	RECT rc;
	GetClientRect(m_hWnd,&rc); // The error happens when my program gets to this line of code.

	ID2D1SolidColorBrush* pBlackBrush = NULL;
			pRT->CreateSolidColorBrush(
				D2D1::ColorF(D2D1::ColorF::White),
				&pBlackBrush);

			pRT->BeginDraw();

			pRT->DrawRectangle(
				D2D1::RectF(
					rc.left + 100.0f,
					rc.top + 100.0f,
					rc.right - 100.0f,
					rc.bottom - 100.0f),
					pBlackBrush);

			hr = pRT->EndDraw();
}

LRESULT Game::WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	if(msg==WM_CREATE)
	{
		LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;
			Game* pGame = (Game*)pcs->lpCreateParams;
			
			::SetWindowLongPtrW(
				hWnd,
				GWLP_USERDATA,
				PtrToUlong(pGame)
				);
	}
	else
	{
		Game* pGame = reinterpret_cast<Game*>(static_cast<LONG_PTR>(
			::GetWindowLongPtrW(
				hWnd,
				GWLP_USERDATA
				)));

		switch(msg)
		{

		case WM_PAINT:
			{
				pGame->OnRender();
				ValidateRect(hWnd, NULL);
			}
			break;

		case WM_SIZE:
			{
				UINT width = LOWORD(lParam);
				UINT height = HIWORD(lParam);
				pGame->OnResize(width, height); //OnResize is called here
			}
			break;

		case WM_DISPLAYCHANGE:
			{
				InvalidateRect(hWnd, NULL, FALSE);
			}
			break;

		case WM_DESTROY:
			{
				//SafeRelease(p2D2Factory);
				PostQuitMessage(0);
				return 0;
			}
			break;
		}
	}

		return DefWindowProc(hWnd,msg,wParam,lParam);
}



I removed some code to make it easier to read. What happens is I get an unhandled exception. For reasons I don't understand, m_hWnd seems to have no value.

I've tried to find the solution for hours. Almost for all day actually. I really need help.

Actually, what I want is to redraw my image upon resize and similar changes.
Last edited on
Please help :'(
I got the answer from StackOverflow. I should have written this instead of NULL at line 50 during the CreateWindowEx function.
Topic archived. No new replies allowed.