?? glwindow.cpp
字號:
//========================================================
/**
* @file GLWindows.h
*
* 項(xiàng)目描述: DirectInput鍵盤演示
* 文件描述: 程序窗口類
* 適用平臺: Windows98/2000/NT/XP
*
* 作者: WWBOSS
* 電子郵件: wwboss123@gmail.com
* 創(chuàng)建日期: 2006-09-13
* 修改日期: 2006-10-10
*
*/
//========================================================
#include "GLWindow.h" /**< 包含GLwindows.h頭文件 */
#include <gl/gl.h> /**< 包含OpenGL頭文件 */
#include <gl/glu.h>
/** 構(gòu)造函數(shù) */
GLWindow::GLWindow()
{
m_WindowPosX = 0; /**< 窗口的左上角的X位置 */
m_WindowPosY = 0; /**< 窗口的左上角的Y位置 */
m_WindowWidth = 640; /**< 窗口的寬度 */
m_WindowHeight = 480; /**< 窗口的高度 */
m_ScreenWidth = 1024; /**< 全屏的寬度 */
m_ScreenHeight = 768; /**< 全屏的高度 */
m_BitsPerPixel = 16; /**< 顏色位深 */
m_IsFullScreen = false; /**< 不使用全屏 */
m_hWnd = 0;
m_hDC = 0;
m_hRC = 0;
}
/** 返回窗口的大小 */
int GLWindow::GetWidth()
{
if (m_IsFullScreen == true)
{
return m_ScreenWidth;
}
else
{
return m_WindowWidth;
}
}
int GLWindow::GetHeight()
{
if (m_IsFullScreen == true)
{
return m_ScreenHeight;
}
else
{
return m_WindowHeight;
}
}
/** 設(shè)置窗口的大小 */
void GLWindow::SetWidth(int width)
{
if (m_IsFullScreen == true)
{
m_ScreenWidth = width;
}
else
{
m_WindowWidth = width;
}
}
void GLWindow::SetHeight(int height)
{
if (m_IsFullScreen == true)
{
m_ScreenHeight = height;
}
else
{
m_WindowHeight = height;
}
}
/** 返回窗口左上角的位置 */
int GLWindow::GetPosX()
{
if (m_IsFullScreen == false)
{
return m_WindowPosX;
}
return 0;
}
int GLWindow::GetPosY()
{
if (m_IsFullScreen == false)
{
return m_WindowPosY;
}
return 0;
}
/** 設(shè)置窗口左上角的位置 */
void GLWindow::SetPosX(int x)
{
if (m_IsFullScreen == false)
{
m_WindowPosX = x;
}
}
void GLWindow::SetPosY(int y)
{
if (m_IsFullScreen == false)
{
m_WindowPosY = y;
}
}
/** 當(dāng)窗口大小改變時,通知OpenGL調(diào)整大小 */
void GLWindow::ReshapeGL()
{
GLsizei width = GetWidth();
GLsizei height = GetHeight();
glViewport(0, 0, width, height); /**< 重新設(shè)置視口 */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 1.0f, 100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
/** 改變窗口的顯示設(shè)置 */
bool GLWindow::ChangeScreenSetting()
{
DEVMODE dmScreenSettings; /**< 設(shè)備模式 */
ZeroMemory(&dmScreenSettings, sizeof(DEVMODE)); /**< 清零結(jié)構(gòu) */
dmScreenSettings.dmSize = sizeof(DEVMODE); /**< 結(jié)構(gòu)大小 */
dmScreenSettings.dmPelsWidth = GetWidth(); /**< 設(shè)置寬度 */
dmScreenSettings.dmPelsHeight = GetHeight(); /**< 設(shè)置高度 */
dmScreenSettings.dmBitsPerPel = m_BitsPerPixel; /**< 設(shè)置位深度 */
//dmScreenSettings.dmDisplayFrequency = 75; /**< 設(shè)置屏幕刷新率 */
dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT ;//| DM_DISPLAYFREQUENCY;
/// 改變顯示模式
if (ChangeDisplaySettings(&dmScreenSettings, 0) != DISP_CHANGE_SUCCESSFUL)
{
return false; /**< 如果失敗,返回false */
}
return true; /**< 成功返回 */
}
/** 創(chuàng)建windows窗口 */
bool GLWindow::Create(const char * window_title,const char * class_name,bool fullscreen, HINSTANCE h_instance, LPVOID lpParam)
{
m_IsFullScreen = fullscreen;
int nX=0;
int nY=0;
PIXELFORMATDESCRIPTOR pfd = /**< 設(shè)置像素描述結(jié)構(gòu) */
{
sizeof(PIXELFORMATDESCRIPTOR), /**< 像素描述結(jié)構(gòu)的大小 */
1, /**< 版本號 */
PFD_DRAW_TO_WINDOW | /**< 緩存區(qū)的輸出顯示在一個窗口中 */
PFD_SUPPORT_OPENGL | /**< 緩存區(qū)支持OpenGL繪圖 */
PFD_STEREO | /**< 顏色緩存區(qū)是立體緩存 */
PFD_DOUBLEBUFFER, /**< 顏色緩存區(qū)是雙緩存 */
PFD_TYPE_RGBA, /**< 使用RGBA顏色格式 */
m_BitsPerPixel, /**< 顏色緩存區(qū)中顏色值所占的位深 */
0, 0, 0, 0, 0, 0, /**< 使用默認(rèn)的顏色設(shè)置 */
0, /**< 無Alpha緩存 */
0, /**< 顏色緩存區(qū)中alpha成分的移位計數(shù) */
0, /**< 無累計緩存區(qū) */
0, 0, 0, 0, /**< 累計緩存區(qū)無移位 */
32, /**< 32位深度緩存 */
0, /**< 無蒙版緩存 */
0, /**< 無輔助緩存區(qū) */
PFD_MAIN_PLANE, /**< 必須為PFD_MAIN_PLANE,設(shè)置為主繪圖層 */
0, /**< 表示OpenGL實(shí)現(xiàn)所支持的上層或下層平面的數(shù)量 */
0, 0, 0 /**< 過時,已不再使用 */
};
DWORD windowStyle = WS_OVERLAPPEDWINDOW & ~WS_SIZEBOX & ~WS_MAXIMIZEBOX; /**< 定義我們窗口類型,使用常規(guī)設(shè)定,去掉最大化按鈕,并不能改變窗體大小 */
DWORD windowExtendedStyle = WS_EX_APPWINDOW;
if (m_IsFullScreen == true) /**< 如果為全屏模式,嘗試轉(zhuǎn)化為全屏模式 */
{
if (ChangeScreenSetting() == false)
{ /**< 全屏模式轉(zhuǎn)換失敗,彈出對話框提示,并嘗試窗口模式 */
MessageBox(HWND_DESKTOP, "模式轉(zhuǎn)換失敗.\n在窗口模式下運(yùn)行.", "Error", MB_OK | MB_ICONEXCLAMATION);
m_IsFullScreen = false; /**< 設(shè)置為窗口模式 */
}
else /**< 如果為窗口模式 */
{
ShowCursor(false); /**< 隱藏鼠標(biāo) */
windowStyle = WS_POPUP; /**< 設(shè)置窗口模式為頂層窗口 */
windowExtendedStyle |= WS_EX_TOPMOST;
}
}
/// 調(diào)整我們窗口的大小,使其客戶區(qū)的大小為我們設(shè)置的大小
RECT windowRect = {GetPosX(), GetPosY(), GetPosX() + GetWidth(), GetPosY() + GetHeight()};
if (m_IsFullScreen == false) /**< 在窗口模式下使用 */
{
windowExtendedStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; /**< 使窗口具有3D外觀 */
int wid = GetSystemMetrics(SM_CXSCREEN); /**< 獲取當(dāng)前屏幕寬 */
int hei = GetSystemMetrics(SM_CYSCREEN); /**< 獲取當(dāng)前屏幕高 */
nX = (wid - GetWidth()) / 2; /**< 計算窗口居中用 */
nY = (hei - GetHeight()) / 2;
/// 調(diào)整我們窗口的大小,使其客戶區(qū)的大小為我們設(shè)置的大小
AdjustWindowRectEx(&windowRect, windowStyle, 0, windowExtendedStyle);
/// 判斷窗口的左上角是否隱藏在桌面外
if (windowRect.left < 0) /**< 如果窗口X坐標(biāo)為負(fù),移動坐標(biāo)到0處,并調(diào)整窗口的位置 */
{
windowRect.right -= windowRect.left;
windowRect.left = 0;
}
if (windowRect.top < 0) /**< 如果窗口Y坐標(biāo)為負(fù),移動坐標(biāo)到0處,并調(diào)整窗口的位置 */
{
windowRect.bottom -= windowRect.top;
windowRect.top = 0;
}
ShowCursor(true);
}
/// 創(chuàng)建窗口
m_hWnd = CreateWindowEx(windowExtendedStyle, /**< 窗口的擴(kuò)展風(fēng)格 */
class_name, /**< 窗口的類名 */
window_title, /**< 窗口標(biāo)題 */
windowStyle, /**< 窗口的風(fēng)格 */
nX,nY, /**< 窗口的左上角位置 */
windowRect.right - windowRect.left, /**< 窗口的寬度 */
windowRect.bottom - windowRect.top, /**< 窗口的高度 */
HWND_DESKTOP, /**< 窗口的父窗口為桌面 */
0, /**< 無菜單 */
h_instance, /**< 傳入窗口的實(shí)例句柄 */
lpParam); /**< 傳入程序類參數(shù) */
while (m_hWnd != 0) /**< 窗口是否創(chuàng)建成功 */
{
m_hDC = GetDC(m_hWnd); /**< 返回窗口的設(shè)備描述表 */
if (m_hDC == 0) /**< 如果為空 */
{ /**< 失敗 */
break;
}
GLuint PixelFormat = ChoosePixelFormat(m_hDC, &pfd); /**< 查找一個兼容的像素格式 */
if (PixelFormat == 0) /**< 如果沒找到 */
{ /**< 失敗 */
break;
}
if (SetPixelFormat(m_hDC, PixelFormat, &pfd) == false) /**< 設(shè)置像素格式 */
{ /**< 失敗 */
break;
}
m_hRC = wglCreateContext(m_hDC); /**< 創(chuàng)建OpenGL的渲染描述表 */
if (m_hRC == 0) /**< 如果為空 */
{ /**< 失敗 */
break;
}
if (wglMakeCurrent(m_hDC, m_hRC) == false) /**< 設(shè)置當(dāng)前的OpenGL的渲染對象為當(dāng)前的窗口 */
{ /**< 失敗 */
break;
}
ShowWindow(m_hWnd, SW_NORMAL); /**< 顯示窗口 */
ReshapeGL(); /**< 告訴OpenGL調(diào)整窗口大小 */
return true; /**< 成功返回 */
}
Destroy(); /**< 釋放資源 */
return false; /**< 返回失敗 */
}
/** 刪除OpenGL窗口 */
void GLWindow::Destroy()
{
if (m_hWnd != 0) /**< 窗口句柄是否存在 */
{
if (m_hDC != 0) /**< 窗口設(shè)備描述表是否存在 */
{
wglMakeCurrent(m_hDC, 0); /**< 設(shè)置當(dāng)前的OpenGL的渲染對象為空NULL */
if (m_hRC != 0) /**< OpenGL的渲染描述表是否存在 */
{
wglDeleteContext(m_hRC); /**< 釋放OpenGL的渲染描述表 */
m_hRC = 0; /**< 設(shè)置OpenGL的渲染描述表為0 */
}
ReleaseDC(m_hWnd, m_hDC); /**< 釋放窗口的設(shè)備描述表 */
m_hDC = 0; /**< 設(shè)置窗口的設(shè)備描述表為0 */
}
DestroyWindow(m_hWnd); /**< 刪除窗口 */
m_hWnd = 0; /**< 設(shè)置窗口句柄為0 */
}
if (m_IsFullScreen) /**< 如果為全屏模式,在程序結(jié)束后,變換到窗口模式,并顯示鼠標(biāo) */
{
ChangeDisplaySettings(NULL, 0); /**< 變換到窗口模式 */
ShowCursor(true); /**< 顯示鼠標(biāo) */
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -