Windows编程(3)

  消息的处理

  我已经说过消息在窗口里的作用了,下面让我们来仔细学习一下它。处理消息的函数结构如下:

LRESULT CALLBACK MsgHandler( 【有时被命名为WndProc,随便你】
HWND hwnd, // window handle
UINT msg, // the message identifier
WPARAM wparam, // message parameters
LPARAM lparam // more message parameters
);

  这个LRESULT类型要求返回一个32位的整数。实际取值依赖于消息,但是这个值很少在应用程序代码中得到应用。以前我们谈到过一点CALLBACK协定,它的参数很简单:

  ※ HWND hwnd:是接收消息的窗口的句柄,也是由CreateWindowEx()函数返回的句柄。

  ※ UINT msg:这是一个消息标识符,都是以WM_打头的符号常量,意思是“Windows Message”。很多的,这里只介绍一些常用的:

  ◎ WM_ACTIVATE:一个新窗口被激活。
  ◎ WM_CLOSE:一个窗口被关闭。
  ◎ WM_COMMAND:一个菜单功能被选择。
  ◎ WM_CREATE:一个窗口被建立。
  ◎ WM_LBUTTONDBLCLK:鼠标左键被双击。
  ◎ WM_LBUTTONDOWN:鼠标左键被按下。
  ◎ WM_MOUSEMOVE:鼠标被移动。
  ◎ WM_MOVE:一个窗口被移动。
  ◎ WM_PAINT:窗口的一部分需要重画。
  ◎ WM_RBUTTONDBLCLK:鼠标的右键被双击。
  ◎ WM_RBUTTONDOWN:鼠标的右键被按下。
  ◎ WM_SIZE:窗口的大小被改变。
  ◎ WM_USER:干你想干的。

  ※ WPARAM wparam,LPARAM lparam:消息参数。它们提供有关消息的附加信息,这两个值对于每条消息来说都是特定的。

  你要把所有要发生的消息都写进程序代码的话,我想你可能已经累疯了。我想我会的。感谢上帝,Windows提供了默认消息处理,如果你没有任何特殊的消息需要处理了,你总是要用DefWindowPorc()函数的,下面给一个最简单的例子,没有任何特定的消息要处理的例子:

LRESULT CALLBACK MsgHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
return(DefWindowProc(hwnd, msg, wparam, lparam));
}

  简单吧!但通常你都需要处理一些自己的消息,你要写自己的程序代码,然后返回0,来告诉程序你干完了。下面是一个例子,当窗口建立时,你调用了一个初始化的函数Initialize_Game(),然后返回0,最后告诉程序自己处理那些默认的消息吧:

LRESULT CALLBACK MsgHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
if (msg == WM_CREATE)
{
Initialize_Game();
return(0);
}

return(DefWindowProc(hwnd, msg, wparam, lparam));
}

  你很可能需要一个“switch”结构来手动完成你想要控制的消息,然后把剩下的交给DefWindowProc()去做。大功告成前,我不得不提醒您一件事,就是怎样使你的消息控制得到响应呢?

tags: ,

this entry was posted on 星期一, f 1747, 06 at 7:10 pm and is filed under con-bak. you can follow any responses to this entry through the rss 2.0 feed. you can leave a response, or trackback from your own site.

Leave a Reply