【问题标题】:MFC SDI ON_MESSAGE compilation errorMFC SDI ON_MESSAGE 编译错误
【发布时间】:2014-04-20 16:13:26
【问题描述】:

在我的 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);

【问题讨论】:

    标签: mfc


    【解决方案1】:

    您不能在 CDocument 派生类中使用 ON_MESSAGE。 ON_MESSAGE 需要一个 CWnd 派生类的函数(如编译器错误所示)。在文档中时,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”函数并在那里进行所有处理。如果你不能拼凑起来,我可以上传一个示例项目。

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

    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);
    • 你能给我看一段代码来说明你最初的建议吗?
    • 我还发现了这个:codeproject.com/Articles/5891/…
    • 感谢您的代码。我需要从 CDocument 调用 postmessage。你做的有点相反。这可能吗?。我是 SDI 的新手。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多