亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? glframe.cpp

?? 通過vc++編程實現3DS格式的模型載入
?? CPP
字號:
//======================================================================
/**
*  @file      GLFrame.cpp
*
*  項目描述: 3DS文件載入
*  文件描述:  鍵盤類和程序框架類 
*  適用平臺: Windows98/2000/NT/XP
*  
*  作者:     WWBOSS
*  電子郵件:  wwboss123@gmail.com
*  創建日期: 2006-09-13	
*  修改日期: 2006-10-10
*	
*  你必須在你的繼承類中完成以下函數的實現
*																			
*  GLApplication * GLApplication::Create(const char * class_name)		
*		創建你的子類的一個實例		
*																			
*  bool Init();														
*		執行所有的初始化工作,如果成功函數返回true							
*																			
*  void Uninit();													
*		執行所有的卸載工作										
*																			
*  void Update(DWORD milliseconds);										
*		執行所有的更新操作,傳入的參數為兩次操作經過的時間,以毫秒為單位
*																			
*  void Draw();															
*		執行所有的繪制操作
*/																			
//======================================================================

#include "stdafx.h"
#include "GLFrame.h"													/**< 包含GLFrame.h頭文件 */
						


/** 主程序入口 */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	int ret = -1;
	GLApplication * appl = GLApplication::Create("OpenGL");			/**< 創建程序類 */
	if (appl != 0)
	{
		ret = appl->Main(hInstance, hPrevInstance, lpCmdLine, nCmdShow);/**< 執行程序主循環 */
		delete appl;													/**< 刪除程序類(在繼承類中,使用GL_Example * example = new GL_Example(class_name);分配了一塊內存)*/
	}
	else
	{																	/**< 創建程序出錯 */
		MessageBox(HWND_DESKTOP, "創建程序出錯", "Error", MB_OK | MB_ICONEXCLAMATION);
	}
	return ret;
}																		

/** 處理窗口消息 */
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	LONG user_data = GetWindowLong(hWnd, GWL_USERDATA);					/**< 返回用戶自定義的32位的程序附加值 */
	if (user_data == 0)
	{	
		/// 如果程序第一次運行
		if (uMsg == WM_CREATE)											/**< 處理窗口創建消息 */
		{																
			/// 返回窗口結構的指針,它保存剛創建的程序實例的類
			CREATESTRUCT * creation = reinterpret_cast<CREATESTRUCT *>(lParam);
			
			/// 獲得程序實例的指針
			GLApplication * appl = reinterpret_cast<GLApplication *>(creation->lpCreateParams);
			
			/// 保存程序實例的指針為用戶自定義的程序附加值
			SetWindowLong(hWnd, GWL_USERDATA, reinterpret_cast<LONG>(appl));
			appl->m_IsVisible = true;									/**< 設置程序可見 */
			return 0;													/**< 返回 */
		}
	}
	else
	{	
		/// 如果不是第一次窗口,返回程序實例的指針
		GLApplication * appl = reinterpret_cast<GLApplication *>(user_data);
		return appl->Message(hWnd, uMsg, wParam, lParam);				/**< 調用程序實例自己的消息處理函數 */
	}

	return DefWindowProc(hWnd, uMsg, wParam, lParam);					/**< 調用默認的窗口消息處理函數 */
}


/** 構造函數 */
GLApplication::GLApplication(const char * class_name)					
{
	m_ClassName = class_name;											/**< 保存類名 */
	m_IsProgramLooping = true;											/**< 設置程序循環為true */
	m_CreateFullScreen = true;											/**< 使用全屏模式 */
	m_IsVisible = false;												/**< 不可見 */
	m_ResizeDraw = false;												/**< 在窗口改變大小的時候,不可繪制 */
	m_LastTickCount = 0;
}

void GLApplication::ToggleFullscreen()									/**< 切換 全屏/窗口模式 */
{
	PostMessage(m_Window, WM_TOGGLEFULLSCREEN, 0, 0);					/**< 發送自定的切換消息 */
}

void GLApplication::TerminateApplication()								/**< 結束程序 */
{
	PostMessage(m_Window, WM_QUIT, 0, 0);								/**< 發送退出消息 */
	m_IsProgramLooping = false;											/**< 停止程序循環 */
}

