问题:系统通过菜单项弹出一个对话框,需要视图响应该对话框的消息并更新视图。不可能在视图类中直接建立对话框控件的消息响应函数,因此需要自定义消息传递。由对话框发出消息,视图类接收,并作出重绘动作更新视图。
解决方法:
1)在应用程序类的头文件中,C***App类声明的前面定义消息宏:
#pragma once
#include "resource.h"
#define WM_USER_REDRAW (WM_USER + 1) // 自定义消息宏, WM_USER定义了非系统消息宏的起始位置,用户自定义的消息必须在位于其后的 ,所以定义为WM_USER + 1,如果有多个自定义消息可以用WM_USER + 2、WM_USER + 3 ... ...
class CMyApp : public CWinApp
{
public:
CMyApp();
public:
virtual BOOL InitInstance();
... ...
... ...
2)在视图类中建立对自定义消息响应的函数:
在视图类头文件中声明自定义消息响应函数:
//CMyView.h
... ...
... ...
public:
afx_msg LRESULT OnReDraw (WPARAM wParam,LPARAM lParam);
... ...
... ...
在视图类实现文件中定义函数体
//CMyView.cpp
... ...
... ...
... ...
BEGIN_MESSAGE_MAP(COntoPlantView, CView)
ON_MESSAGE (WM_USER_REDRAW,OnReDraw)
.......
END_MESSAGE_MAP()
LRESULT CMyView::OnReDraw(WPARAM wParam,LPARAM lParam)
{
... ...
// 视图重绘代码
... ...
return 1;
}
3)在对话框的消息响应函数中传递自定义消息;
void CMyDlg::OnReDraw()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CFrameWnd* pFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
CView* pView = pFrameWnd->GetActiveFrame()->GetActiveView();
pView->SendMessage(WM_USER_REDRAW,0,0); //向视图类传递消息
}