www.pudn.com > opengl_mf.rar > mf.cpp, change:2009-06-10,size:24270b


#define WM_TOGGLEFULLSCREEN (WM_USER+1)									// 定义全屏/窗口切换消息 
#define TIMER1		101													// 定义时钟代号,设置为101号 
#define TITLE		_TEXT("This is 第八题--魔方")								// 定义窗口标题 
#define CLASSNAME	_TEXT("5DG_OPENGL")									// 定义窗口类名 
#define	WIDTH		640													// 定义窗口宽度 
#define HEIGHT		480													// 定义窗口高度 
#define BPP			16													// 定义每象素的位数 
 
// 在此处引用程序要求的头文件: 
#include <windows.h>													// Windows的头文件 
#include<TChar.h> 
#include <gl\gl.h>														// OpenGL32库的头文件 
#include <gl\glu.h>														// Glu32库的头文件 
#include <gl\glaux.h> 
 
// 在此处加入程序要求的库到链接器中: 
#pragma comment( lib, "opengl32.lib" )									// 链接时查找OpenGL32.lib 
#pragma comment( lib, "glu32.lib" )										// 链接时查找glu32.lib 
#pragma comment(lib, "glaux.lib")										// 链接时查找glaux.lib 
 
 
// 在此处定义与窗口相关的结构体: 
typedef struct {														// 定义处理键盘的结构体 
	BOOL keyDown [256];													// 存储键盘按键状态的数组 
} Keys; 
 
typedef struct {														// 定义存储应用程序实例的结构体 
	HINSTANCE		hInstance;											// 应用程序实例 
	const TCHAR*		className;											// 应用程序类名 
} Application; 
 
typedef struct {														// 定义初始化窗口所需信息 
	Application*	application;										// 所属的应用程序 
	TCHAR*			title;												// 窗口标题 
	int				width;												// 窗口宽度 
	int				height;												// 窗口高度 
	int				bitsPerPixel;										// 每像素的位数 
	BOOL			isFullScreen;										// 是否全屏 
} GL_WindowInit; 
 
typedef struct {														// 定义窗口结构体 
	Keys*			keys;												// 键盘 
	HWND			hWnd;												// 窗口句柄 
	HDC				hDC;												// 设备描述表 
	HGLRC			hRC;												// 绘制描述表 
	GL_WindowInit	init;												// 提供Window初始化信息的结构体 
} GL_Window; 
 
// 此代码模块中包含的函数的前向声明: 
BOOL Initialize(GL_Window* window, Keys* keys);							// 设置你绘制前的初始化值 
void DrawSceneGL(void);													// 在这里完成场景的绘制 
void Update(void);														// 在此处更新对消息的动作 
void Deinitialize(void);												// 在此处做退出前扫尾工作 
 
// 在此处定义全局变量: 
GL_Window*	OGL_window;													// 存储窗口信息 
Keys*		OGL_keys;													// 存储按键信息 
GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f }; 					// 环境光参数 
GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };						// 漫射光参数 
GLfloat LightSpecular[] = {1.0f, 1.0f, 1.0f, 1.0f};					// 定义镜面反射光的颜色 
GLfloat LightPosition[]= { -1.0f, -1.0f, 1.0f, 1.0f };					// 光源位置 
static GLfloat colorR = 0.8f; 
static GLfloat colorG = 0.8f; 
static GLfloat colorB = 0.8f;		 
GLfloat angle_X = 45.0f;												// 绕X轴的旋转角度 
GLfloat angle_Y = 45.0f;												// 绕Y轴的旋转角度 
 
void ResizeWindowGL(int width, int height)								// 重新设置窗口大小 
{ 
	glViewport(0, 0, (GLsizei)(width), (GLsizei)(height));				// 重置当前视口大小 
	glMatrixMode(GL_PROJECTION);										// 切换到投影矩阵模式 
	glLoadIdentity();													// 重置投影矩阵 
	gluPerspective(45, (float)width/(float)height, 0.1, 100);			// 设置透视投影 
	glMatrixMode(GL_MODELVIEW);											// 切换到模型视图矩阵 
	glLoadIdentity();													// 重置模型视图矩阵 
} 
 
