?? 開天辟地.cpp
字號:
// 開天辟地.cpp : Defines the entry point for the application.
//程序設計:唐明理 2005.2
//E_mail cqtml@163.com
#include "stdafx.h"
#include "OpenGL.h"
//////////////////////////////////////////////////////////
OpenGL* m_OpenGL;
HDC hDC; // GDI設備句柄,將窗口連接到 GDI( 圖形設備接口)
HGLRC hRC=NULL; // 渲染描述句柄,將OpenGL調(diào)用連接到設備描述表
HWND hWnd=NULL; // 保存 Windows 分配給程序的窗口句柄
int Width = 800;// 窗口寬
int Height= 600;// 窗口高
int bits = 16; // 顏色深度
////////////////////////////////////////////////
void GameLoop()
{ MSG msg;
BOOL fMessage;
PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);
while(msg.message != WM_QUIT) // 消息循環(huán)
{ fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);
if(fMessage) //有消息
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}
else m_OpenGL->Render(); //無消息
}
}
LRESULT WINAPI MsgProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam )// 消息處理
{ switch(message)
{ case WM_CREATE: // 建立窗口
hDC = GetDC(hWnd); // 獲取當前窗口的設備句柄
m_OpenGL->SetupPixelFormat(hDC);// 調(diào)用顯示模式安裝功能
return 0; break;
case WM_CLOSE: // 關(guān)閉窗口
m_OpenGL->CleanUp(); // 結(jié)束處理
PostQuitMessage(0);
return 0; break;
case WM_SIZE: // 窗口尺寸變化
Height = HIWORD(lParam); // 窗口的高
Width = LOWORD(lParam); // 窗口的寬
if (Height==0) Height=1; // 防止被0 除
m_OpenGL->init(Width,Height);
return 0; break;
case WM_DESTROY: // 退出消息
PostQuitMessage(0);
return 0; break;
case WM_KEYUP: // 按ESC退出,全屏模式必需要加入的退出方式。
switch (wParam)
{ case VK_ESCAPE:
m_OpenGL->CleanUp(); // 結(jié)束處理
PostQuitMessage(0);
return 0;break;
}
default: break;
}
return (DefWindowProc(hWnd, message, wParam, lParam));
}
INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT )// WinMain程序入口
{ // 注冊窗口類
bool fullScreen =TRUE;
DWORD dwExStyle; // Window 擴展風格
DWORD dwStyle; // Window 窗口風格
RECT windowRect; // 窗口尺寸
int nX=0,nY=0;
/* if (MessageBox(NULL,"使用全屏模式嗎?", "將進入OpenGL,選擇顯示模式",
MB_YESNO|MB_ICONQUESTION|MB_SYSTEMMODAL)==IDNO)
{fullScreen =false;} // 選擇窗口模式
if (fullScreen) // 選擇全屏模式
{ DEVMODE dmScr; // 設備模式
memset(&dmScr,0,sizeof(dmScr)); // 確保內(nèi)存分配
dmScr.dmSize=sizeof(dmScr); // Devmode 結(jié)構(gòu)的大小
dmScr.dmPelsWidth = Width; // 屏幕寬
dmScr.dmPelsHeight= Height; // 屏幕高
dmScr.dmBitsPerPel= 16; // 色彩深度
dmScr.dmDisplayFrequency=75; // 刷屏速度
dmScr.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;
if (ChangeDisplaySettings(&dmScr, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
{fullScreen=FALSE;}
dwExStyle=WS_EX_APPWINDOW; // Window 擴展風格
dwStyle=WS_POPUP; // Window 窗口風格
ShowCursor(FALSE); // 隱藏鼠標
}
else*/
{ dwExStyle=WS_EX_APPWINDOW|WS_EX_WINDOWEDGE; // 使窗口具有3D外觀
dwStyle=WS_OVERLAPPEDWINDOW; // 使用標準窗口
//WS_OVERLAPPEDWINDOW是有標題欄,窗口菜單,最大、小化按鈕和可調(diào)整尺寸的窗口
int wid=GetSystemMetrics(SM_CXSCREEN); // 獲取當前屏幕寬
int hei=GetSystemMetrics(SM_CYSCREEN); // 獲取當前屏幕高
nX=(wid-Width)/2;nY=(hei-Height)/2; // 計算窗口居中用
}
//-------------------------------------------------------------------
AdjustWindowRectEx(&windowRect,dwStyle,FALSE,dwExStyle);
//根據(jù)窗口風格來調(diào)整窗口尺寸達到要求的大小
char cc[]="tml";
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
cc, NULL };
RegisterClassEx( &wc );
m_OpenGL=new OpenGL();//
hWnd = CreateWindowEx(NULL,cc,"學OpenGL編3D游戲 [ 5. 開天辟地 ] 鍵盤(↑進 ↓退 →右 ←左 UP仰 DOWM俯)",
dwStyle|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,
nX, nY,Width, Height,
NULL,NULL,hInst,NULL); // 創(chuàng)建窗口
ShowWindow( hWnd, SW_SHOWDEFAULT ); // 顯示窗口
UpdateWindow( hWnd ); // 刷新窗口
GameLoop(); // 進入消息循環(huán)
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -