Как отключить запись настроек рабочего пространства MFC в реестр? - PullRequest
5 голосов
/ 26 октября 2010

По умолчанию базовый проект MFC C ++ в Visual Studio 2010 сохраняет все настройки своего рабочего пространства в кусте реестра HKCU под настраиваемым пользователем именем ключа.Это включает в себя размер / положение последнего окна, настройки ленты, строку состояния и т. Д.

Как полностью отключить эту функцию, чтобы вообще не выполнять запись в реестр?

Я пытался не устанавливатьSetRegistryKey(), который дал мне отладочное утверждение из фреймворка при первом чтении / записи в реестр.SetRegistryKey((LPCTSTR)NULL) дал те же результаты.SetRegistryBase(), кажется, не имеет никакого эффекта.Никакие другие методы в CWinApp / CWinAppEx, похоже, не помогают.

Ответы [ 2 ]

4 голосов
/ 26 октября 2010

Редактировать: Мой первоначальный ответ был неверным.Я отредактировал ответ.


Вы можете указать MFC сохранять настройки в файле .ini вместо реестра.См. этот предыдущий ответ . (Обновление: это работает, только если вы не используете CWinAppEx.)

Если вы хотите запретить MFC сохранять некоторые из состояние меню и панелей инструментов всего , добавьте в конструктор вашего приложения следующее:

m_bSaveState = FALSE;

Элемент m_bSaveState определяется только в том случае, если ваше приложение является производным от CWinAppEx.

Кроме того, вы можете переопределить CWinAppEx::SaveState и CWinAppEx::LoadState.


. Чтобы исключить ключ реестра WindowPlacement, переопределите CWinAppEx::StoreWindowPlacement.

.Вы все еще можете получить другие записи реестра, которые пишутся.Полное решение будет включать создание подкласса CSettingsStore, а затем, в вашем приложении, вызов CSettingsStoreSP::SetRuntimeClass.( См. Это для получения дополнительной информации.) Это довольно сложно, потому что есть целый набор виртуальных функций, которые вам придется переопределить в вашем пользовательском CSettingsStore классе.

2 голосов
/ 23 декабря 2014

Я знаю, что для многих это поздно, но я обнаружил, что CFrameWndEx - он будет в вашем классе CMainFrame - использует окно WM_CLOSE, чтобы СОХРАНИТЬ расположение ваших приложений по умолчанию.Я не знаю, что загружает местоположение.Однако, если вы переопределяете WM_CLOSE, то это состояние окна никогда не сохраняется при выходе из программы.Он попытается перезагрузить ваше последнее состояние окна, но, поскольку ни одно из них не было сохранено с самого начала, беспокоиться не о чем.

Ситуация GOTCHA: Поскольку фреймворк по-прежнему вызывает какую-то функцию WM_INIT для ЗАГРУЗКИ последней позиции, если вы скомпилировали свой код как обычно, разверните окно приложения, закройте программу с помощью X, WM_CLOSE будет иметьсохранить состояние приложения как MAXIMIZED.Если вы перекомпилируете приложение, переопределив WM_CLOSE, как упомянуто выше, перезапустите приложение, вы заметите, что оно начинается в максимальном размере!Очевидно, не то, что вы хотели.Таким образом, вы должны повторно активировать (закомментировать WM_CLOSE), позволить программе сохранить состояние приложения путем повторного запуска программы при закрытии как обычного окна.Позвольте переопределенной WM_CLOSE работать снова, и вы увидите, что нормальное окно появляется снова.

КОД:

В вашем CMainFrame.h

public: afx_msg void OnClose ();

В вашем CMainFrame.cpp ... Расширьте вашу КАРТУ СООБЩЕНИЯ

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)



*ON_WM_CLOSE() // <<< I ADDED THIS*

.... END_MESSAGE_MAP()

void CMainFrame :: OnClose () {

PostQuitMessage(0);
//CFrameWndEx::OnClose(); << WE DO NOT WANT TO HAVE THIS CALLED!

}

...