BOOL ChangeScreenResolution(int width, int height, int bitsPerPixel)	// 修改屏幕分辨率 
{ 
	DEVMODE dmScreenSettings;											// 设备设置模式  
	ZeroMemory(&dmScreenSettings, sizeof(DEVMODE));						// 清空 
	dmScreenSettings.dmSize			= sizeof(DEVMODE);					// Devmode结构的大小 
	dmScreenSettings.dmPelsWidth	= width;							// 设置为屏幕宽度 
	dmScreenSettings.dmPelsHeight	= height;							// 设置为屏幕高度 
	dmScreenSettings.dmBitsPerPel	= bitsPerPixel;						// 设为指定位长; 
	dmScreenSettings.dmFields		= DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; 
	// 尝试设置显示模式并返回结果。注: CDS_FULLSCREEN 移去了状态栏 
	if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) 
	{ 
		return FALSE;													// 分辨率修改失败,返回 False 
	} 
	return TRUE;														// 分辨率修改成功,返回 True; 
} 
 
BOOL CreateWindowGL(GL_Window* window)									// 建立OpenGL窗口 
{ 
	DWORD windowStyle = WS_OVERLAPPEDWINDOW;							// 设置窗口样式 
	DWORD windowExtendedStyle = WS_EX_APPWINDOW;						// 设置窗口扩展样式 
 
	PIXELFORMATDESCRIPTOR pfd =											// 像素格式描述符(pfd)的设置 
	{ 
		sizeof(PIXELFORMATDESCRIPTOR),									// 像素的尺寸 
		1,																// 版本号 
		PFD_DRAW_TO_WINDOW |											// pfd必须支持窗口绘制 
		PFD_SUPPORT_OPENGL |											// pfd必须支持OpenGL 
		PFD_DOUBLEBUFFER,												// pfd必须支持双缓存 
		PFD_TYPE_RGBA,													// 像素格式为RGBA 
		window->init.bitsPerPixel,										// 设置颜色深度 
		0, 0, 0, 0, 0, 0,												// 忽略颜色位数 
		0,																// 无Alpha缓存 
		0,																// 忽略偏移位 
		0,																// 无累积缓存 
		0, 0, 0, 0,														// 忽略累积缓存位  
		16,																// 深度缓存为16位  
		0,																// 无模板缓存 
		0,																// 无辅助缓存 
		PFD_MAIN_PLANE,													// 主要绘制层 
		0,																// 保留位 
		0, 0, 0															// 忽略层遮罩 
	}; 
 
	RECT windowRect = {0, 0, window->init.width, window->init.height};	// 定义窗口大小 
 
	GLuint PixelFormat;													// 保存像素格式 
 
	if (window->init.isFullScreen == TRUE)								// 切换全屏 
	{ 
		if (ChangeScreenResolution(window->init.width, window->init.height, window->init.bitsPerPixel) == FALSE) 
		{ 
			// 全屏切换失败 
			MessageBox(HWND_DESKTOP,_TEXT("无法切换到全屏模式,在窗口模式下运行.\nMode Switch Failed,Running In Windowed Mode."), _TEXT("Error"), MB_OK | MB_ICONEXCLAMATION); 
			window->init.isFullScreen = FALSE;							// 设置 isFullscreen 为False 
		} 
		else															// 全屏切换成功 
		{ 
			ShowCursor (FALSE);											// 隐藏鼠标 
			windowStyle = WS_POPUP;										// 设置窗口样式 
			windowExtendedStyle |= WS_EX_TOPMOST;						// 设置窗口扩展样式 
		} 
	} 
	else															 
	{ 
		// 调整窗口大小,包括窗口边界 
		AdjustWindowRectEx(&windowRect, windowStyle, 0, windowExtendedStyle); 
	} 
 
	// 开始创建 OpenGL 窗口 
	window->hWnd = CreateWindowEx(windowExtendedStyle,					// 窗口扩展样式 
									window->init.application->className,// 应用程序类名 
									window->init.title,					// 窗口标题 
									windowStyle,						// 窗口样式 
									0, 0,								// 窗口的 X,Y 坐标位置 
									windowRect.right - windowRect.left,	// 窗口宽度 
									windowRect.bottom - windowRect.top,	// 窗口高度 
									HWND_DESKTOP,						// 父窗口为桌面 
									0,									// 无菜单 
									window->init.application->hInstance,// 传入应用程序实例  
									window); 
 
	if (window->hWnd == 0)												// 窗口是否成功创建 
	{ 
		return FALSE;													// 若失败,则返回FALSE 
	} 
 
	window->hDC = GetDC(window->hWnd);									// 取得当前窗口的设备描述表 
	if (window->hDC == 0)												// 若未得到设备描述表 
	{ 
		DestroyWindow(window->hWnd);									// 销毁该窗口 
		window->hWnd = 0;												// 窗口句柄清零 
		return FALSE;													// 返回FALSE 
	} 
 
	PixelFormat = ChoosePixelFormat(window->hDC, &pfd);					// 选择兼容的像素格式 
	if (PixelFormat == 0)												// 若选择失败 
	{ 
		ReleaseDC(window->hWnd, window->hDC);							// 释放设备描述表 
		window->hDC = 0;												// 将设备描述表清零 
		DestroyWindow(window->hWnd);									// 销毁窗口 
		window->hWnd = 0;												// 窗口句柄清零 
		return FALSE;													// 返回FALSE 
	} 
 
	if (SetPixelFormat(window->hDC, PixelFormat, &pfd) == FALSE)		// 设置像素格式并判断是否失败 
	{ 
		ReleaseDC(window->hWnd, window->hDC);							// 释放设备描述表 
		window->hDC = 0;												// 将设备描述表清零 
		DestroyWindow(window->hWnd);									// 销毁窗口 
		window->hWnd = 0;												// 窗口句柄清零 
		return FALSE;													// 返回FALSE 
	} 
 
	window->hRC = wglCreateContext(window->hDC);						// 取得绘制描述表 
	if (window->hRC == 0)												// 若未得到绘制描述表 
	{ 
		ReleaseDC(window->hWnd, window->hDC);							// 释放设备描述表  
		window->hDC = 0;												// 将设备描述表清零 
		DestroyWindow(window->hWnd);									// 销毁窗口 
		window->hWnd = 0;												// 窗口句柄清零 
		return FALSE;													// 返回FALSE 
	} 
 
	if (wglMakeCurrent(window->hDC, window->hRC) == FALSE)				// 设置绘制描述表并判断是否失败 
	{ 
		wglDeleteContext(window->hRC);									// 删除绘制描述表 
		window->hRC = 0;												// 将绘制描述表清零 
		ReleaseDC(window->hWnd, window->hDC);							// 释放设备描述表 
		window->hDC = 0;												// 将设备描述表清零 
		DestroyWindow(window->hWnd);									// 销毁窗口 
		window->hWnd = 0;												// 窗口句柄清零 
		return FALSE;													// 返回FALSE 
	} 
 
	ShowWindow(window->hWnd, SW_NORMAL);								// 显示窗口 
	ResizeWindowGL(window->init.width, window->init.height);			// 重设窗口 
	ZeroMemory(window->keys, sizeof (Keys));							// 清空键盘缓冲区 
 
	return TRUE;														// 窗口创建成功 
} 
 
BOOL DestroyWindowGL(GL_Window* window)									// 销毁窗口并释放程序所用的资源 
{ 
	if (window->hWnd != 0)												// 窗口释放有句柄? 
	{	 
		if (window->hDC != 0)											// 窗口是否有得到绘制描述表? 
		{ 
			wglMakeCurrent(window->hDC, 0);								// 将当前描述表指针置为0 
			if (window->hRC != 0)										// 该窗口是否有绘制描述表 
			{ 
				wglDeleteContext(window->hRC);							// 释放绘制描述表 
				window->hRC = 0;										// 将绘制描述表清零 
			} 
			ReleaseDC(window->hWnd, window->hDC);						// 释放设备描述表 
			window->hDC = 0;											// 将设备描述表清零 
		} 
		DestroyWindow(window->hWnd);									// 销毁窗口 
		window->hWnd = 0;												// 将窗口句柄清零 
	} 
 
	if (window->init.isFullScreen)										// 若窗口在全屏模式下 
	{ 
		ChangeDisplaySettings(NULL ,0);									// 切换为桌面分辨率 
		ShowCursor(TRUE);												// 显示鼠标 
	}	 
	return TRUE;														// 返回TRUE 
} 
 
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)// 窗口消息处理 
{ 
 
	GL_Window* window = (GL_Window*)(GetWindowLong(hWnd, GWL_USERDATA));// 取得窗口信息 
 
	switch (uMsg)														// 取得Window的消息 
	{ 
	case WM_SYSCOMMAND:													// 截取系统命令 
		{ 
			switch (wParam)												// 监听系统调用 
			{ 
			case SC_SCREENSAVE:											// 要运行屏保? 
			case SC_MONITORPOWER:										// 显示器进入节电模式? 
				return 0;												// 提前返回0,防止系统调用执行 
			} 
			break;														// 退出 
		} 
 
	case WM_CREATE:														// 创建窗口 
		{ 
			CREATESTRUCT* creation = (CREATESTRUCT*)(lParam);			// 保存窗口结构指针 
			window = (GL_Window*)(creation->lpCreateParams); 
			SetWindowLong(hWnd, GWL_USERDATA, (LONG)(window));			// 改变窗口属性 
			return 0;													// 返回 
		} 
 
	case WM_TIMER:														// TIMER事件 
		{ 
			InvalidateRect(window->hWnd, NULL, FALSE);					// 使窗口失效 
			break; 
		}	 
 
	case WM_PAINT:														// PAINT消息处理,在此处绘图 
		{	 
			DrawSceneGL();												// 在此处绘图 
			SwapBuffers(window->hDC);									// 交换缓存 
			ValidateRect(window->hWnd, NULL);							// 使窗口有效 
			break; 
		}	 
 
	case WM_CLOSE:														// 关闭窗口 
		{ 
			PostMessage(window->hWnd, WM_QUIT, 0, 0);					// 结束程序 
			return 0; 
		} 
 
	case WM_SIZE:														// 窗口大小变化 
		{ 
			ResizeWindowGL(LOWORD(lParam), HIWORD(lParam));				// 修改窗口大小为 Width = LoWord, Height = HiWord 
			return 0;													// 返回 
		} 
 
	case WM_KEYDOWN:													// 按键按下时更新键盘缓冲 
		if ((wParam >= 0) && (wParam = 255))							// 按键是否合法? 
		{ 
			window->keys->keyDown[wParam] = TRUE;						// 设相应键为 True 
			return 0;													// 返回 
		} 
		break;															// 退出 
 
	case WM_KEYUP:														// 按键松开时更新键盘缓冲 
		if ((wParam >= 0) && (wParam = 255))							// 按键是否合法? 
		{ 
			window->keys->keyDown[wParam] = FALSE;						// 设相应键为为 FALSE 
			return 0;													// 返回 
		} 
		break;															// 退出 
 
	case WM_TOGGLEFULLSCREEN:											// 开关全屏模式 
		{ 
			Deinitialize();												// 做扫尾工作 
			DestroyWindowGL(window);									// 销毁窗口 
			window->init.isFullScreen = !window->init.isFullScreen;		// 改变窗口模式 
			CreateWindowGL(window);										// 重新创建窗口 
			Initialize(window, window->keys);							// 初始化OpenGL绘制程序 
			break;														// 退出 
		} 
 
	default: 
		break; 
	} 
 
	return DefWindowProc(hWnd, uMsg, wParam, lParam);					// 将本程序不处理的消息传给 DefWindowProc  
} 
 
