⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameapp.cpp

📁 《OpenGL游戏编程》这本书的配套源码。
💻 CPP
字号:
//========================================================
/**
*  @file      GameApp.cpp
*
*  项目描述: 构造游戏引擎
*  文件描述:  应用程序类,完成程序的初始化、
*             窗口的创建,这是最顶层的类
*  适用平台: Windows98/2000/NT/XP
*  
*  作者:     WWBOSS
*  电子邮件:  wwboss123@gmail.com
*  创建日期: 2007-07-26	
*  修改日期: 2007-07-26
*
*/ 
//========================================================


#include "stdafx.h"
#include "GameApp.h"
#include "resource.h"
#include "main.h"


//! 输入法
CIme	m_cIme;

GameApp::GameApp(void){}

GameApp::~GameApp(void)
{
	m_cEngine.Close();
	KillGLWindow();
}



/*! 程序的主循环 */
void GameApp::Run(void)
{
	while(TRUE)
	{
		if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))	
		{
			if(msg.message == WM_QUIT)break;
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else
		{
			m_cEngine.Prepare();
			m_cEngine.Render();
			m_cEngine.SwapBuffer();
		}
	}
}


/**\brief
 * 创建窗口
 *
 *\param	_sWinInfo	窗口信息
 *\return	BOOL		创建是否成功
 */
BOOL GameApp::CreateGLWindow(SWindowInfo _sWinInfo)
{
	m_sWinInfo=_sWinInfo;
	m_sWinInfo.m_hInstance=GetModuleHandle(NULL);

	WNDCLASS	wc;
	DWORD		dwExStyle;
	DWORD		dwStyle;
	RECT		WindowRect;
	WindowRect.left=(long)0;
	WindowRect.right=(long)m_sWinInfo.m_iWidth;
	WindowRect.top=(long)0;
	WindowRect.bottom=(long)m_sWinInfo.m_iHeight;


	wc.style			= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
	wc.lpfnWndProc		= (WNDPROC) WndProc;
	wc.cbClsExtra		= 0;
	wc.cbWndExtra		= 0;
	wc.hInstance		= m_sWinInfo.m_hInstance;
	wc.hIcon			= LoadIcon(NULL, IDI_WINLOGO);
	wc.hCursor			= NULL;//LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground	= NULL;
	wc.lpszMenuName		= NULL;
	wc.lpszClassName	= "OpenGL";

	if (!RegisterClass(&wc))return FALSE;
	
	if (m_sWinInfo.m_bFullScreen)
	{
		DEVMODE dmScreenSettings;
		memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
		dmScreenSettings.dmSize=sizeof(dmScreenSettings);
		dmScreenSettings.dmPelsWidth	= m_sWinInfo.m_iWidth;
		dmScreenSettings.dmPelsHeight	= m_sWinInfo.m_iHeight;
		dmScreenSettings.dmBitsPerPel	= m_sWinInfo.m_iBits;
		dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

		if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
		{
			
			if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
			{
				m_sWinInfo.m_bFullScreen=FALSE;
			}
			else
			{
				MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);
				return FALSE;
			}
		}
	}

	if (m_sWinInfo.m_bFullScreen)
	{
		dwExStyle=WS_EX_APPWINDOW;
		dwStyle=WS_POPUP;
	}
	else
	{
		dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
		dwStyle=WS_OVERLAPPEDWINDOW;
	}

	AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);

	if (!(m_sWinInfo.m_hWnd=CreateWindowEx(dwExStyle,
								"OpenGL",
								m_sWinInfo.m_strWinName,
								dwStyle|
								WS_CLIPSIBLINGS|
								WS_CLIPCHILDREN,
								0, 0,
								WindowRect.right-WindowRect.left,
								WindowRect.bottom-WindowRect.top,
								NULL,NULL,
								m_sWinInfo.m_hInstance,
								NULL)))
	{
		KillGLWindow();
		return FALSE;
	}
	ShowWindow(m_sWinInfo.m_hWnd,SW_SHOW);
	SetForegroundWindow(m_sWinInfo.m_hWnd);
	SetFocus(m_sWinInfo.m_hWnd);
	
	return TRUE;
}


