一、需求

MFC程序可能有许多个对话框,有主对话框,有子对话框,本文介绍父子对话框之间的消息传递。适用于外部事件、外部通知等事件。为简单起见,只针对父窗口传递消息到子窗口。

" />

MFC小笔记:父子窗口传递消息

一、需求

MFC程序可能有许多个对话框,有主对话框,有子对话框,本文介绍父子对话框之间的消息传递。适用于外部事件、外部通知等事件。为简单起见,只针对父窗口传递消息到子窗口。

二、界面

主界面为对话框,上有一Button,点击进入子对话框(使用非模态方式)。对话框界面有Static控件输出信息。过程省略。

三、原理

自定义消息ID。在子窗口中响应该消息,事件发起者使用SendMessage函数发送消息。发送时可以指定子窗口句柄。

四、编码

定义消息ID,必须大于WM_USER,为方便起见,可在stdafx.h中定义:

1
#define WM_MY_EVENT (WM_USER + 1086)

在子对话框头文件声明消息响应函数:

1
afx_msg LRESULT OnMyEvent(WPARAM wParam, LPARAM lParam);

在子对话框实现文件,添加消息与响应函数的关联:

1
2
3
4
BEGIN_MESSAGE_MAP(CDlgChild, CDialogEx)
// ...
ON_MESSAGE(WM_MY_EVENT, OnMyEvent)
END_MESSAGE_MAP()

同一文件,实现响应函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 父窗口发来的消息,进行响应
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;
}

在其主界面实现代码中发送消息:

1
2
3
int sendtype = 2;
HWND hWnd = m_pDlgChild->GetSafeHwnd(); // 指定子窗口
::SendMessage(hWnd, WM_MY_EVENT, (WPARAM)&sendtype, NULL);

本文只是简单使用,复杂场合暂未有使用。