BOOL RegisterWindowClass(Application* application)						// 为本应用程序注册一个类 
{	 
	WNDCLASSEX windowClass;												// 窗口类 
	ZeroMemory (&windowClass, sizeof(WNDCLASSEX));						// 清空内存 
	windowClass.cbSize		= sizeof(WNDCLASSEX);						// 窗口类的大小 
	windowClass.style		= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;		// 在窗口移动,改变大小的时候重绘  
	windowClass.lpfnWndProc		= (WNDPROC)(WindowProc);				// 用WindowProc函数处理消息 
	windowClass.hInstance		= application->hInstance;				// 设置实例 
	windowClass.hbrBackground	= (HBRUSH)(COLOR_APPWORKSPACE);			// 类背景的画刷颜色 
	windowClass.hCursor			= LoadCursor(NULL, IDC_ARROW);			// 载入鼠标指针 
	windowClass.lpszClassName	= application->className;				// 设置应用程序的类名 
	if (RegisterClassEx(&windowClass) == 0)								// 注册类失败? 
	{ 
		MessageBox(HWND_DESKTOP,_TEXT("应用程序类注册失败!\nRegisterClassEx Failed!"), _TEXT("Error"), MB_OK | MB_ICONEXCLAMATION); 
		return FALSE;													// 返回False (注册失败) 
	} 
	return TRUE;														// 返回True (注册成功) 
} 
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
	Application	application;											// 应用程序 
	GL_Window	window;													// 窗口 
	Keys		keys;													// 键盘按键 
	MSG			msg;													// Window消息 
	BOOL		bRet;													// 保存消息获得是否成功 
 
	// 给应用程序赋值 
	application.className =CLASSNAME;									// 程序类名字 
	application.hInstance = hInstance;									// 程序入口 
 
	// 窗口相关信息设置 
	ZeroMemory(&window, sizeof(GL_Window));								// 清零窗口变量的内存空间 
	window.keys					= &keys;								// 设置按键 
	window.init.application		= &application;							// 设置窗口程序 
	window.init.title			= TITLE;								// 设置标题 
	window.init.width			= WIDTH;								// 设置窗口宽度 
	window.init.height			= HEIGHT;								// 设置窗口高度 
	window.init.bitsPerPixel	= BPP;									// 设置每像素的位数 
	window.init.isFullScreen	= FALSE;								// 设置初始窗口是否全屏否(FALSE) 
	ZeroMemory(&keys, sizeof(Keys));									// 键盘缓冲清零 
 
	if (RegisterWindowClass(&application) == FALSE)						// 注册类是否失败 
	{ 
		MessageBox(HWND_DESKTOP,_TEXT( "窗口类注册失败!\nError Registering Window Class!"), _TEXT("Error"), MB_OK | MB_ICONEXCLAMATION); 
		return -1;														// 结束程序 
	} 
 
	if (CreateWindowGL(&window) == TRUE)								// 创建窗口是否成功 
	{	 
		if (Initialize(&window, &keys) == FALSE)						// 初始化OpenGL绘制程序 
		{ 
			PostMessage(window.hWnd, WM_QUIT, 0, 0);					// 抛出消息WM_QUIT 
		} 
	} 
	else 
	{ 
		return 0;														// 退出程序 
	} 
 
	while ((bRet = GetMessage(&msg, NULL, 0, 0) != 0))					// 循环直到收到消息为WM_QUIT 
	{ 
		if (bRet != -1)													 
		{ 
			Update();													// 更新处理消息事件 
			TranslateMessage(&msg);										// 传递消息 
			DispatchMessage(&msg);										// 分派消息 
		} 
		else 
		{ 
			break;														// 退出循环 
		} 
	} 
	// 退出消息循环,准备退出程序 
	Deinitialize();														// 做退出前的扫尾工作 
	DestroyWindowGL(&window);											// 销毁窗口	 
	UnregisterClass(application.className, application.hInstance);		// 注销窗口类 
	return 0;															// 退出程序 
} 
 
