Предложить пользователю сохранить изменения при закрытии представления MFC

У меня есть приложение MFC MDI, в котором документы могут иметь несколько представлений, а пользователи могут настраивать и затем сохранять данные макета для представлений. Эти данные связаны с представлениями, а не с документами.

Я хотел бы предложить пользователям сохранить, если они решат закрыть представление с несохраненными изменениями макета, и столкнулись с проблемами, так как кажется, что MFC ориентирован только на изменения в документе. Вот несколько подходов, которые я пробовал:

  1. Переопределить функцию CDocument :: SaveModified, которая вызывается платформой при закрытии документа. В этой функции я отправляю сообщение всем представлениям документа, который затем может проверить несохраненные изменения и запросить пользователя.

  2. Выполните проверку внутри деструктора View.

  3. Выполните проверку внутри обработчика OnClose View

У каждого из этих подходов есть свои проблемы. (1) является лучшим, но он не справляется со случаями, когда существует несколько представлений для одного документа, и пользователь закрывает одно из представлений. Поскольку документ все еще открыт, SaveModified не вызывается.

Проблема с (2) состоит в том, что при завершении работы приложения оно уже исчезает к тому времени, когда вызываются любые деструкторы CView. Это может оставить диалоговое окно для сирот открытым на рабочем столе. Это также тот случай, если я попытаюсь выполнить проверку внутри OnDestroy.

Я не могу заставить (3) работать — я не могу заставить свои взгляды отвечать на WM_CLOSE.

В настоящее время моим лучшим решением является выполнение обоих (1) и (2), но для этого требуется некоторая вонючая логика, чтобы приложение не предлагало пользователю дважды сохранять изменения представления при завершении работы приложения.

Кто-нибудь знает лучший способ сделать это? Где правильное место, чтобы зацепить?

0

Решение

Я не уверен, что это ваше решение, но у меня есть несколько представлений, которые не могут быть закрыты при условии, и я обрабатываю их в DestroyWindow( ), И окно сообщения там появляется над приложением, прежде чем оно закрывается. Так что попробуйте использовать DestroyWindow( ) а не деструктор.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]