Member 14594285 Ответов: 1

Отправить сообщение из диалогового окна ребенку


Я нашел в интернете способ отправки сообщений от ребенка к диалогу, но если я хочу отправить сообщение от диалога к ребенку?

Что я уже пробовал:

Чтобы отправить из дочернего диалога в диалоговый я нашел этот метод:

#define UWM_CUSTOM (WM_APP+1)

// in child
CString str = _T("Test");
GetParent()->SendMessage(UWM_CUSTOM, (WPARAM)&str, 0);

// in parent
ON_MESSAGE(UWM_CUSTOM, OnCustom)

LRESULT Cxx::OnCustom(WPARAM wparam, LPARAM lparam)
{ CString* pstr = (CString*)wparam;
  ...use pstr
  return 0;
}



но я хочу сделать все наоборот

Mohibur Rashid

Если вы знаете указатель CWnd, вы определенно можете написать что-то вроде этого
child_window->SendMessage(...);

Вам придется хранить адрес child_window в какой-то переменной, в противном случае вам придется найти другой метод идентификации Вашего ребенка.

1 Ответов

Рейтинг:
2

Leo Chapiro

Если ваше дочернее окно немодально, вы можете использовать указатель на свой диалог и использовать

#define UWM_CUSTOM (WM_APP+1)

// in parent
void CMFCApplicationTestDlg::OnBnClickedButCreatedlg()
{
	CString str = _T("Test");
	CChildDlg* pChildDlg = new CChildDlg(this);
	pChildDlg->Create(IDD_DIALOG_CHILD, this);

	pChildDlg->ShowWindow(SW_SHOW);

       //pChildDlg->SendMessage(UWM_CUSTOM, (WPARAM)&str, 0);
       // Better
       pChildDlg->PostMessage(UWM_CUSTOM, (WPARAM)&str, 0);
}



Если ваше дочернее окно является модальным, вы не можете этого сделать, потому что после
DoModal()
возвращает, Диалог уже будет уничтожен.


Member 14594285

что такое pChildDlg?

Member 14594285

во всяком случае, я использовал ShowWindow(true), чтобы показать дочерний диалог

KarstenK

pChildDlg-это указатель на дочерний диалог. Вам лучше использовать PostMessage, чтобы не блокировать внутреннюю очередь сообщений, которая может привести к блокировке приложения.

Member 14594285

поэтому я должен писать.
MyDlg * pChildDlg = новый pChildDlg;

pChildDlg->SendMessage(UWM_CUSTOM, (WPARAM)&str, 0);

Leo Chapiro

Да, лучше, как сказал Карстен, использовать почтовое сообщение.

Member 14594285

Я пытался, но это не работает, у моего родительского диалога есть кнопка, которая при нажатии открывает дочерний диалог, я пытался, как вы написали, но это не работает

Member 14594285

Я написал::
MyDlg2 * pChild = новый MyDlg2;

pChild->SendMessage(UWM_CUSTOM, (WPARAM)&stra, 0);

но когда я делаю отладку возникает ошибка

Leo Chapiro

Я обновил, взгляните (выше).

Member 14594285

Это не работает
Я написал в Родительском диалоге:


CString str = _T("тест");
MyDlg2* pChildDlg = новый MyDlg2(это);
pChildDlg->Create(IDCANCEL, this);

pChildDlg->ShowWindow(SW_SHOW);

//pChildDlg->SendMessage(UWM_CUSTOM, (WPARAM)&str, 0);
// Лучше
pChildDlg->PostMessage(UWM_CUSTOM, (WPARAM)&str, 0);
//dlg.DoModal();// TODO: добавьте свой код обработчика уведомлений управления здесь


в дочернем диалоге:

BEGIN_MESSAGE_MAP(MyDlg2, CDialogEx)
ON_BN_CLICKED(IDC_BUTT_DIALOG, &MyDlg2::OnBnClickedButtDialog)
ON_MESSAGE(UWM_CUSTOM, OnCustoma)
END_MESSAGE_MAP()

и:
LRESULT MyDlg2::OnCustoma(WPARAM wparam, LPARAM lparam)
{
CString* pstr = (CString*)wparam;

//тесто.SetWindowText(*pstr);
m_text.SetWindowText(*pstr);



возвращает 0;
}

но это не работает

Leo Chapiro

Он не может работать: pChildDlg->Create(IDCANCEL, this);
Сначала вам нужно создать новый диалог, IDD_DIALOG_CHILD в моем примере-это его идентификатор. Посмотри: Создайте Немодальное диалоговое окно в качестве дочернего окна

Member 14594285

У меня уже есть свой диалог, он статичен, идентификатор моего дочернего диалога-IDCANCEL