为何在自定义消息处理函数中无法利用wParam或lParam传递指针?

答:利用ON_COMMAND()宏创建的自定义消息处理机制确实无法使用wParam与lParam参数,这是由于ON_COMMAND()宏决定的。如果需要使用wParam与lParam参数,那么应当使用ON_MESSAGE()宏,由它扩展生成的消息处理函数的原型中才有这两个参数。

在.H文件中需要加入#define WM_MYMSG WM_USER+5以自定义一个消息,并在消息处理映射表中加入afx_msg void OnMyMessage(WPARAM wParam, LPARAM lParam)进行自定义消息的处理函数声明,这个声明一定要放在DECLARE_MESSAGE_MAP()宏之前。

afx_msg void OnMyMessage(WPARAM wParam, LPARAM lParam); //自定义消息的处理函数声明在.CPP文件中的消息映射表(BEGIN_MESSAGE_MAP与END_MESSAGE_MAP宏之间的内容)中需要加入ON_MESSAGE(WM_MYMSG, OnMyMessage)宏在自定义消息与其处理函数间建立映射关系,并实现消息处理函数void CModelessDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)。

void CModelessDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
//从lParam中取出CString对象的指针,并将字符串内容在IDC_MSGEDIT中显示出来
{
  CString* pStr = (CString*) lParam;
  ASSERT(pStr != NULL);
      
  CEdit* pEdit = (CEdit *) GetDlgItem(IDC_MSGEDIT);
  ASSERT(pEdit != NULL);

  pEdit->SetWindowText(*pStr);
}

下载源代码


ON_COMMAND用来处理WM_COMMAND消息。老式的windows控件发送WM_COMMAND作为对父窗口的通知消息。另外,菜单,工具栏也向框架窗口发送WM_COMMAND消息。   
 ON_MESSAGE主要用来处理用户自定义消息。

原文地址:https://www.cnblogs.com/wqj1212/p/1089029.html