/** 消息循環 */
LRESULT GLApplication::Message(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)														/**< 處理不同的Windows消息 */
	{
		case WM_SYSCOMMAND:												/**< 截獲系統命令 */
			switch (wParam)												
			{
				case SC_SCREENSAVE:										/**< 截獲屏幕保護啟動命令 */
				case SC_MONITORPOWER:									/**< 截獲顯示其省電模式啟動命令 */
					return 0;											/**< 不啟用這兩個命令 */
				break;
			}
		break;															/**< 退出 */

		case WM_CLOSE:													/**< 關閉窗口 */
			TerminateApplication();										/**< 調用TerminateApplication函數 */
			return 0;													
		break;

		case WM_EXITMENULOOP:
		case WM_EXITSIZEMOVE:
			m_LastTickCount = GetTickCount();							/**< 更新計數器的值 */
			return 0;
		break;

		case WM_MOVE:
			m_Window.SetPosX(LOWORD(lParam));							/**< 更新鼠標的坐標 */
			m_Window.SetPosY(HIWORD(lParam));							
			return 0;
		break;

		case WM_PAINT:
			if (m_ResizeDraw == true)									/**< 如果需要重繪 */
			{
				m_Window.ReshapeGL();									/**< 重新設置窗口的大小 */
				Draw();													/**< 重新繪制 */
				m_Window.SwapBuffers();									/**< 交換前后幀緩存 */
			}
		break;

		case WM_SIZING:													/**< 窗口正在改變大小 */
		{
			RECT * rect = (RECT *)lParam;
			m_Window.SetWidth(rect->right - rect->left);				/**< 設置窗口寬度 */
			m_Window.SetHeight(rect->bottom - rect->top);				/**< 設置窗口高度 */
			return TRUE;
		}
		break;

		case WM_SIZE:													/**< 窗口改變大小后 */
			switch (wParam)												/**< 處理不同的窗口狀態 */
			{
				case SIZE_MINIMIZED:									/**< 是否最小化? */
					m_IsVisible = false;								/**< 如果是,則設置不可見 */
					return 0;											
				break;

				case SIZE_MAXIMIZED:									/**< 窗口是否最大化? */
				case SIZE_RESTORED:										/**< 窗口被還原? */
					m_IsVisible = true;									/**< 設置為可見 */
					m_Window.SetWidth(LOWORD(lParam));					/**< 設置窗口寬度 */
					m_Window.SetHeight(HIWORD(lParam));					/**< 設置窗口高度 */
					m_Window.ReshapeGL();								/**< 改變窗口大小 */
					m_LastTickCount = GetTickCount();					/**< 更新計數器的值 */
					return 0;											
				break;
			}
		break;															

		case WM_KEYDOWN:												/**< 更新按鍵信息 */
			m_Keys.SetPressed(wParam);									
			return 0;													
		break;

		case WM_KEYUP:													/**< 更新釋放鍵信息 */
			m_Keys.SetReleased(wParam);									
			return 0;													
		break;

		case WM_TOGGLEFULLSCREEN:										/**< 切換 全屏/窗口模式 */
			m_CreateFullScreen = !m_CreateFullScreen;
			PostMessage(hWnd, WM_QUIT, 0, 0);
		break;															
	}

	return DefWindowProc(hWnd, uMsg, wParam, lParam);					/**< 調用默認的窗口消息處理函數 */
}

