background image

木有页眉

WM_COMMAND 消息发送,WPARAM 的高字中(HIWORD(wParam))是命令的 ID 号,对菜单来讲就
是菜单 ID

 

。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。

2、谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可以对消息进行分析,
对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对 WM_COMMAND 进
行处理的代码,如果希望在窗口中进行图形输出就必须对 WM_PAINT

 

进行处理。

3、未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处
理消息。正因为有了这个默认窗口过程我们才可以利用 Windows 的窗口进行开发而不必过多关注窗口各

 

种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。

4、窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,
发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,
所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时
消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。

5

 

、示例:下面有一段伪代码演示如何在窗口过程中处理消息

LONG yourWndProc(HWND hWnd,UINT uMessageType,WPARAM wP,LPARAM)
{

switch(uMessageType)
{       //使用 SWITCH 语句将各种消息分开

case(WM_PAINT):

doYourWindow(...);//在窗口需要重新绘制时进行输出

break;
case(WM_LBUTTONDOWN):

doYourWork(...);//在鼠标左键被按下时进行处理

break;
default:

callDefaultWndProc(...);//对于其它情况就让系统自己处理

break;

}

}
接下来谈谈什么是消息机制:系统将会维护一个或多个消息队列,所有产生的消息都回被放入或是插
入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序
的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的
句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以 Windows 可以同时进行多

 

个任务。下面的伪代码演示了消息循环的用法:
while(1)
{

id=getMessage(...);
if(id == quit)

break;

translateMessage(...);

}

3