创建窗口:
<span style="font-family:SimSun;font-size:10px;">BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{
GLuint PixelFormat; // 保存查找匹配后的结果
WNDCLASS wc; // 窗口类实例
DWORD dwExStyle; // 扩展窗口风格
DWORD dwStyle; // 窗口风格
RECT WindowRect; // 建立一个矩形窗口
WindowRect.left=(long)0;
WindowRect.right=(long)width;
WindowRect.top=(long)0;
WindowRect.bottom=(long)height;
fullscreen=fullscreenflag;
hInstance = GetModuleHandle(NULL); // 取得我们窗口的实例
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // 当窗口变化时,就重画,并获得DC
wc.lpfnWndProc = (WNDPROC) WndProc; // 窗口消息处理函数
wc.cbClsExtra = 0; // 没有额外的参数
wc.cbWndExtra = 0;
wc.hInstance = hInstance; // 设置实例
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // 加载默认的图标
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 加载鼠标指针
wc.hbrBackground = NULL; // 窗口背景为空
wc.lpszMenuName = NULL; // 不需要菜单
wc.lpszClassName = (LPCTSTR )("OpenGL"); // 该窗口类的名称
if (!RegisterClass(&wc)) // 注册窗口类
{
MessageBox(NULL,TEXT("Failed To Register The Window Class."),TEXT("ERROR"),MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
if (fullscreen) // 如果是全屏模式
{
DEVMODE dmScreenSettings; // 设备模式
memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // 清空内存
dmScreenSettings.dmSize=sizeof(dmScreenSettings); // 设备结构体的大小
dmScreenSettings.dmPelsWidth = width; // 屏幕宽度
dmScreenSettings.dmPelsHeight = height; // 屏幕高度
dmScreenSettings.dmBitsPerPel = bits; // 像素深度
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
// 设置显示模式并返回结果
if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
{
// 如果失败,退出或者使用窗口模式
if (MessageBox(NULL,TEXT("The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?"),TEXT("NeHe GL"),MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
{
fullscreen=FALSE;
}
else
{
MessageBox(NULL,TEXT("Program Will Now Close."),TEXT("ERROR"),MB_OK|MB_ICONSTOP);
return FALSE;
}
}
}
if (fullscreen) //查看是否是否处于全屏模式
{
dwExStyle=WS_EX_APPWINDOW; // 设置扩展窗口风格
dwStyle=WS_POPUP; // 设置窗口风格
ShowCursor(FALSE); // 隐藏鼠标
}
else
{
dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // 设置扩展窗口风格
dwStyle=WS_OVERLAPPEDWINDOW; // 设置窗口风格
}
AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); // 调整窗口到要求的大小
// Create The Window
if (!(hWnd=CreateWindowEx( dwExStyle, // 扩展窗口类型
(LPCTSTR)("OpenGL"), // 类名
(LPCTSTR)title, // 窗口标题
dwStyle | // 选择的窗口属性
WS_CLIPSIBLINGS | // 必须的窗口属性
WS_CLIPCHILDREN, // 必须的窗口属性
0, 0, // 窗口左上角位置
WindowRect.right-WindowRect.left, // 计算后的窗口宽度
WindowRect.bottom-WindowRect.top, // 计算后的窗口高度
NULL,
NULL, // 不要菜单
hInstance, // 实例
NULL))) // 不向VM_CREATE传递参数
{
KillGLWindow(); // 如果创建窗口不成功,重置窗口
MessageBox(NULL,TEXT("Window Creation Error."),TEXT("ERROR"),MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
static PIXELFORMATDESCRIPTOR pfd= // 窗口所使用的像素格式
{
sizeof(PIXELFORMATDESCRIPTOR), // PIXELFORMATDESCRIPTOR 结构体的大小
1, // 版本号
PFD_DRAW_TO_WINDOW | // 格式支持窗口
PFD_SUPPORT_OPENGL | // 格式必须支持Opengl
PFD_DOUBLEBUFFER, // 格式支持双缓存
PFD_TYPE_RGBA, // 申请RGBA格式
bits, // 选择像素深度
0, 0, 0, 0, 0, 0, // 忽略的色彩位
0, // 没有apha缓存
0, // 忽略shift bit(移位)
0, // 无累加缓存
0, 0, 0, 0, // 忽略聚集位【 翻译过来是这样,但是不理解】
16, // 16Bit 的深度缓存
0, // 无蒙版缓存
0, // 无辅助缓存
PFD_MAIN_PLANE, // 主绘图层
0, // Reserved
0, 0, 0 // 忽略层遮掩
};
if (!(hDC=GetDC(hWnd))) //获得设备描述符
{
KillGLWindow();
MessageBox(NULL,TEXT("Can't Create A GL Device Context."),TEXT("ERROR"),MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))// 为窗口寻找一个匹配的像素格式【我想此处是通过pfd来找到一个匹配的像素格式】
{
KillGLWindow();
MessageBox(NULL,TEXT("Can't Find A Suitable PixelFormat."),TEXT("ERROR"),MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
if(!SetPixelFormat(hDC,PixelFormat,&pfd)) // 设置像素格式
{
KillGLWindow();
MessageBox(NULL,TEXT("Can't Set The PixelFormat."),TEXT("ERROR"),MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
if (!(hRC=wglCreateContext(hDC))) // 获取Render描述表
{
KillGLWindow();
MessageBox(NULL,TEXT("Can't Create A GL Rendering Context."),TEXT("ERROR"),MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
if(!wglMakeCurrent(hDC,hRC)) // 激活Render描述表
{
KillGLWindow();
MessageBox(NULL,TEXT("Can't Activate The GL Rendering Context."),TEXT("ERROR"),MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
ShowWindow(hWnd,SW_SHOW); // 显示窗口
SetForegroundWindow(hWnd); // 提高显示级别
SetFocus(hWnd); // 设置鼠标焦点到当前屏幕
ReSizeGLScene(width, height); // 设置透视GL屏幕【将屏幕焦点初始到最佳位置】
if (!InitGL()) // 初始化GL窗口
{
KillGLWindow();
MessageBox(NULL,TEXT("Initialization Failed."),TEXT("ERROR"),MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
return TRUE;
}</span>