2010-03-09 2 views
1

CChildFrame :: OnCreate()에서 도킹 가능한 창을 만들었습니다. 처음 응용 프로그램을 시작할 때 표시됩니다. 두 번째로 응용 프로그램을 만들었지 만, splitterwindows는 클라이언트 영역 (아래쪽 및 오른쪽)의 측면에 대해 완전하게 보이므로 보이지 않습니다. 따라서 마우스를 사용하여 분할기를 클라이언트 영역으로 가져 와서 도킹 가능한 창을 다시 볼 수있게해야합니다. 내 앱에서 파일 -> 새로 만들기를 선택하면 새 클라이언트 창이 만들어 져서 도킹 할 수있는 창을 표시합니다. 나는 이것이 SetRegistryKey (_T ("61sakjgsajkdg"))를 변경하면 레지스트리에 윈도우 레이아웃을 저장하는 것과 관련이 있다고 생각한다. 내 응용 프로그램의 CWinApp 파생 클래스에서. 다시 실행하면 처음으로 다시 표시됩니다. (하지만 두 번째로는 앱을 다시 시작하지 않습니다). 도킹 가능한 창 레이아웃을 어떻게 저장할 수 있습니까? 앱을 다시 시작하면 어떻게됩니까? 그들은 볼 수 있습니까? 그렇지 않으면 내 앱을 어떻게 막을 수 있습니까? 창 레이아웃을 이전에 저장 한 창으로 덮어 씁니다. LoadCustomState() 및 SaveCustomState()?와 관련하여, 이러한 메서드를 구현하는 howto에 대한 정보를 찾을 수 없습니다. 여기 내가 무엇을 의미하는지 설명 할 수있는 데모 프로젝트에 대한 링크가 있습니다CChildFrame에서 만든 도킹 가능한 창은 앱을 두 번 볼 수 없습니다. 시작합니다.

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

사람이 어떻게 내 CChildFrame 클래스에서와 도킹 창 두 번째 응용 프로그램의 시작을 보여 말해 주시겠습니까?

답변

1

MFC 기능 팩의 새로운 클래스는 모두 창 상태가 레지스트리에 저장됩니다.

에 전화 한 후 InitInstance()CWinAppEx::SetRegistryBase()으로 전화해야한다고 생각합니다. MSDN에서는 # 4에서 이유에 대한 설명이 거의없고here을 설명합니다.

+0

나는 시도하고 추가했다 \t SetRegistryBase (_T ("Settings")); SetRegistryKey() 다음에 MSDN 설명서에서 설명합니다. 아직도 변화 없음. 데모 프로젝트 링크를 사용해 보셨습니까? – Nijenhuis

+0

와우, 지금 뭔가 바뀌었고, CChildFrame 생성 (논리적으로 들립니다) 후에 SetRegistryBase()를 호출했습니다. InitInstance()의 끝에서 바로 작동합니다. 이제 작동합니다! 좋아! 많은 고마움 아담. – Nijenhuis

+0

유일한 문제는 마우스로 창의 레이아웃을 변경하고 응용 프로그램을 종료 한 경우입니다. 재시작하면 윈도우가 이전 위치로 복원되지 않습니다. – Nijenhuis

0

InitInstance에서 약간 변경 :

. . . if (! ProcessShellCommand (cmdInfo)) FALSE가 반환됩니다.

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")); }

이것이 방법 일지는 모르겠지만 지금은 잘 알고 있습니다. 이것에 대한 의견은 환영합니다.

+0

물론 : CMainFrame :: ~ CMainFrame (theApp.SaveState (CMainFrame *) AfxGetMainWnd(), _T ("Settings4")); } 은 다음과 같아야합니다. CMainFrame :: ~ CMainFrame() {theApp.SaveState (this, _T ("Settings4")); } – Nijenhuis

1

SaveState() 호출은 CMainFrame :: DestroyWindow() 메서드에 넣어야하므로 SaveState()가 호출 될 때 주 프레임의 자식 창이 아직 소멸되지 않습니다.
CMainFrame의 소멸자에서 SaveState()를 사용하려고 시도했지만 자식 창이 이미 소멸되어 일부 어설 션이 전달되지 않습니다.