您的位置:首页 > 理论基础 > 计算机网络

MFC中获取消息参数wParam,lParam

2007-05-10 01:36 483 查看
    今天帮一个朋友写一个网络小程序,主要功能是把客户端发给服务端的信息在返回给客户,类似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)
{
 // TODO: Add your specialized code here and/or call the base class
 if (pMsg->message == WM_SOCKET)
 {
  m_sockCur = pMsg->wParam;
  m_nCurMsg = pMsg->lParam;
 }
 
 return CDialog::PreTranslateMessage(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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息