У меня есть приложение MFC MDI, в котором документы могут иметь несколько представлений, а пользователи могут настраивать и затем сохранять данные макета для представлений. Эти данные связаны с представлениями, а не с документами.
Я хотел бы предложить пользователям сохранить, если они решат закрыть представление с несохраненными изменениями макета, и столкнулись с проблемами, так как кажется, что MFC ориентирован только на изменения в документе. Вот несколько подходов, которые я пробовал:
Переопределить функцию CDocument :: SaveModified, которая вызывается платформой при закрытии документа. В этой функции я отправляю сообщение всем представлениям документа, который затем может проверить несохраненные изменения и запросить пользователя.
Выполните проверку внутри деструктора View.
Выполните проверку внутри обработчика OnClose View
У каждого из этих подходов есть свои проблемы. (1) является лучшим, но он не справляется со случаями, когда существует несколько представлений для одного документа, и пользователь закрывает одно из представлений. Поскольку документ все еще открыт, SaveModified не вызывается.
Проблема с (2) состоит в том, что при завершении работы приложения оно уже исчезает к тому времени, когда вызываются любые деструкторы CView. Это может оставить диалоговое окно для сирот открытым на рабочем столе. Это также тот случай, если я попытаюсь выполнить проверку внутри OnDestroy.
Я не могу заставить (3) работать — я не могу заставить свои взгляды отвечать на WM_CLOSE.
В настоящее время моим лучшим решением является выполнение обоих (1) и (2), но для этого требуется некоторая вонючая логика, чтобы приложение не предлагало пользователю дважды сохранять изменения представления при завершении работы приложения.
Кто-нибудь знает лучший способ сделать это? Где правильное место, чтобы зацепить?
Я не уверен, что это ваше решение, но у меня есть несколько представлений, которые не могут быть закрыты при условии, и я обрабатываю их в DestroyWindow( )
, И окно сообщения там появляется над приложением, прежде чем оно закрывается. Так что попробуйте использовать DestroyWindow( )
а не деструктор.
Других решений пока нет …