WndProc 的实现:
//窗口消息处理函数
LRESULT CALLBACK WndProc( HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (uMsg) //消息类型
{
case WM_ACTIVATE: //窗口活动状态
{
if (!HIWORD(wParam))
{
active=TRUE;
}
else
{
active=FALSE;
}
return 0;
}
case WM_SYSCOMMAND: // 系统中断
{
switch (wParam) // 中断事件类型
{
case SC_SCREENSAVE: // 屏保模式
case SC_MONITORPOWER: // 省电模式
return 0; // 阻止上述中断执行
}
break; // 如果不是上述中断事件,就跳出,将其交给系统处理
}
case WM_CLOSE: // 窗口关闭?
{
PostQuitMessage(0); // 发送一个退出消息
return 0;
}
case WM_KEYDOWN: // 按键被按下
{
keys[wParam] = TRUE;
return 0;
}
case WM_KEYUP: // 按键弹起
{
keys[wParam] = FALSE;
return 0;
}
case WM_SIZE: // 调整窗口大小
{
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));
return 0;
}
}
// 未处理的消息,交给系统来处理
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
Windows程序的入口:
int WINAPI WinMain( HINSTANCE hInstance, // 当前的窗口实例
HINSTANCE hPrevInstance, // 前一个窗口实例
LPSTR lpCmdLine, // 命令行参数
int nCmdShow) // 窗口显示状态
{
MSG msg; // 申明一个消息结构体变量,来接收消息
BOOL done=FALSE; // 控制循环
// 让用户选择是否在全屏模式下运行
if (MessageBox(NULL,TEXT("Would You Like To Run In Fullscreen Mode?"), TEXT("Start FullScreen?"),MB_YESNO|MB_ICONQUESTION)==IDNO)
{
fullscreen=FALSE; // Windowed Mode
}
// 创建窗口
if (!CreateGLWindow("NeHe's OpenGL Framework",640,480,16,fullscreen))
{
return 0;
}
while(!done) // 循环开始
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) // 检查是否有消息需要处理
{
if (msg.message==WM_QUIT) // 如果收到的消息是"退出"
{
done=TRUE;
}
else // 如果不是
{
TranslateMessage(&msg); // 转换消息
DispatchMessage(&msg); // 发送消息【可能是发给系统处理】
}
}
else // 如果没有消息
{
// 开始画场景
if (active) // 如果窗口处于激活状态下
{
if (keys[VK_ESCAPE]) // 当按下ESC键时,退出循环
{
done=TRUE;
}
else // 如果用户没有选择退出
{
DrawGLScene(); // 重画场景
SwapBuffers(hDC); // 交换缓存(双缓存)
}
}
if (keys[VK_F1]) // F1键按下
{
keys[VK_F1]=FALSE; // F1键状态置为 FALSE
KillGLWindow(); // 关闭当前窗口
fullscreen=!fullscreen; // 切换全屏/窗口模式
// 重新生成窗口
if (!CreateGLWindow("NeHe's OpenGL Framework",640,480,16,fullscreen))
{
return 0;
}
}
}
}
KillGLWindow();
return (msg.wParam);
}