BOOL Initialize(GL_Window* window, Keys* keys)							// 用户绘制场景相关的函数在此处定义 
{ 
	// 设置全局变量 
	OGL_window	= window; 
	OGL_keys	= keys; 
 
	// 建立时钟 
	SetTimer(window->hWnd, TIMER1, 33, NULL); 
 
	// 在此处初始化绘制场景 
	glClearColor(0.0f, 0.0f, 0.0f, 0.5f);								// 清屏为黑色 
	glClearDepth(1.0f);													// 设置深度缓存 
	glDepthFunc(GL_LEQUAL);												// 选择深度测试方式 
	glEnable(GL_DEPTH_TEST);											// 开启深度测试 
	glShadeModel(GL_SMOOTH);											// 阴暗处理采用平滑方式 
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);					// 最精细的透视计算 
 
	glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);						// 设置环境光 
	glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);						// 设置漫射光 
	glLightfv(GL_LIGHT1, GL_SPECULAR, LightSpecular); 
	glLightfv(GL_LIGHT0, GL_POSITION,LightPosition);					// 设置光源 
	glEnable(GL_LIGHTING); 
	glEnable(GL_LIGHT0);												// 启用0号光 
 
	return TRUE;														// 初始化成功返回TRUE 
} 
 
// 画圆角 
void DrawCorner(GLfloat x, GLfloat y, GLfloat z) 
{ 
	glPushMatrix(); 
		glTranslatef(x, y, z); 
		auxSolidSphere(0.1f); 
	glPopMatrix(); 
} 
 
// 画沿圆边 
void DrawBar(GLfloat tx, GLfloat ty, GLfloat tz, GLfloat angle = 0.0f,  
			  GLfloat rx = 0.0f, GLfloat ry = 0.0f, GLfloat rz = 0.0f) 
{ 
	glPushMatrix(); 
		glTranslatef(tx, ty, tz); 
		glRotatef(angle, rx, ry, rz); 
		auxSolidCylinder(0.1f, 1.0f); 
	glPopMatrix(); 
} 
 
// 画面 
void DrawFace(GLfloat tx, GLfloat ty, GLfloat tz, GLfloat r, GLfloat g, GLfloat b, GLfloat angle = 0.0f, GLfloat rx = 0.0f,  
			  GLfloat ry = 0.0f, GLfloat rz = 0.0f) 
{ 
	glPushMatrix(); 
		glTranslatef(tx, ty, tz); 
		glRotatef(angle, rx, ry, rz); 
		GLfloat material[] = {r, g, b }; 
        glMaterialfv(GL_FRONT, GL_DIFFUSE, material); 
		auxSolidBox(1.0f, 1.0f, 0.1f); 
	glPopMatrix(); 
} 
 
// 画魔方中的小方块 
void DrawCube(GLfloat tx, GLfloat ty, GLfloat tz, GLfloat angle, GLfloat rx, GLfloat ry,  
			  GLfloat rz, GLfloat r1, GLfloat g1, GLfloat b1, GLfloat r2, GLfloat g2,  
			  GLfloat b2, GLfloat r3 = 0.8f, GLfloat g3 = 0.8f, GLfloat b3 = 0.8f) 
{ 
	glPushMatrix(); 
	glTranslatef(tx, ty, tz); 
	glRotatef(angle, rx, ry, rz); 
	glColor3f(colorR, colorG, colorB); 
	// 画沿 X 轴的杠 
	DrawBar(1.0f, 0.0f, 0.0f, 90.0f, 0.0f, 0.0f, 1.0f); 
	DrawBar(1.0f, -1.0f, 0.0f, 90.0f, 0.0f, 0.0f, 1.0f); 
	DrawBar(1.0f, 0.0f, -1.0f, 90.0f, 0.0f, 0.0f, 1.0f); 
	DrawBar(1.0f, -1.0f, -1.0f, 90.0f, 0.0f, 0.0f, 1.0f); 
 
	// 画沿 Y 轴的杠 
	DrawBar(0.0f, -1.0f, 0.0f); 
	DrawBar(1.0f, -1.0f, 0.0f); 
	DrawBar(0.0f, -1.0f, -1.0f); 
	DrawBar(1.0f, -1.0f, -1.0f); 
	 
	// 画沿 Z 轴的杠 
	DrawBar(0.0f, 0.0f, -1.0f, 90.0f, 1.0f); 
	DrawBar(1.0f, 0.0f, -1.0f, 90.0f, 1.0f); 
	DrawBar(0.0f, -1.0f, -1.0f, 90.0f, 1.0f); 
	DrawBar(1.0f, -1.0f, -1.0f, 90.0f, 1.0f); 
 
	// 画圆角 
	auxSolidSphere(0.1f); 
	DrawCorner(1.0f, 0.0f, 0.0f); 
	DrawCorner(1.0f, -1.0f, 0.0f); 
	DrawCorner(0.0f, -1.0f, 0.0f); 
	DrawCorner(0.0f, 0.0f, -1.0f); 
	DrawCorner(1.0f, 0.0f, -1.0f); 
	DrawCorner(1.0f, -1.0f, -1.0f); 
	DrawCorner(0.0f, -1.0f, -1.0f); 
 
	// 画面 
	DrawFace(0.5f, -0.5f, 0.05f, r1, g1, b1); 
	DrawFace(0.5f, -0.5f, -1.05f, colorR, colorG, colorB); 
	DrawFace(-0.05f, -0.5f, -0.5f, r2, g2, b2, 90.0f, 0.0f, 1.0f, 0.0f); 
	DrawFace(1.05f, -0.5f, -0.5f, colorR, colorG, colorB, 90.0f, 0.0f, 1.0f, 0.0f); 
	DrawFace(0.5f, 0.05f, -0.5f, r3, g3, b3, 90.0f, 1.0f, 0.0f, 0.0f); 
	DrawFace(0.5f, -0.55f, -0.5f, colorR, colorG, colorB, 90.0f, 1.0f, 0.0f, 0.0f); 
	glPopMatrix(); 
} 
 
