2016-09-08 4 views
0

문서가 여러보기를 가질 수 있고 사용자가 사용자 지정하고보기의 레이아웃 데이터를 저장할 수있는 MFC MDI 응용 프로그램이 있습니다. 이 데이터는 문서가 아닌보기와 관련이 있습니다.MFC보기를 닫을 때 변경 사항을 저장할 것인지 묻는 메시지

사용자가 저장하지 않은 레이아웃 변경으로보기를 닫고 문제가 발생하면 저장하라는 메시지를 표시하고 싶습니다. MFC는 문서의 변경 사항에만 맞춰져있는 것처럼 보입니다.

  1. 무시 CDocument :: SaveModified 기능, 문서를 닫을 때 프레임 워크에 의해 호출됩니다 : 여기에 내가 시도한 몇 가지 방법이 있습니다. 이 함수에서 모든 문서의보기로 메시지를 보내면 저장되지 않은 변경 사항을 확인하고 사용자에게 알릴 수 있습니다.

  2. 보기의 소멸자를 검사하십시오.

  3. 는 이러한 방식의

각에 문제가보기의으로 onClose 처리기 내부의 검사를 수행합니다. (1)이 최상이지만 한 문서에 여러 개의보기가 있고 사용자가보기 중 하나를 닫는 경우를 처리하지 못합니다. 문서가 아직 열려 있으므로 SaveModified는 호출되지 않습니다.

(2)의 문제점은 응용 프로그램 종료시 CView 소멸자가 호출 될 때까지 이미 응용 프로그램이 사라졌습니다. 그러면 바탕 화면에 고아 대화 상자가 열리게됩니다. OnDestroy 내부 검사를 수행하는 경우에도 마찬가지입니다.

(3)을 작동시킬 수 없습니다. WM_CLOSE에 응답하는 데 내 견해를 얻을 수 없습니다.

현재 가장 좋은 해결책은 (1)과 (2)를 모두 수행하는 것입니다. 그러나 앱 종료시 사용자가보기 변경 사항을 두 번 저장하라는 메시지를 앱에 표시하지 못하게하려면 약간의 논리가 필요합니다.

누구든지이 작업을 수행하는 더 좋은 방법을 알고 있습니까? 후크 할 정확한 장소는 어디입니까?

+0

아마 나쁜 데이터 정의 및/또는 모델링. 뷰는 적어도 문서 파일에 저장할 수있는 데이터는 보유하지 않습니다. 이러한 데이터를 가지고 있다면 CDocument 클래스에 넣으십시오. 뷰는 문서 데이터를 수정할 수 있습니다 (GetDocument()). 보기에 포함될 수있는 유일한 "데이터"는 표시 옵션 일 수 있습니다. 레지스트리에 저장하고 다시로드 할 때 다시로드 할 수 있습니다 (다소 "사용자 설정 기억"). 그리고 SaveModified() 함수는 거의 재정의 될 필요가 없습니다 (기본값은 괜찮습니다). 기본적으로 GetDocument() -> SetModifiedFlag()를 호출하면됩니다. –

+2

"닫는보기 창"에서 뭔가를하려면 응용 프로그램을 MDI, 어쩌면 OnClose() (또는 무엇) MDI chlid 프레임 (일반적으로보기의 부모 창) 처리기 잡기 시도하십시오 언급하려면 깜빡, 대신에? –

+0

저장하려는 데이터는 보려는 데이터가 아닌보기 레이아웃과 관련이 있습니다. 이 데이터를 문서에 넣는 것은 완전히 잘못된 것입니다. 동일한 문서에는 여러 가지보기가 있으며 각보기마다 설정이 다릅니다. –

답변

0

해결 방법은 확실하지 않지만 상태에 따라 닫을 수없는 여러 가지보기가 있으며 DestroyWindow()에서 처리합니다. 그리고 메시지 상자가 닫히기 전에 앱 위로 올라옵니다. 따라서 소멸자가 아닌 DestroyWindow()을 사용해보십시오.