首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MFC SDI ON_MESSAGE编译错误

MFC SDI ON_MESSAGE编译错误
EN

Stack Overflow用户
提问于 2014-03-15 15:13:39
回答 1查看 1.5K关注 0票数 1

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

错误C2440:'static_cast‘:无法从'void (__thiscall CMyDoc::* ) (__thiscall,LPARAM)’转换为'LRESULT (LRESULT::* )(WPARAM,LPARAM)‘。

CMyDoc.cpp:

代码语言:javascript
复制
#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中:

代码语言:javascript
复制
public:
    afx_msg void OnMyFunc(WPARAM wParam, LPARAM lParam);
EN

回答 1

Stack Overflow用户

发布于 2014-03-15 15:51:01

不能在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; }

在您的document类中,只需像往常一样添加一个公共成员"MyFunc“函数,然后在那里执行所有处理。如果你不能把这些拼凑在一起,我可以上传一个示例项目。

第二个编辑:在您的doc类中

代码语言:javascript
复制
POSITION pos = GetFirstViewPosition();
if(pos != NULL) {
    CView* pView = GetNextView(pos);
    PostMessage(pView->GetSafeHwnd(), WM_YOUR_MESSAGE, wparam, lparam);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22420784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档