/*! 窗口消息处理函数 */
LRESULT WINAPI GameApp::MessageHandler(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	switch(message)
	{
		case WM_ACTIVATE:  
		{
			if (!HIWORD(wParam))
				m_bActive = TRUE;
			else
				m_bActive=FALSE;
		
			return 0;
	    }

		case WM_CLOSE:
		case WM_DESTROY:
			PostQuitMessage(0);return 0;

		case WM_CREATE:return 0;

		case WM_SIZE:
		{
			m_cEngine.SetProjection(45,1);
			return 0;
		}
		///////////////////////////////////
		//-----下面的用来处理输入法--------
		case WM_KEYDOWN:
			switch( wParam )
			{
				case VK_LEFT:	m_cIme.LeftKey();break;
				case VK_RIGHT:	m_cIme.RightKey();break;
				case VK_DELETE:	m_cIme.DeleteKey();break;
				case VK_RETURN:	m_cIme.ReturnKey();break;
				default:break;
			}
			break;

		case WM_CHAR:		//!IME消息
			m_cIme.ReceiveChar(wParam);
			break;

		//case WM_IME_SETCONTEXT:
		//	return m_cIme.OnWM_IME_SETCONTEXT()? 0 : DefWindowProc(hWnd, message, wParam, lParam);

		case WM_INPUTLANGCHANGEREQUEST:
			return m_cIme.OnWM_INPUTLANGCHANGEREQUEST()? 0 : DefWindowProc(hWnd, message, wParam, lParam);

		case WM_IME_STARTCOMPOSITION:
			return m_cIme.OnWM_IME_STARTCOMPOSITION()? 0 : DefWindowProc(hWnd, message, wParam, lParam);

		case WM_IME_ENDCOMPOSITION:
			return m_cIme.OnWM_IME_ENDCOMPOSITION()? 0 : DefWindowProc(hWnd, message, wParam, lParam);

		//case WM_IME_NOTIFY:
		//	return m_cIme.OnWM_IME_NOTIFY( m_sWinInfo.m_hWnd, wParam )? 0 : DefWindowProc(hWnd, message, wParam, lParam);
	
		case WM_IME_COMPOSITION:
			return m_cIme.OnWM_IME_COMPOSITION( m_sWinInfo.m_hWnd, lParam )? 0 : DefWindowProc(hWnd, message, wParam, lParam);

		case WM_INPUTLANGCHANGE:
			return m_cIme.OnWM_INPUTLANGCHANGE( m_sWinInfo.m_hWnd )? 0 : DefWindowProc(hWnd, message, wParam, lParam);

		case WM_SYSCOMMAND:
			return ( wParam == SC_KEYMENU )? 0 : DefWindowProc(hWnd, message, wParam, lParam);
	}

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



/*! 初始化程序,窗口、输入等 */
BOOL GameApp::Init(SWindowInfo _sWinInfo)
{
	if(!CreateGLWindow(_sWinInfo))
	{
		_ERROR("create window fail!");
		return FALSE;
	}

	if(!m_cEngine.Init())
	{
		_ERROR("failed to init opengl!");
		return FALSE;
	}

	return TRUE;
}



/*! 销毁窗口 */
void GameApp::KillGLWindow(void)
{
	if (m_sWinInfo.m_bFullScreen)ChangeDisplaySettings(NULL,0);

	if (m_sWinInfo.m_hWnd && !DestroyWindow(m_sWinInfo.m_hWnd))m_sWinInfo.m_hWnd=NULL;

	if (!UnregisterClass("OpenGL",m_sWinInfo.m_hInstance))m_sWinInfo.m_hInstance=NULL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -