Winmain.cpp

C++ source for City Block, 293 lines. Raw file

// winmain.cpp

/*
	Windows OpenGL helper library

	Copyright (c) 1998 Gremlin Interactive Ltd.
	Written by Mark Lord
*/
#define WIN32_LEAN_AND_MEAN
#include "vars.h"
#include "qe_ogl.h"
#include <mmsystem.h> // multimedia shite
#include "winmain.h"

//================================================================

HINSTANCE			g_hInstance;
int					g_nShowCommand;

HWND				g_hWnd = NULL;

char				g_classname[] = "ClassName";
char				g_caption[] = "OpenGL Test Program";
BOOL				g_exitflag;
int					qeQuitFlag;


extern double r1, r2, x, y, z;
extern BOOL moving;

LRESULT CALLBACK WndProc (HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam);
void InitWindowClasses ();
void CreateMainWindow ();
void ProcessMessages ();


void Initialise();
void GameMain(HWND);
void GameDraw(HWND);

BOOL lbutton = FALSE;

int width=800;
int height=600;



//================================================================

/*
====================
WinMain()
	
Entry point
====================
*/
int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/,
	LPTSTR lpCmdLine, int nShowCommand)
{
	// set up globals 
	g_hInstance = hInstance;
	g_nShowCommand = nShowCommand;
	
	// prepare the window 
	InitWindowClasses ();
	CreateMainWindow ();

	// OpenGL is now running, we can do any special one time initialisation
	// here 
	Initialise();
// loop until exit 

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	g_exitflag = FALSE;
	while (! g_exitflag)
	{
		ProcessMessages ();
		GameMain (g_hWnd);
	}
	return 0;
}



/*
====================
InitWindowClasses()
	
Initialise the window classes we need
====================
*/
void InitWindowClasses ()
{
	WNDCLASS		wc;
	
	wc.style			= CS_HREDRAW|CS_VREDRAW|CS_OWNDC;
	wc.lpfnWndProc		= (WNDPROC) WndProc;
	wc.cbClsExtra		= 0;
	wc.cbWndExtra		= 0;
	wc.hInstance		= g_hInstance;
	wc.hCursor			= LoadCursor (NULL, IDC_CROSS);
	wc.hIcon			= LoadIcon (NULL, IDI_APPLICATION);
	wc.hbrBackground	= (HBRUSH) GetStockObject (BLACK_BRUSH);
	wc.lpszMenuName		= NULL;
	wc.lpszClassName	= g_classname;

	
	if (! RegisterClass (&wc))
	{
		MessageBox (NULL, "Failed to register window class.", "Error", MB_OK|MB_ICONSTOP);
		exit (EXIT_FAILURE);
	}
}

/*
====================
CreateMainWindow ()
	
Create and display the main window
====================
*/
void CreateMainWindow ()
{
	HMENU g_hMenu=NULL;
//	g_hMenu=LoadMenu(g_hInstance, MAKEINTRESOURCE(IDR_MENU1));

//// windowed version 
//*	
  RECT rc;
  GetClientRect(GetDesktopWindow(), &rc);
  width = rc.right-rc.left;
  height = rc.bottom-rc.top;

	int xpos=(GetSystemMetrics(SM_CXSCREEN)-width) / 2;
	int ypos=(GetSystemMetrics(SM_CYSCREEN)-height) / 2;

	g_hWnd = CreateWindowEx (0, g_classname, g_caption, 
		WS_POPUP,
		xpos, ypos, width, height,
		NULL, g_hMenu, g_hInstance, NULL);
/*/
//// fullscreen version
	int width=GetSystemMetrics(SM_CXSCREEN);
	int height=GetSystemMetrics(SM_CYSCREEN);
	int xpos=0;
	int ypos=0;

	width=600;
	height=450;
	xpos=(GetSystemMetrics(SM_CXSCREEN)-width) / 2;
	ypos=(GetSystemMetrics(SM_CYSCREEN)-height) / 2;

	g_hWnd = CreateWindowEx (0, g_classname, g_caption, 
		WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_POPUP,
		xpos, ypos, width, height,
		NULL, NULL, g_hInstance, NULL);
//*/


	ShowWindow (g_hWnd, g_nShowCommand);
}



/*
====================
ProcessMessages ()
	
Process all messages that are pending in the event queue
====================
*/
void ProcessMessages ()
{
	MSG				msg;
	while (PeekMessage (&msg, 0, 0, 0, PM_REMOVE))
	{
		if (msg.message == WM_QUIT)
			g_exitflag = TRUE;
			
		TranslateMessage (&msg);
		DispatchMessage (&msg);
	}
}

//================================================================

/*
====================
WndProc()
	
Window procedure for the main window
====================
*/
LRESULT CALLBACK WndProc (HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
{
	HDC				hDC;
	PAINTSTRUCT		ps;
	static char		buf[1024];

  static int mx = 0, my = 0;

	switch (uMessage)
	{
		case WM_CREATE:
			hDC = GetDC (hWnd);
			if (! GL_InitGL (hWnd, hDC))
			{
				MessageBox (NULL, gl_error, "OpenGL Error", MB_OK | MB_ICONSTOP);
				exit (EXIT_FAILURE);
			}

			break;
			
		case WM_PAINT:
			BeginPaint (hWnd, &ps);
			EndPaint (hWnd, &ps);
			GameDraw(hWnd);
			break;
			
		case WM_CLOSE:
			glFinish();
			DestroyWindow (hWnd);
			break;

    case WM_MOUSEMOVE:
      POINT pt;
      GetCursorPos(&pt);

      if(pt.x != width/2 || pt.y != height/2) {
        r1 += (width/2-pt.x);
        r2 -= (height/2-pt.y);
        SetCursorPos(width/2, height/2);
      }

      return 0;

    case WM_LBUTTONDOWN:
      moving = 1;
      SetCapture(hWnd);
      return 0;

    case WM_RBUTTONDOWN:
      moving = -1;
      SetCapture(hWnd);
      return 0;

    case WM_RBUTTONUP:
    case WM_LBUTTONUP:
      moving = 0;
      ReleaseCapture();
      return 0;

		case WM_DESTROY:
			PostQuitMessage (0);
			CloseDownApplication();
			break;
			
		case WM_SIZE:
			GL_Initialise ((signed short)LOWORD (lParam), (signed short)HIWORD (lParam));
			break;
			
		// some very simple switches 
		case WM_CHAR:
			switch ((TCHAR) wParam)
			{
				case VK_ESCAPE:
					PostMessage (hWnd, WM_SYSCOMMAND, SC_CLOSE, 0);
					PostMessage (hWnd, WM_CLOSE, 0, 0);
					break;

			}
			break;

		case WM_ACTIVATEAPP:
			glFinish();
			break;

		default:		
			return DefWindowProc (hWnd, uMessage, wParam, lParam);
	}
	
	return 0;
}

void
CloseDownApplication()
{
	glFinish();
	GL_DoneGL ();
}