// 画出整个魔方 
void DrawMagicCube() 
{ 
	GLfloat redR = 1.0f, redG = 0.0f, redB = 0.0f, 
			yelR = 1.0f, yelG = 1.0f, yelB = 0.0f,  
			greR = 0.0f, greG = 1.0f, greB = 0.0f,  
			oraR = 0.99f, oraG = 0.68f, oraB = 0.32f,  
			bluR = 0.0f, bluG = 0.0f, bluB = 1.0f,  
			whiR = 1.0f, whiG = 1.0f, whiB = 1.0f; 
 
	// 画前上排 
	DrawCube(-1.705f, 1.705f, 1.705f, 0.0f, 0.0f, 0.0f, 0.0f,  
			 redR, redG, redB, yelR, yelG, yelB, greR, greG, greB); 
	DrawCube(-0.5f, 1.705f, 1.705f, 0.0f, 0.0f, 0.0f, 0.0f,  
			 bluR, bluG, bluB, colorR, colorG, colorB, oraR, oraG, oraB); 
	DrawCube(1.705f, 1.705f, 1.705f, -90.0f, 0.0f, 0.0f, 1.0f,  
			 redR, redG, redB, greR, greG, greB, whiR, whiG, whiB); 
	// 画前中排 
	DrawCube(-1.705f, 0.5f, 1.705f, 0.0f, 0.0f, 0.0f, 0.0f,  
			 oraR, oraG, oraB, yelR, yelG, yelB, colorR, colorG, colorB); 
	DrawCube(-0.5f, 0.5f, 1.705f, 0.0f, 0.0f, 0.0f, 0.0f,  
			 greR, greG, greB, colorR, colorG, colorB, colorR, colorG, colorB); 
	DrawCube(1.705f, 0.5f, 1.705f, -90.0f, 0.0f, 0.0f, 1.0f,  
			 redR, redG, redB, colorR, colorG, colorB, greR, greG, greB); 
	// 画前下排 
	DrawCube(-1.705f, -1.705f, 1.705f, 90.0f, 0.0f, 0.0f, 1.0f,  
			 bluR, bluG, bluB, whiR, whiG, whiB, oraR, oraG, oraB); 
	DrawCube(-0.5f, -1.705f, 1.705f, 90.0f, 0.0f, 0.0f, 1.0f,  
			 yelR, yelG, yelB, redR, redG, redB, colorR, colorG, colorB); 
	DrawCube(1.705f, -1.705f, 1.705f, 180.0f, 0.0f, 0.0f, 1.0f,  
			 bluR, bluG, bluB, oraR, oraG, oraB, whiR, whiG, whiB); 
	// 画中上排 
	DrawCube(-1.705f, 1.705f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f,  
			 colorR, colorG, colorB, yelR, yelG, yelB, bluR, bluG, bluB); 
	DrawCube(-0.5f, 1.705f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f,  
			 colorR, colorG, colorB, colorR, colorG, colorB, whiR, whiG, whiB); 
	DrawCube(1.705f, 1.705f, 0.5f, -90.0f, 0.0f, 0.0f, 1.0f,  
			 colorR, colorG, colorB, redR, redG, redB, bluR, bluG, bluB); 
	// 画中中排 
	DrawCube(-1.705f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f,  
			 colorR, colorG, colorB, oraR, oraG, oraB, colorR, colorG, colorB); 
	DrawCube(-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f,  
			 colorR, colorG, colorB, colorR, colorG, colorB, colorR, colorG, colorB); 
	DrawCube(1.705f, 0.5f, 0.5f, -90.0f, 0.0f, 0.0f, 1.0f,  
			 colorR, colorG, colorB, colorR, colorG, colorB, redR, redG, redB); 
	// 画中下排 
	DrawCube(-1.705f, -1.705f, 0.5f, 90.0f, 0.0f, 0.0f, 1.0f,  
			  colorR, colorG, colorB, whiR, whiG, whiB, bluR, bluG, bluB); 
	DrawCube(-0.5f, -1.705f, 0.5f, 90.0f, 0.0f, 0.0f, 1.0f,  
			 colorR, colorG, colorB, yelR, yelG, yelB, colorR, colorG, colorB); 
	DrawCube(1.705f, -1.705f,0.5f, 180.0f, 0.0f, 0.0f, 1.0f,  
			 colorR, colorG, colorB, greR, greG, greB, redR, redG, redB); 
	// 画后上排 
	DrawCube(-1.705f, 1.705f, -1.705f, -90.0f, 1.0f, 0.0f, 0.0f,  
			 yelR, yelG, yelB, bluR, bluG, bluB, oraR, oraG, oraB); 
	DrawCube(-0.5f, 1.705f, -1.705f, -90.0f, 1.0f, 0.0f, 0.0f,  
			 oraR, oraG, oraB, colorR, colorG, colorB, whiR, whiG, whiB); 
	DrawCube(1.705f, 1.705f, -1.705f, -180.0f, 0.0f, 1.0f, 0.0f,  
			 yelR, yelG, yelB, redR, redG, redB, bluR, bluG, bluB); 
	// 画后中排 
	DrawCube(-1.705f, 0.5f, -1.705f, -90.0f, 1.0f, 0.0f, 0.0f,  
			 colorR, colorG, colorB, oraR, oraG, oraB, greR, greG, greB); 
	DrawCube(-0.5f, 0.5f, -1.705f, -90.0f, 1.0f, 0.0f, 0.0f,  
			 colorR, colorG, colorB, colorR, colorG, colorB, bluR, bluG, bluB); 
	DrawCube(1.705f, 0.5f, -1.705f, -180.0f, 0.0f, 1.0f, 0.0f,  
			 redR, redG, redB, whiR, whiG, whiB, colorR, colorG, colorB); 
	// 画后下排 
	DrawCube(-1.705f, -1.705f, -1.705f, 180.0f, 1.0f, 0.0f, 0.0f,  
			 yelR, yelG, yelB, oraR, oraG, oraB, greR, greG, greB); 
	DrawCube(-0.5f, -1.705f, -1.705f, 180.0f, 1.0f, 0.0f, 0.0f,  
			 greR, greG, greB, colorR, colorG, colorB, whiR, whiG, whiB); 
	glRotatef(-180.0f, 0.0f, 0.0f, 1.0f); 
	DrawCube(-1.705f, 1.705f, -1.705f, -90.0f, 0.0f, 1.0f, 0.0f,  
			 whiR, whiG, whiB, greR, greG, greB, oraR, oraG, oraB); 
} 
 
