Закрепляемые панели, созданные в CChildFrame, не отображаются во второй раз, когда приложение. начинается

Я создал несколько закрепляемых панелей в CChildFrame::OnCreate(). При первом запуске приложения они отображаются. Во второй раз, когда я запускаю приложение, они создаются, но разделительные окна полностью расположены по бокам клиентской области (внизу и справа), поэтому их не видно. Поэтому я должен использовать мышь, чтобы вытащить разделители в клиентскую область, чтобы закрепляемые окна снова стали видимыми. Если я выполню File->New в своем приложении, будет создано новое клиентское окно и показаны закрепляемые окна, какими они должны быть. Я думаю, что это как-то связано с сохранением макета окна в реестре, потому что если я изменю SetRegistryKey(_T("61sakjgsajkdg")); в производном классе CWinApp моего приложения. и при повторном запуске они снова отображаются с первого раза. (но не во второй раз, когда я перезапускаю приложение). Как я могу сохранить макет этих закрепляемых окон, поэтому, если я перезапущу свое приложение. они видны? Или еще, как я могу предотвратить мое приложение. перезаписи макета окна ранее сохраненным. Что-то связанное с LoadCustomState() и SaveCustomState()? Я не смог найти никакой информации о том, как реализовать эти методы. У меня есть ссылка на демонстрационный проект, чтобы продемонстрировать, что я имею в виду:

http://www.4shared.com/file/237193472/c384f0f6/GUI60.html

Может ли кто-нибудь сказать мне, как показать эти закрепляемые окна в моем классе CChildFrame при втором запуске приложения?


person Nijenhuis    schedule 09.03.2010    source источник


Ответы (3)


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

Судя по звуку, я думаю, вам, вероятно, нужно вызвать CWinAppEx::SetRegistryBase( ) в вашем InitInstance() после вызова SetRegistryKey(). MSDN описывает это (без подробностей почему) здесь на шаге 4.

person adam    schedule 09.03.2010
comment
я попробовал и добавил SetRegistryBase(_T(Settings)); после SetRegistryKey(), как описано в документации MSDN. Все еще никаких изменений. Вы пробовали это, используя ссылку на мой демонстрационный проект? - person Nijenhuis; 09.03.2010
comment
Вау, теперь я кое-что изменил, я вызываю SetRegistryBase() после создания CChildFrame (звучит логично), прямо в конце InitInstance(), и теперь это работает! Здорово ! большое спасибо Адам. - person Nijenhuis; 09.03.2010
comment
Единственная проблема теперь, если вы измените расположение окон с помощью мыши и закроете приложение. и перезапустить, они окна не восстанавливаются в прежнее положение. - person Nijenhuis; 09.03.2010

Я думаю, что вызов SaveState() следует поместить в метод CMainFrame::DestroyWindow(), чтобы дочерние окна основного фрейма еще не уничтожались при вызове SaveState().
Я пытался использовать SaveState() в методе CMainFrame::DestroyWindow(). деструктор CMainFrame, некоторые утверждения не пройдут, потому что дочерние панели уже уничтожены.

person imafish    schedule 18.11.2010

Я немного изменил его в InitInstance на:

. . . если (!ProcessShellCommand(cmdInfo)) вернуть ЛОЖЬ;

LoadState((CMainFrame*)AfxGetMainWnd(),_T("Settings4"));

// The main window has been initialized, so show and update it
pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->UpdateWindow();

. .

И в:

CMainFrame::~CMainFrame() { theApp.SaveState((CMainFrame*)AfxGetMainWnd(),_T("Settings4")); }

Я не знаю, если это способ сделать это, но это работает на данный момент. Любые комментарии по этому поводу более чем приветствуются.

person Nijenhuis    schedule 09.03.2010
comment
конечно: CMainFrame::~CMainFrame() { theApp.SaveState((CMainFrame*)AfxGetMainWnd(),_T(Settings4)); } должно быть: CMainFrame::~CMainFrame() { theApp.SaveState(this,_T(Settings4)); } - person Nijenhuis; 09.03.2010