У меня есть приложение MFC MDI. Приложение может открыть 2 или более диалоговых окна. Я хочу реализовать функцию «Сохранить рабочее пространство», чтобы пользователь при открытии рабочей области в следующий раз открыл диалоговые окна, которые были открыты, когда он сохранил и закрыл рабочую область. Как это сделать?Сохранить рабочее пространство MFC C++ MDI
ответ
Обычно это достигается путем хранения текущего состояния приложения в каком-то постоянном хранилище. В зависимости от вашей архитектуры это может быть локальный файл конфигурации (xml, json и т. Д.), Который хранится в каталоге профиля пользователя Windows (вы также можете использовать реестр Windows), можно использовать удаленный магазин, такой как база данных, или, возможно, такое состояние может храниться в облачном хранилище. Просто зависит от того, как приложение в настоящее время обрабатывает конфигурацию и как универсально вы хотите создать хранилище состояний.
Вам понадобится реализовать какую-либо историю запущенного состояния пользовательского интерфейса. Сохранение открытых окон и их местоположений при их загрузке, закрытии и перемещении. Внесите трекер истории в каждый созданный дочерний MDI. Это может быть одноточечный тип в родительском MDI. Он должен иметь возможность искать окно по его дескриптору и хранить соответствующую информацию в структуре, которая имеет смысл для сериализации. В каждом из вышеупомянутых событий добавляются вызовы трекеру с соответствующими изменениями. Трекер должен сохраняться в соответствии с любыми правилами, которые вы определяете.
Затем процесс загрузки требует, чтобы родитель MDI опросил трекер после того, как он инициализировался тем, что существовало когда-либо сохраненное состояние. Используя хранимую информацию (тип и местоположение окна (и данные?)), Родитель MDI затем открывает соответствующие дети в соответствующих местах.
Функциональность встроена в реализацию CMDIFrameWndEx. SaveMDIState сохраняет текущую настройку, а LoadMDIState восстанавливает ее. В документации также объясняется, как сохранить положение и размер самого окна кадра, если это то, что вы хотите.
Вам не нужно отслеживать изменения положения/размера или создание/уничтожение элементов, чтобы сбросить моментальный снимок текущего состояния. MFC не выполняет и продолжает реализовывать сохранение/восстановление. – IInspectable
В зависимости от ваших потребностей. Может быть, это все, что требуется. Что делать, если вам нужно восстановиться после выключения, которые не ожидаются? Что делать, если вы хотите сохранять состояния между отдельными машинами в разных сетях? –