問題:系統通過菜單項彈出一個對話框,需要視圖響應該對話框的消息並更新視圖。不可能在視圖類中直接建立對話框控件的消息響應函數,因此需要自定義消息傳遞。由對話框發出消息,視圖類接收,並作出重繪動作更新視圖。
解決方法:
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); //向視圖類傳遞消息
}