JeffMolofee(NeHe)的OPENGL教程-第一课[6]-WndProc

下面的代码处理所有的窗口消息。当我们注册好窗口类之后,程序跳转到这部分代码处理窗口消息。
LRESULT CALLBACK WndProc( HWND hWnd,      // 窗口的句柄
UINT uMsg,               // 窗口的消息
WPARAM wParam,     // 附加的消息内容
LPARAM lParam)        // 附加的消息内容
{
  
   
下来的代码比对uMsg的值,然后转入case处理,uMsg 中保存了我们要处理的消息名字。
switch (uMsg)        // 检查Windows消息
{

如果uMsg等于WM_ACTIVE,查看窗口是否仍然处于激活状态。如果窗口已被最小化,将变量active设为FALSE。如果窗口已被激活,变量active的值为TRUE。
case WM_ACTIVATE:    // 监视窗口激活消息
{
if (!HIWORD(wParam))        // 检查最小化状态
{
active=TRUE;          // 程序处于激活状态
}
else
{
active=FALSE;        // 程序不再激活
}
return 0;              // 返回消息循环
}
  

如果消息是WM_SYSCOMMAND(系统命令),再次比对wParam。如果wParam 是 SC_SCREENSAVE 或 SC_MONITORPOWER的话,不是有屏幕保护要运行,就是显示器想进入节电模式。返回0可以阻止这两件事发生。
case WM_SYSCOMMAND:    // 中断系统命令Intercept System Commands
{
switch (wParam)                // 检查系统调用Check System Calls
{
case SC_SCREENSAVE:       // 屏保要运行?
case SC_MONITORPOWER:  // 显示器要进入节电模式?
return 0;               // 阻止发生
}
break;
}



如果 uMsg是WM_CLOSE,窗口将被关闭。我们发出退出消息,主循环将被中断。变量done被设为TRUE,WinMain()的主循环中止,程序关闭。
case WM_CLOSE:
{
PostQuitMessage(0);   // 发出退出消息
return 0;
}
   

如果键盘有键按下,通过读取wParam的信息可以找出键值。我将键盘数组keys[ ]相应的数组组成员的值设为TRUE。这样以后就可以查找key[ ]来得知什么键被按下。允许同时按下多个键。
case WM_KEYDOWN:
{
keys[wParam] = TRUE;
return 0;
}
   

同样,如果键盘有键释放,通过读取wParam的信息可以找出键值。然后将键盘数组keys[ ]相应的数组组成员的值设为FALSE。这样查找key[ ]来得知什么键被按下,什么键被释放了。键盘上的每个键都可以用0-255之间的一个数来代表。举例来说,当我们按下40所代表的键时,keys[40]的值将被设为TRUE。放开的话,它就被设为FALSE。这也是key数组的原理。
case WM_KEYUP:
{
keys[wParam] = FALSE;
return 0;
}

 

当调整窗口时,uMsg 最后等于消息WM_SIZE。读取lParam的LOWORD 和HIWORD可以得到窗口新的宽度和高度。将他们传递给ReSizeGLScene(),OpenGL场景将调整为新的宽度和高度。
case WM_SIZE:
{
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));   // 调整OpenGL窗口大小  LoWord=Width,HiWord=Height
return 0;
}

} 

余无关的消息被传递给DefWindowProc,让Windows自行处理。 
return DefWindowProc(hWnd,uMsg,wParam,lParam);        //向 DefWindowProc传递所有未处理的消息。
}

 

posted @ 2009-11-01 20:07  大Vin  阅读(572)  评论(0编辑  收藏  举报