3.3.3 处理重要的事件
Windows是一个事件驱动的操作系统,对消息的处理是Windows编程(www.cppentry.com)的核心部分。3.3.2小节已经介绍过,在窗口过程中用switch-case分支语句实现对每种消息的不同操作,对于不同的消息,它们的wParam和lParam参数代表的意思也不一样,而Windows消息又有成百上千种,因此,在编写Windows应用程序的时候,最好能有WindowsAPI手册方便查阅。
本小节将介绍几种主要的Windows消息和通常对它们的处理方法。对于其他消息的处理方法也可以以此为借鉴。
1.WM_CLOSE的处理方法
该消息在单击窗口关闭按钮时被发送。此时窗口并没有被真的销毁,因此一般应用程序的做法是在处理这个消息的时候弹出一个提示框询问是否关闭,如果选择“是”,那么就关闭,否则不做任何处理。实例3-3显示了WM_CLOSE的一般处理方法。
实例3-3:WM_CLOSE的一般处理方法。
case WM_CLOSE: iRet = MessageBox( hWnd , "真的退出吗?" , "注意" , MB_YESNO); if( iRet == IDYES ) return DefWindowProc(hWnd, message, wParam, lParam); else return 0; |
在处理WM_CLOSE的过程中,首先弹出一个提示框显示“真的退出吗?”,这个提示框的样式是MB_YESNO,即有“是”和“否”两个按钮。如果选择“是”,那么就把这个消息交给系统的默认处理函数DefWindowProc去处理。系统的默认处理就是立即销毁窗口。如果选择“否”,那么就直接返回0,不做任何处理。上面的代码就通过这样的一个简单判断实现了退出的询问。
2.WM_MOUSEMOVE的处理方法
当鼠标在窗口区域中移动的时候,系统就会向窗口发送WM_MOUSEMOVE消息。鼠标的坐标信息被作为参数放在lParam中,其中x坐标放在lParam的低16位中,y坐标信息放在lParam的高16位中,鼠标的按键消息放在wParam中。wParam的按钮编码如表3-6所示。
表3-6 wParam的按钮编码
下面的实例显示了WM_MOUSEMOVE消息的一般处理方式。
实例3-4:WM_MOUSEMOVE消息的一般处理方式。
case WM_MOUSEMOVE: x = (int)LOWORD(lParam); y = (int)HIWORD(lParam); ibutton = (int)wParam; // … break; |
程序先用LOWORD和HIWORD取得参数lParam的低16位和高16位,然后把它们转化为横坐标和纵坐标,就可以进行相应的处理了。
鼠标的x,y坐标不是相对于整个屏幕而言的,而是相对于应用程序窗口而言的。当鼠标移动到应用程序窗口的左上角时,x和y的值都为0。
3. WM_COMMAND方法
如果用户选择菜单命令或者一个控件向父窗口发送通知消息的时候,窗口就会收到一个WM_COMMAND消息。伴随WM_COMMAND消息的lParam参数存放的是子控件窗口句柄,wParam的高16位存放的是子控件的通知代码,wParam的低16位存的是菜单命令消息。下面的实例展示了WM_COMMAND消息的一般处理过程。
实例3-5:WM_COMMAND消息的一般处理过程。
case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_ABOUT: // … break; case IDM_EXIT: // … break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; |
从上面的代码可以看出对于具体的菜单命令也采用switch-case分支进行判断。对于不同的菜单命令采取不同的处理。
Windows的消息有很多,它们都以WM_为前缀,本节不能对所有的消息处理过程一一介绍。对于其他的消息的意义和处理方法,可以参考MSDN。
【责任编辑:
雪花 TEL:(010)68476606】