在我的MFC SDI应用程序中,在从CDocument派生的文档节中,我添加了一个用于发布消息的用户消息处理程序,如下所示。我得到了编译错误:
错误C2440:'static_cast‘:无法从'void (__thiscall CMyDoc::* ) (__thiscall,LPARAM)’转换为'LRESULT (LRESULT::* )(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);发布于 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类中
POSITION pos = GetFirstViewPosition();
if(pos != NULL) {
CView* pView = GetNextView(pos);
PostMessage(pView->GetSafeHwnd(), WM_YOUR_MESSAGE, wparam, lparam);
}https://stackoverflow.com/questions/22420784
复制相似问题