一、需求
MFC程序可能有許多個對話框,有主對話框,有子對話框,本文介紹父子對話框之間的消息傳遞。適用於外部事件、外部通知等事件。爲簡單起見,只針對父窗口傳遞消息到子窗口。
二、界面
主界面爲對話框,上有一Button,點擊進入子對話框(使用非模態方式)。對話框界面有Static控件輸出信息。過程省略。
三、原理
自定義消息ID。在子窗口中響應該消息,事件發起者使用SendMessage
函數發送消息。發送時可以指定子窗口句柄。
四、編碼
定義消息ID,必須大於WM_USER,爲方便起見,可在stdafx.h中定義:
#define WM_MY_EVENT (WM_USER + 1086)
在子對話框頭文件聲明消息響應函數:
afx_msg LRESULT OnMyEvent(WPARAM wParam, LPARAM lParam);
在子對話框實現文件,添加消息與響應函數的關聯:
BEGIN_MESSAGE_MAP(CDlgChild, CDialogEx)
// ...
ON_MESSAGE(WM_MY_EVENT, OnMyEvent)
END_MESSAGE_MAP()
同一文件,實現響應函數:
// 父窗口發來的消息,進行響應
LRESULT CDlgChild::OnMyEvent(WPARAM wParam, LPARAM lParam)
{
int* type = (int*)wParam;
if (*type == 1)
{
GetDlgItem(IDC_STC_SET_TIPS)->SetWindowTextW(L"消息類型1");
m_nWaitReconnect = 1;
}
else if (*type == 2)
{
GetDlgItem(IDC_STC_SET_TIPS)->SetWindowTextW(L"消息類型2");
}
return 0;
}
在其主界面實現代碼中發送消息:
int sendtype = 2;
HWND hWnd = m_pDlgChild->GetSafeHwnd(); // 指定子窗口
::SendMessage(hWnd, WM_MY_EVENT, (WPARAM)&sendtype, NULL);
本文只是簡單使用,複雜場合暫未有使用。