void DrawSceneGL(void)													// 绘制场景 
{ 
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);					// 清除颜色和深度缓存 
	glLoadIdentity();													// 重置当前矩阵	 
 
	 
	glTranslatef(0.0f, 0.0f, -8.0f);	 
	glRotatef(angle_X, 1.0f, 0.0f, 0.0f);							 
	glRotatef(angle_Y, 0.0f, 1.0f, 0.0f);						 
 
	DrawMagicCube(); 
 
	glFlush();															// 刷新GL命令队列 
} 
 
void Update(void)														// 在此处更新对消息的动作				 
{ 
	if (OGL_keys->keyDown[VK_ESCAPE] == TRUE)							// 判断ESC键是否按下 
	{ 
		PostMessage(OGL_window->hWnd, WM_QUIT, 0, 0);					// 结束程序 
	} 
 
	if (OGL_keys->keyDown[VK_F1] == TRUE)								// 判断F1是否按下 
	{ 
		PostMessage(OGL_window->hWnd, WM_TOGGLEFULLSCREEN, 0, 0);		// 在全屏/窗口模式间切换 
	} 
 
	if (OGL_keys->keyDown[VK_UP] == TRUE) 
	{ 
		angle_X -= 1.0f; 
	} 
 
	if (OGL_keys->keyDown[VK_DOWN] == TRUE) 
	{ 
		angle_X += 1.0f; 
	} 
 
	if (OGL_keys->keyDown[VK_LEFT] == TRUE) 
	{ 
		angle_Y -= 1.0f; 
	} 
 
	if (OGL_keys->keyDown[VK_RIGHT] == TRUE) 
	{ 
		angle_Y += 1.0f; 
	} 
} 
 
void Deinitialize(void)													// 在此处做退出前扫尾工作 
{ 
	KillTimer(OGL_window->hWnd, TIMER1);								// 释放时钟 
}