MFC SDI ON_消息编译错误

MFC SDI ON_消息编译错误,mfc,Mfc,在我的MFCSDI应用程序中,在从CDocument派生的文档部分,我添加了一个用于发布消息的用户消息处理程序,如下所示。我得到编译错误: 错误C2440:“静态\u强制转换”:无法从“void(\uuu thiscall CMyDoc::*)(WPARAM,LPARAM)”转换为“LRESULT(\uuu thiscall CWnd::*)(WPARAM,LPARAM)” CMyDoc.cpp: #define UWM_Message1 (WM_APP+1) BEGIN_MESSAGE_M

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

错误C2440:“静态\u强制转换”:无法从“void(\uuu thiscall CMyDoc::*)(WPARAM,LPARAM)”转换为“LRESULT(\uuu 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);

不能在CDocument派生类中使用ON_消息。ON_消息需要CWnd派生类的函数(如编译器错误所示)。当在文档中时,没有HWND可向其发送消息/邮件。在视图或框架中捕获消息并将其转发到(活动)文档。视图支持GetDocument()返回指向文档的指针,然后直接调用函数

另外,原型不正确,应该是
afx\u msg LRESULT func(WPARAM,LPARAM)

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

在视图类头文件中:
afx\u msg LRESULT OnMyFunc(WPARAM,LPARAM)

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

BEGIN\u MESSAGE\u MAP(CMyView,CView)
//{{AFX_MSG_地图(CMyView)
ON_消息(UWM_消息1,&CMyView::OnMyFunc)
//}}AFX_MSG_地图
结束消息映射()

然后在视图cpp文件中的某个位置:

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

在文档类中,只需像通常一样添加公共成员“MyFunc”函数,并在其中执行所有处理。如果你不能把这些拼凑起来,我可以上传一个示例项目

第二次编辑:在你的文档类中

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

可以从CDocument派生类中的某个地方调用postmessage(..)吗?。即使我必须把信息发送给Cview?,你也可以在任何你想打电话给PostMessage的地方。CWnd有自己的PostMessage,因此如果在CWnd派生类中调用PostMessage(WM_MESSAGE,wparam,lparam),它将把消息放在当前窗口的消息队列中。要从任何类(包括CDocument)向任何窗口发布消息,请使用
::PostMessage(hWnd、WM_message、wparam、lparam)你能给我看一段说明你最初建议的代码吗?我还发现:谢谢你的代码。我需要从CDocument给postmessage打电话。和你做的正好相反。这可能吗?。我是SDI的新手。