今天帮一个朋友写一个网络小程序,主要功能是把客户端发给服务端的信息在返回给客户,类似linux下的命令echo。程序要求能够处理3~5个连接,再加上要输入信息,我想用WSAAsynSelect网络模型再合适不过了。可是动手一写遇到一个问题。 WSAAsynSelect模型是基于窗口消息的,用户自定义网络消息的处理函数,网络连接和网络事件分别当作函数参数wParam和lParam来传递。在Win API编程中,wParam和lParam是消息处理函数的两个参数,我们可以直接拿来使用,而MFC中就不行了。这些消息被系统封装起来,比如我定义的OnSocket()消息,它没有传入参数,我无法直接获取wParam和lParam参数。但是我想肯定会有方法的,MFC毕竟只是对Win API的一个封装,底层调用还是相同的,于是在csdn上发贴询问,终于解决了问题。现在把两种方法总结一下: 1、重载PreTranslateMessage(MSG* pMsg) 函数 在MFC中,消息处理机制被PreTranslateMessage函数代替了,每条消息都经过PreTranslateMessage来分配。它是CDialog类中的一个虚函数,我们只要重载它,截获这些消息。其中pMsg中就包含了message,wParam,lParam三个参数,我们首先判断message参数是不是我们需要处理的消息,如果是,则把wParam,lParam参数记录下来。比如我写的一个处理函数: BOOL CServerDlg::PreTranslateMessage(MSG* pMsg) 2、使用CWnd::GetCurrentMessage()直接获得当前消息 在我用第1种方法解决问题之后,发现网上又有高手回复直接使用这个函数,我马上查了一下msdn,果真有这个直接获取当前消息的函数,其说明如下: static const MSG* PASCAL GetCurrentMessage( ); Return Value Returns a pointer to the MSG structure that contains the message the window is currently processing. Should only be called when in an OnMessage handler. 很明显,我们要获取当前消息内容,直接调用GetCurrentMessage就可以了,这才是最简单合理的路径。 MFC的函数很多,不可能一下子都掌握,只能是慢慢总结。希望这个总结对遇到同样问题的人有所帮助。
文章来自:http://hi.baidu.com/sangwf/blog/item/0003d32a505c682dd52af164.html |
MFC中获取消息参数wParam,lParam
最新推荐文章于 2023-09-14 11:25:42 发布