mfc,基于对话框的,我有两个对话框类,CWinpcapDlg(mfc生成的),CSettingDlg(我另外创建的),CWinpcapDlg对话框上有一个CListCtrl控件,我想把单击控件上某一行的消息发送到CSettingDlg上,调用CSettingDlg里的消息响应函数处理。
    我是这么做的:
void CWinpcapDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
     ::PostMessage(m_temphwnd, NM_CLICK, 0, 0);
     *pResult = 0; 
}
CSettingDlg中自己定义消息响应函数:
头文件中:afx_msg void OnListClickMsg();
源文件中:ON_MESSAGE(NM_CLICK, OnListClickMsg)(位置正确)void CSettingDlg::OnListClickMsg()
{
MessageBox("收到消息了");}可是没有对话框出现,也就是没有调用这样一个消息响应函数,请问是什么原因,非常感谢!!!!

解决方案 »

  1.   

    应该是消息没有发到的原因吧
    PostMessage(m_temphwnd, NM_CLICK, 0, 0); 
    检查m_temphwnd的有效性,是否为CSettingDlg的有效句柄
      

  2.   

    ON_MESSAGE对应的消息处理函数必须是LRESULT CSettingDlg::OnMessage(WPARAM, LPARAM),任何其他函数原型都是不正确的
    NM_CLICK消息根本不是这么发的,这个看看MSDN就知道他根本不是一个消息,而必须用WM_NOTIFY发送,是WM_NOTIFY的一个子消息。另外不是所有东西都可以用PostMessage的,WM_NOTIFY就应该用SendMessage,绝大多数系统消息都如此
    合理的发送方法是:::SendMessage(m_temphwnd, WM_NOTIFY, (WPARAM)IDC_LISTVIEW, (LPARAM)&nhm );
    其中IDC_LISTVIEW是你对应对话框内的控件的对应的ID,nhm是一个 NMHDR 结构NMHDR nhm;
    nhm.code=NM_CLICK;
    nhm.idFrom=IDC_LISTVIEW;
    nhm.hwndFrom=listview.m_hWnd;这个消息基本上是控件通知父窗口的,不应该把这种消息送给另外一个窗口。如果你要通知另外一个窗口,应该自定义一个消息来做,而不是用WM_NOTIFY
      

  3.   

    不要凭想象写代码,如果不确定,第一个要做的就是查MSDN
      

  4.   

    ::SendMessage(m_temphwnd, WM_NOTIFY, (WPARAM)IDC_LISTVIEW, (LPARAM)&nhm ); 
    其中IDC_LISTVIEW是你对应对话框内的控件的对应的ID,nhm是一个 NMHDR 结构 NMHDR nhm; 
    nhm.code=NM_CLICK; 
    nhm.idFrom=IDC_LISTVIEW; 
    nhm.hwndFrom=listview.m_hWnd; 
    正确的写法
      

  5.   

    NM_CLICK不是消息,是通知事件,要响应WM_NOTIFY消息再来判断。
      

  6.   

    谢谢阿荣,搞好了,我用postmessage试了一下, 也是可以的