MFC Как закрыть немодальный диалог при переключении представлений

#c #mfc #visual-c -2010

#c #mfc #visual-c -2010

Вопрос:

У меня есть представление, содержащее немодальный диалог.

Все работает нормально, за исключением того, что при взаимодействии с диалогом отправляется сообщение об изменении объектов в текущем активном представлении. Это приводит к сбою при переключении на новое представление или другой вид, потому что объект не существует в этом новом представлении.

Я хочу спросить, как закрыть немодальный диалог при переключении представления?

Должно ли это обрабатываться в классе view или document class?

Маршрут сообщения — Диалог -> отправить пользовательское сообщение -> мэйнфрейм -> получить текущее активное представление -> передать сообщение -> просмотреть дескриптор сообщения получение сообщения

Спасибо

Комментарии:

1. Если вы создаете немодальный диалог в качестве члена и дочернего элемента класса CView, все в значительной степени происходит автоматически. Он будет приходить и уходить вместе с представлением. Вы создаете это во фрейме или что-то в этомроде? В противном случае, вы уверены, что ваш сбой вызван диалогом? Как выглядит стек?

2. @lakeweb Я новичок в этом. Как мне создать диалоговое окно в качестве члена и дочернего элемента представления? Все, что я сделал, это ввел CMyDialog * (расширяет CDialog) в класс view и вызывал новые функции CMyDialog(), Create(), когда мне это нужно. Нужно ли указывать его родительский вид при создании диалога?

Ответ №1:

И, возможно, имеет больше смысла делать это во фрейме представления. Итак…

В .h:

 class MyFrm: public CFrameWnd
{
    MyDialog dlg;
};
  

в .cpp:

 MyFrm::MyFrm( )
    :dlg( this )
}

void MyFrm::OnInitialUpdate()
{
    tagDlg.Create( this );
    tagDlg.ShowWindow( SW_NORMAL );
}
  

И если вы хотите переключить диалоговое окно, скажем, с помощью пункта меню в качестве переключателя. Вместо того, чтобы создавать его в OnInitialUpdate , вы могли бы:

 void MyFrm::OnToggleDlg( )
{
    if( ! dlg.GetSafeHwnd( ) )
    {
        dlg.Create( this );
        dlg.ShowWindow( SW_NORMAL );
    }
    else
        dlg.DestroyWindow( );
}
  

Я надеюсь, что это имеет смысл.