Как обработать сообщение, отправленное из класса представления в диалог?

У меня есть приложение SDI с ручным просмотром, документацией и мейнфреймом. В классе просмотра у меня есть кнопка, чтобы открыть другое диалоговое окно, скажем, диалоговое окно фрахтования. Я хотел бы открыть этот диалог и отправить начальное значение из представления, чтобы назначить некоторую переменную в диалоге, но я не могу перехватить событие сообщения в классе диалога. Ниже мой код:

    // button onclick to show new dialog
    charteringDlg = new CharteringDlg();
// show chartering dialog
if(charteringDlg->Create(IDD_DIALOG_CHATTERING, GetDesktopWindow()))
{
    bChartering = true;
    charteringDlg->MoveWindow(900,300,450,300);
    charteringDlg->ShowWindow(SW_SHOW); 

    int temp = 12;

    GetMain()->SendMessage(UWM_MYMESSAGE_CHARTERING, 0,(LPARAM)&temp);
}

и в диалоговом окне фрахтования я обрабатываю сообщение, как показано ниже

ON_MESSAGE(UWM_MYMESSAGE_CHARTERING, &CharteringDlg::OnSetShowTemp)

функция фрахтования

LRESULT CharteringDlg::OnSetShowTemp(WPARAM, LPARAM lParam)
{
    int * s = (int *)lParam;

    return 0;
}

Я установил точку останова в функции OnSetShowTemp(), но она не может перейти туда. Любая идея будет принята с благодарностью.


person Lê Duy Cường    schedule 18.01.2019    source источник
comment
GetMain()->SendMessage(UWM_MYMESSAGE_CHARTERING, 0,(LPARAM)&temp); -> charteringDlg->SendMessage(UWM_MYMESSAGE_CHARTERING, 0,(LPARAM)&temp);. Или еще проще: charteringDlg->thevalueorwhatever = 12.   -  person Jabberwocky    schedule 18.01.2019
comment
большое спасибо, я не думаю, что это так просто. если вы опубликуете как ответ, я приму ^^   -  person Lê Duy Cường    schedule 18.01.2019
comment
Кстати, вы создаете немодальный или модальный диалог? Если он немодальный, может быть полезно погуглить немодальный диалог mfc. Вам нужно позаботиться об удалении модального диалога после его закрытия.   -  person Jabberwocky    schedule 18.01.2019


Ответы (1)


Чтобы присвоить начальное значение одному из членов вашего диалога, вам не нужно отправлять ему сообщение.

Вы можете просто присвоить значение напрямую:

Итак, вместо

GetMain()->SendMessage(UWM_MYMESSAGE_CHARTERING, 0,(LPARAM)&temp);

у вас должно быть что-то вроде:

charteringDlg->thevalueorwhatever = 12;

И кстати:

GetMain()->SendMessage(UWM_MYMESSAGE_CHARTERING, 0,(LPARAM)&temp);

в любом случае неправильно, вы должны отправить сообщение в диалоговое окно, а не в главное окно:

charteringDlg->SendMessage(UWM_MYMESSAGE_CHARTERING, 0,(LPARAM)&temp);
person Jabberwocky    schedule 18.01.2019
comment
Или просто предоставьте общедоступные методы для получения/установки значения переменной и сохранения конфиденциальности самой переменной. - person Andrew Truckle; 19.01.2019