/** 程序的主循環 */
int GLApplication::Main(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	/// 注冊一個窗口
	WNDCLASSEX windowClass;												/**< 窗口類 */
	ZeroMemory(&windowClass, sizeof(WNDCLASSEX));						/**< 清空結構為0 */
	windowClass.cbSize			= sizeof(WNDCLASSEX);					/**< 窗口結構的大小 */
	windowClass.style			= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;	/**< 設置窗口類型為,移動時重畫,并為窗口取得DC */
	windowClass.lpfnWndProc		= (WNDPROC)(WindowProc);				/**< WndProc處理消息 */
	windowClass.hInstance		= hInstance;							/**< 設置實例 */
	windowClass.hbrBackground	= (HBRUSH)(COLOR_APPWORKSPACE);			/**< 設置背景 */
	windowClass.hCursor			= LoadCursor(NULL, IDC_ARROW);			/**< 載入光標 */
	windowClass.lpszClassName	= m_ClassName;							/**< 設置類名 */
	if (RegisterClassEx(&windowClass) == 0)								/**< 嘗試注冊窗口類 */
	{																	/**< NOTE: Failure, Should Never Happen */
		MessageBox(HWND_DESKTOP, "注冊窗口失敗!", "Error", MB_OK | MB_ICONEXCLAMATION);
		return -1;														/**< 退出并返回FALSE */
	}

	// 詢問是否在全屏狀態下運行?
	if (MessageBox(HWND_DESKTOP, "你想在全屏狀態下運行么 ?", "設置運行模式", MB_YESNO | MB_ICONQUESTION) == IDNO)
	{
		m_CreateFullScreen = false;										/**< m_CreateFullScreen記錄當前的顯示模式為窗口 */
	}
	
	while (m_IsProgramLooping)											/**< 循環直到WM_QUIT退出程序 */
	{																	
		/// 創建一個窗口
		if (m_Window.Create("OpenGL 3D游戲編程——3DS文件載入", m_ClassName,m_CreateFullScreen, hInstance, this) == true)
		{	
			
			/// 如果初始化失敗,則退出
			if (Init() == false)									    /**< 調用自定義的初始化函數 */
			{															/**< 失敗 */
				TerminateApplication();									/**< 關閉窗口退出程序 */
			}
			else														/**< 成功開始消息循環 */
			{															 
				MSG msg;												/**< Window消息結構 */ 
				bool isMessagePumpActive = true;						/**< 當消息不為空時,處理消息循環 */
				m_LastTickCount = GetTickCount();						/**< 返回當前的計時器的值 */
				m_Keys.Clear();											/**< 清空所有的按鍵信息 */
				while (isMessagePumpActive == true)						/**< 當消息不為空時,處理消息循環 */
				{														/**< 成功創建窗口,檢測窗口消息 */
					if (PeekMessage(&msg, m_Window, 0, 0, PM_REMOVE) != 0)
					{													
						/// 檢測是否為WM_QUIT消息
						if (msg.message != WM_QUIT)						
						{
							DispatchMessage(&msg);						/**< 如果不是發送消息到消息回調函數中處理 */
						}
						else											
						{
							isMessagePumpActive = false;				/**< 如果是,則退出 */
						}
					}
					/// 如果沒有消息
					else												
					{
						if (m_IsVisible == false)						/**< 如果窗口不可見 */
						{
							WaitMessage();								/**< 暫停程序,等待消息 */
						}
						else											/**< 如果窗口可見 */
						{												/**< 執行消息循環 */
							DWORD tickCount = GetTickCount();			/**< 返回計時器的當前值 */
							Update(tickCount - m_LastTickCount);		/**< 調用用戶自定義的更新函數 */
							m_LastTickCount = tickCount;				/**< 重新設置上一次,計數器的值 */
							Draw();										/**< 調用用戶自定義的繪制函數 */
							m_Window.SwapBuffers();						/**< 交換前后幀緩存 */
						}
					}
				}														/**< 如果isMessagePumpActive == true,則循環 */
			}															
																		/**< 程序結束 */
			Uninit();												/**< 用戶自定義的卸載函數 */
			m_Window.Destroy();											/**< 刪除窗口 */
		}
		else															/**< 如果創建窗口失敗 */
		{																
			MessageBox(HWND_DESKTOP, "創建OpenGL窗口錯誤", "Error", MB_OK | MB_ICONEXCLAMATION);
			m_IsProgramLooping = false;									/**< 停止程序循環 */
		}
	}																	

	UnregisterClass(m_ClassName, hInstance);							/**< 取消注冊的窗口 */
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆视频一区二区| 欧美精品一二三| 国产精品无码永久免费888| 国产一区 二区 三区一级| 精品国产91久久久久久久妲己| 日本强好片久久久久久aaa| 51精品视频一区二区三区| 人人狠狠综合久久亚洲| 4438成人网| 国产成人精品亚洲午夜麻豆| 国产精品国产自产拍高清av王其| 99久久久久免费精品国产| 一二三四社区欧美黄| 欧美福利视频一区| 国产乱理伦片在线观看夜一区| 日本一区二区三区四区| 色天使久久综合网天天| 日韩高清不卡一区二区三区| 亚洲精品一区在线观看| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 国v精品久久久网| 亚洲精品乱码久久久久久日本蜜臀| 91福利精品视频| 日本aⅴ亚洲精品中文乱码| 日韩欧美一区在线| 成+人+亚洲+综合天堂| 日韩精品免费视频人成| 国产亚洲精品福利| 91黄视频在线观看| 国产资源在线一区| 成人欧美一区二区三区小说| 91精品国产品国语在线不卡| 不卡视频免费播放| 久久国产精品第一页| 亚洲欧美日韩国产成人精品影院| 日韩欧美视频一区| 一本大道久久a久久综合| 激情文学综合插| 亚洲欧美激情一区二区| 精品久久久久久最新网址| 在线观看av不卡| 国产成人精品免费一区二区| 亚洲综合另类小说| 国产精品久久久99| 久久久久久久av麻豆果冻| 欧美午夜一区二区三区免费大片| 国产91精品入口| 久久se精品一区二区| 亚洲国产综合91精品麻豆| 欧美—级在线免费片| 欧美tk—视频vk| 欧美日韩国产另类一区| 色综合色综合色综合色综合色综合| 韩国在线一区二区| 五月激情综合网| 亚洲免费观看高清完整版在线| 欧美精品一区男女天堂| 欧美日韩成人综合天天影院| 91麻豆精东视频| 国产精品一区二区无线| 理论片日本一区| 日韩精品久久久久久| 一区二区三区四区视频精品免费 | 国产综合色在线| 日韩高清一级片| 亚洲成人免费看| 一区二区三区四区视频精品免费| 国产精品网站在线观看| 亚洲精品一区二区三区影院| 日韩亚洲欧美成人一区| 欧美精品一卡二卡| 在线成人免费视频| 欧美日韩一区三区四区| 欧美性生交片4| 日本韩国欧美在线| 91色视频在线| 色欧美片视频在线观看 | 亚洲精品成人少妇| 亚洲人123区| 夜夜亚洲天天久久| 一区二区三区美女| 亚洲一区二三区| 亚洲一区二区综合| 香蕉久久夜色精品国产使用方法 | 26uuu亚洲婷婷狠狠天堂| 91精品国产麻豆国产自产在线| 欧美日韩不卡一区| 欧美一区二区三区喷汁尤物| 日韩精品自拍偷拍| 久久免费精品国产久精品久久久久| 欧美精品一区二区三| 国产亚洲欧洲997久久综合| 久久久99免费| 中文字幕欧美三区| 一区二区三区成人在线视频| 亚洲va韩国va欧美va| 美女国产一区二区三区| 国产精品一区二区在线观看网站| 国产98色在线|日韩| 91丨九色丨蝌蚪富婆spa| 欧美性做爰猛烈叫床潮| 欧美一区二区三区的| 久久嫩草精品久久久久| 26uuu精品一区二区三区四区在线| 久久综合99re88久久爱| 国产精品第一页第二页第三页| 17c精品麻豆一区二区免费| 亚洲综合色在线| 久久成人精品无人区| 91网站视频在线观看| 欧美影视一区二区三区| 欧美大片免费久久精品三p| 国产亚洲欧美中文| 亚洲一区二区精品久久av| 久久精品999| heyzo一本久久综合| 欧美三级视频在线播放| 久久综合九色综合久久久精品综合| 亚洲色图欧洲色图婷婷| 免费黄网站欧美| 成人午夜精品一区二区三区| 欧美日韩一区二区在线视频| 久久久久亚洲蜜桃| 亚洲高清视频的网址| 国产成人精品三级| 欧美一区二区久久| 亚洲三级小视频| 黄页网站大全一区二区| 欧洲一区二区av| 久久久99精品免费观看不卡| 偷窥国产亚洲免费视频| 99热精品国产| 亚洲精品一区二区三区精华液| 亚洲一区二区av电影| 成人免费观看视频| 欧美精品一区在线观看| 偷拍亚洲欧洲综合| 色偷偷一区二区三区| 国产欧美日韩麻豆91| 久久91精品国产91久久小草| 91老师国产黑色丝袜在线| 久久久激情视频| 精品影视av免费| 51精品国自产在线| 亚洲国产一区在线观看| 99久久精品国产一区二区三区| 久久无码av三级| 久久精品噜噜噜成人88aⅴ| 欧美日韩电影一区| 一区二区三区小说| 91丨九色丨尤物| 欧美韩国日本不卡| 国产精品自拍毛片| 日韩精品在线一区二区| 亚洲高清不卡在线观看| 日本久久一区二区| 中文字幕一区二区三区在线观看| 国产一区激情在线| 日韩欧美国产电影| 日本中文在线一区| 91精品国产一区二区三区| 一区二区三区在线观看网站| 99久久久精品免费观看国产蜜| 国产欧美日韩视频在线观看| 国产一本一道久久香蕉| 欧美mv日韩mv国产网站| 美女视频网站久久| 日韩精品专区在线| 国产在线播放一区三区四| 精品国产污网站| 精品写真视频在线观看| 亚洲精品在线免费播放| 国产一区二区三区免费观看| 久久一夜天堂av一区二区三区| 久草这里只有精品视频| 久久综合九色综合欧美亚洲| 国产麻豆精品久久一二三| 久久麻豆一区二区| 懂色av一区二区三区免费看| 中文av一区特黄| 一本到三区不卡视频| 亚洲一二三专区| 69堂精品视频| 精品伊人久久久久7777人| 久久久精品tv| 91香蕉视频在线| 香港成人在线视频| 国产精品色婷婷| 97精品久久久午夜一区二区三区 | 亚洲成人资源在线| 日韩欧美国产综合一区| 国产乱码精品一品二品| 中文字幕在线观看不卡| 欧美亚洲国产一区二区三区va| 亚洲成人av电影在线| www国产亚洲精品久久麻豆| 成人av网站在线观看| 亚洲福利视频一区二区| 欧美一区二区不卡视频| 国产成人午夜电影网|