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