ON_MESSAGE

来源:互联网 发布:八进制转十进制算法 编辑:程序博客网 时间:2024/06/13 12:05

昨天在socket异步选择模型试验时,写那个回调的消息处理函数.
写成4个参的了(hwnd, umsg, wparam, lparam), 收到的eventid是编外的,很奇怪.
后来实在没招,对照正确的实现,才找到区别. 原来回调消息处理是2个参的(wparam, lparam).

用了一个多小时,解决这个问题。

总结一下,遇到这类问题怎么搞.
就算消息处理函数写的不对,那就在入口处断住,去调用链上看看, MFC是按照怎样的消息处理函数来调用的,一下子就清楚了, 这样搞最简单.

    case AfxSig_lwl:        lResult = (this->*mmf.pfn_lwl)(wParam, lParam);        break;

去看ON_MESSAGE或定下的消息映射宏也可以

// for Windows messages#define ON_MESSAGE(message, memberFxn) \    { message, 0, 0, 0, AfxSig_lwl, \        (AFX_PMSG)(AFX_PMSGW)(LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM))&memberFxn },

msdn上也有的,可是我当时看到另外一个分支上去了
这里写图片描述
这个分支上就没写自定义消息函数有几个参,我就想当然的搞了4个参…
这里写图片描述
总之,就是当时没想到,挫了.

    //}}AFX_MSG_MAP    ON_MESSAGE(WM_SHOW_THREAD_MSG, OnShowThreadMsg)END_MESSAGE_MAP()
    //}}AFX_MSG    afx_msg void OnShowThreadMsg(WPARAM wParam, LPARAM lParam);    DECLARE_MESSAGE_MAP()
void CPingUIDlg::OnShowThreadMsg(WPARAM wParam, LPARAM lParam) {    CString str;    EnterCriticalSection(&g_csDispMsg);    if (0 == wParam) {        while (!m_ListDispMsg.empty()) {            str = m_ListDispMsg.front();            m_ListDispMsg.pop_front();            ShowMsg((LPTSTR)(LPCTSTR)str);        }    } else {        m_CtrlListBoxMsg.ResetContent();    }    LeaveCriticalSection(&g_csDispMsg);}
0 0