#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( );
}
Я надеюсь, что это имеет смысл.