MFC SDI ON_MESSAGE编译错误

时间:2014-03-15 07:13:39

标签: mfc

在我的MFC SDI应用程序中,在从CDocument派生的文档部分中,我添加了一个用于发布消息的用户消息处理程序,如下所示。我收到编译错误:

错误C2440:'static_cast':无法从'void(__ thiscall CMyDoc :: *)(WPARAM,LPARAM)'转换为'LRESULT(__thiscall CWnd :: *)(WPARAM,LPARAM)'

CMyDoc.cpp:

#define UWM_Message1 (WM_APP+1)

BEGIN_MESSAGE_MAP(CMyDoc, CDocument)
    //{{AFX_MSG_MAP(CMyDoc)
        // NOTE - the ClassWizard will add and remove mapping macros here.
        //    DO NOT EDIT what you see in these blocks of generated code!
    ON_MESSAGE(UWM_Message1, &CMyDoc::OnMyFunc)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()


void CMyDoc::OnMyFunc(WPARAM wParam, LPARAM lParam)
{
    int Len = (int)wParam;
    BYTE * pBuf  = (BYTE*)lParam;
    //do stuff..

    return;
}

CMyDoc.h:

在CMyDoc类中:

public:
    afx_msg void OnMyFunc(WPARAM wParam, LPARAM lParam);

1 个答案:

答案 0 :(得分:1)

您无法在CDocument派生类中使用ON_MESSAGE。 ON_MESSAGE需要CWnd派生类的函数(如编译器错误所示)。在doc中,SendMessage / PostMessage没有HWND。在视图或框架中捕获消息并将其转发到(活动)文档。该视图支持GetDocument()返回指向文档的指针,然后直接调用该函数。

此外,原型不正确,应为afx_msg LRESULT func(WPARAM, LPARAM)

编辑:根据要求添加了示例代码

在您的视图类头文件中: afx_msg LRESULT OnMyFunc(WPARAM, LPARAM)

在您的视图cpp文件中,在消息映射中:

BEGIN_MESSAGE_MAP(CMyView, CView) //{{AFX_MSG_MAP(CMyView) ON_MESSAGE(UWM_Message1, &CMyView::OnMyFunc) //}}AFX_MSG_MAP END_MESSAGE_MAP()

然后在你的视图cpp文件中的某个地方:

LRESULT CMyView::OnMyFunc(WPARAM wParam, LPARAM lParam) { GetDocument()->MyFunc(wParam, lParam); return 0; }

在您的文档课程中,只需添加一个公共成员" MyFunc"像你一样的功能通常在那里进行所有的处理。如果你不能把它拼凑在一起,我可以上传一个示例项目。

第二次编辑:在你的doc课程中

POSITION pos = GetFirstViewPosition();
if(pos != NULL) {
    CView* pView = GetNextView(pos);
    PostMessage(pView->GetSafeHwnd(), WM_YOUR_MESSAGE, wparam, lparam);
}