view LightClone/Source/Window.cpp @ 53:8cefb65577cc

Clean up world states
author koryspansel
date Fri, 30 Sep 2011 15:23:16 -0700
parents 48705dc6e568
children
line wrap: on
line source

/*
 * Window
 */

#include "Window.h"
#include "VertexTypes.h"

/*
 * kClassName
 */
static const TCHAR* kClassName = L"LightCloneClass";

/*
 * kCaption
 */
static const TCHAR* kCaption = L"LightClone";

/*
 * pInstance
 */
Window* Window::pInstance = NULL;

/*
 * Window
 */
Window::Window(WindowCallback* pHandler) : pCallback(pHandler)
{
	pInstance	= this;
	kWindow		= NULL;
}

/*
 * Initialize
 */
ErrorCode Window::Initialize()
{
	TRACE("Window::Initialize\n");

	HINSTANCE hInstance = GetModuleHandle(NULL);

	WNDCLASSEX kClass;
	kClass.cbSize			= sizeof(WNDCLASSEX);
	kClass.cbClsExtra		= 0;
	kClass.cbWndExtra		= 0;
	kClass.hbrBackground	= (HBRUSH)GetStockObject(BLACK_BRUSH);
	kClass.hCursor			= LoadCursor(NULL, IDC_ARROW);
	kClass.hIcon			= LoadIcon(NULL, IDI_APPLICATION);
	kClass.hIconSm			= LoadIcon(NULL, IDI_APPLICATION);
	kClass.hInstance		= hInstance;
	kClass.lpfnWndProc		= &MessageRouter;
	kClass.lpszClassName	= kClassName;
	kClass.lpszMenuName		= NULL;
	kClass.style			= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;

	TRACE("  Registering window class\n");
	ATOM kAtom = RegisterClassEx(&kClass);
	if(kAtom)
	{
		TRACE("    Success!\n");

		const uint32 nStyleEx	= WS_EX_OVERLAPPEDWINDOW;
		const uint32 nStyle		= WS_OVERLAPPEDWINDOW | WS_VISIBLE;

		RECT kDesktopRectangle;
		//GetClientRect(GetDesktopWindow(), &kDesktopRectangle);
		kDesktopRectangle.left		= 0;
		kDesktopRectangle.top		= 0;
		kDesktopRectangle.right		= GetSystemMetrics(SM_CXSCREEN);
		kDesktopRectangle.bottom	= GetSystemMetrics(SM_CYSCREEN);

		TRACE("Desktop Rectangle:\n");
		TRACE("  Left   : %d\n", kDesktopRectangle.left);
		TRACE("  Top    : %d\n", kDesktopRectangle.top);
		TRACE("  Right  : %d\n", kDesktopRectangle.right);
		TRACE("  Bottom : %d\n", kDesktopRectangle.bottom);

		RECT kRectangle;
		kRectangle.left				= 0;
		kRectangle.top				= 0;
		kRectangle.right			= ScreenSizeX;
		kRectangle.bottom			= ScreenSizeY;

		TRACE("Window Rectangle:\n");
		TRACE("  Left   : %d\n", kRectangle.left);
		TRACE("  Top    : %d\n", kRectangle.top);
		TRACE("  Right  : %d\n", kRectangle.right);
		TRACE("  Bottom : %d\n", kRectangle.bottom);

		AdjustWindowRectEx(&kRectangle, nStyle, FALSE, nStyleEx);

		TRACE("Adjusted Rectangle:\n");
		TRACE("  Left   : %d\n", kRectangle.left);
		TRACE("  Top    : %d\n", kRectangle.top);
		TRACE("  Right  : %d\n", kRectangle.right);
		TRACE("  Bottom : %d\n", kRectangle.bottom);

		int32 nW			= kRectangle.right - kRectangle.left;
		int32 nH			= kRectangle.bottom - kRectangle.top;
		int32 nX			= ((kDesktopRectangle.right - kDesktopRectangle.left) - nW) / 2;
		int32 nY			= ((kDesktopRectangle.bottom - kDesktopRectangle.top) - nH) / 2;

		TRACE("  Creating window\n");
		TRACE("    Position   : (%d, %d)\n", nX, nY);
		TRACE("    Dimensions : (%d, %d)\n", nW, nH);

		kWindow = CreateWindowEx(nStyleEx, kClassName, kCaption, nStyle, nX, nY, nW, nH, NULL, NULL, hInstance, NULL);
		if(kWindow)
		{
			TRACE("    Success!\n");
			UpdateWindow(kWindow);
			ShowWindow(kWindow, SW_SHOW);

			return Error_Success;
		}
	}

	TRACE("  Failed to initialize window!\n");
	return Error_Fail;
}

/* 
 * Terminate
 */
void Window::Terminate()
{
	if(kWindow)
	{
		DestroyWindow(kWindow);
	}
}

/*
 * GetHandle
 */
HWND Window::GetHandle() const
{
	return kWindow;
}

/*
 * MessageRouter
 */
LRESULT CALLBACK Window::MessageRouter(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
	//NOTE: This only works for a single, global window instance
	
	if(pInstance && pInstance->kWindow)
	{
		if(pInstance->pCallback)
		{
			return pInstance->pCallback->OnMessage(pInstance, nMessage, wParam, lParam);
		}
	}

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