Dragon  
Dragon
日历
<2008年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011
统计
  • 随笔 - 58
  • 文章 - 0
  • 评论 - 55
  • 引用 - 0

导航

常用链接

留言簿(3)

随笔分类(58)

随笔档案(58)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

        这是一篇自己理解所写的文章,若我有哪些地方理解不正确的,请指出,不想误导读者。
        在可视化的消息中,我们会发现他三个地方加了代码,但有的不同,在头文件中加的不是afx_msg开头,而用virtual,如OnOK
函数。一般加的代码的步骤是:
1.在头文件中加心afx_msg 开头的函数声明.
2.在实现文件的BEGIN_MESSAGE_MAP和END_MESSAGE_MAP()之间加ON_WM_或ON_MESSAGE的代码
3.最后还是在实现文件里加函数的实现


        但我还是有点不理解,最后想自己写一个自定义的消息映射程序,虽然没有写出来,但还是根据这些来猜这机制的执行原理,这些
程序都是上网查到的,
1.在头文件加:
  #define WM_MYMSG  WM_USER+5//自定义一个消息
  afx_msg void OnMyMessage(WPARAM wParam, LPARAM lParam); //自定义消息的处理函数声明


2.在实现文件里加:
  ON_MESSAGE(WM_MYMSG, OnMyMessage)
  //利用ON_MESSAGE()宏在自定义消息与其处理函数间建立映射关系


void CModelessDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
//从lParam中取出CString对象的指针,并将字符串内容在IDC_MSGEDIT中显示出来
{

    CString *str;
    str=(CString *)lParam;

    SetDlgItemText(IDC_EDIT,*str);
}


void CModelessDlg::OnMsgBTN()
{

 CString str= "自定义消息被触发了!";

 SendMessage(WM_MYMSG, 0, (LPARAM) &str);
 //给ModelessDlg自己发一个自定义的消息
}

        我的理解:它是根据WM_MYMSG来确定参数的值的(wParam,lParam),对于每一个消息操作函数来确定他的参数的,这里的SendMessage函数把WM_MYMSG与(wParam)0和(lParam)&str捆绑在一起了,所以,在我们用消息处理函数OnMyMessage()时,我们若要用到参数时我们就可以用这两个参数,在这的参数位置应该不可以改变的吧,我猜的.
后来看到一本书,自定义的消息函数一般带wParam,lParam这两个参数,加下面一段代码增加理解:

暂时理解消息函数是通过消息(WM_)对应的参数(wParam.lParam).

BOOL CServerDlg::PreTranslateMessage(MSG* pMsg)
{
 if (pMsg->message == WM_SOCKET)
 {
  m_sockCur = pMsg->wParam;
  m_nCurMsg = pMsg->lParam;
 }
 return CDialog::PreTranslateMessage(pMsg);
}
通过WM_SOCKET关联 pMsg->wParam和pMsg->lParam。
         但当我在用WSAAsyncSelect函数时没有看到他的消息参数(假如在这里是WM_SOCKET_READ)未与一些参数关联在一起,而且这个参数还是我自定义的,不是系统本身有的,它是用来接收消息的参数的,后来我查MSDN时发现他的描述是这样的:
  
   When one of the nominated network events occurs on the specified socket s, the application's window hWnd receives message wMsg. The wParam parameter identifies the socket on which a network event has occurred. The low word of lParam specifies the network event that has occurred. The high word of lParam contains any error code. The error code be any error as defined in Winsock2.h.

Note  Upon receipt of an event notification message, the WSAGetLastError function cannot be used to check the error value because the error value returned can differ from the value in the high word of lParam.

The error and event codes can be extracted from the lParam using the macros WSAGETSELECTERROR and WSAGETSELECTEVENT, defined in Winsock2.h as:

#define WSAGETSELECTERROR(lParam)       HIWORD(lParam)
#define WSAGETSELECTEVENT(lParam)       LOWORD(lParam)

    当一个指定的网络事件发生在指定的套接字s上时,应用程序的窗口句柄接收到一条消息wMsg,wParam识别网络事件发生在哪一个套接字上,lParam的低字段则指定发生的网络事件,高字段包括任意的错误代码,错误代码在Winsock2.h文件中定义.
    这事件和错误可以从lParam通过调用宏WSAGETSELECTERROR 和 WSAGETSELECTEVENT提取,在Winsock2.h文件中定义为:
    #define WSAGETSELECTERROR(lParam)       HIWORD(lParam)
    #define WSAGETSELECTEVENT(lParam)       LOWORD(lParam)


可以看出WSAAsyncSelect收到的参数还是在其它地方作过关联的,不然它也不会有值(wParam,lParam),这是我的推理,未证实.
   
typedef UINT WPARAM;(wParam的类型,w表示WORD)
typedef LONG LPARAM;(lParam的类型,l表示LONG)

posted on 2008-09-02 19:59 Dragon 阅读(502) 评论(0)  编辑 收藏 引用 所属分类: VC

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


 
Copyright © Dragon Powered by: 博客园 模板提供:沪江博客