Manually Creating View Windows
Scott Daniels -- scottdfl@sprynet.com Thursday, October 17, 1996 Environment: Win95, Visual C++ 4.1 Hi, The app I am writing is a MDI app with one project window (similar to Developer Studio). The problem is I want to create additional views to display portions of the project document. The examples I have looked at thus far show creating multiple views of the same document. What I need is similar, but the metaphor is totally different. What is the best way to accomplish this task? Thanks very much in advance for the help, Scott Scott Daniels scottdfl@sprynet.com "Life appears the way you choose to see it."
Simon Salter -- Simon@chersoft.co.uk Saturday, October 19, 1996 [Mini-digest: 3 responses] I like to consider a view as 'a way of looking at something'. So in this sense what you want is several ways of looking at the same 'thing'. In MFC parlance that is several different views of the same document. One type would show a particular portion of the document in a particular way and so on. In other words you do want multiple views of a document, but different types of view. There has been a fair bit of discussion here lately about ways to achieve this. One fairly straightforward way is to create several document templates attaching the different types of view to the same document type and then use the templates to create additional views as needed. In your CMainFrame you might have a method like this (which is loosely based on the TANGRAM sample): void CMyFrame::CreateOrActivateFrame(CRuntimeClass *pViewClass) { CMDIChildWnd* pMDIActive = MDIGetActive(); CDocument *pDoc = pMDIActive->GetActiveDocument(); // First we try to activate an existing view CView *pView = NULL; BOOL bActivatedView = FALSE; POSITION pos = pDoc->GetFirstViewPosition(); while(!bActivatedView && pos != NULL) { pView = pDoc->GetNextView(pos); if(pView->IsKindOf(pViewClass)) // Found one { TRACE0("Activating existing frame"); pView->GetParentFrame()->ActivateFrame(); bActivatedView = TRUE; } } if(!bActivatedView) // Got to create a new one { CDocTemplate *pTemplate = GetDocTemplate(pViewClass); if(pTemplate != NULL) { CMDIChildWnd *pNewFrame = (CMDIChildWnd *)(pTemplate->CreateNewFrame(pDoc,NULL)); if(pNewFrame != NULL) { ASSERT(pNewFrame->IsKindOf(RUNTIME_CLASS(CMDIChildWnd))); pTemplate->InitialUpdateFrame(pNewFrame,pDoc); } else TRACE0("Failed to create new frame"); } } } Where GetDocTemplate(pViewClass) is implemented in your CWinApp derived class. What it does it to go through the list of templates set up on InitApplication() and return the appropriate one for that view. Note that the new view is attached to the active document so you get a different type of view of the document. Ta da! Simon ---------- From: Scott Daniels[SMTP:scottdfl@sprynet.com] Sent: 18 October 1996 04:30 To: MFC Mailing List Subject: Manually Creating View Windows Environment: Win95, Visual C++ 4.1 Hi, The app I am writing is a MDI app with one project window (similar to Developer Studio). The problem is I want to create additional views to display portions of the project document. The examples I have looked at thus far show creating multiple views of the same document. What I need is similar, but the metaphor is totally different. What is the best way to accomplish this task? Thanks very much in advance for the help, Scott Scott Daniels scottdfl@sprynet.com "Life appears the way you choose to see it." -----From: "Shrikanth Swaminathan"Hi !!, I am starting on a similar application, and will keep tell u as things develop. However, the following article in MSDN u should find interesting... The Human Factor: It's Windows 95: Do You Know Where Your Child Windows Are? Books and Periodicals->MS Dev Net News->Nov1994, No 6->Standard Cols. ------------------------------------------------------------------- S.Shrikanth sshri@csi-gmbh.de Ph (o) +49-231-55707214 (h) +49-231-7270030 ------------------------------------------------------------------- We are what we repeatedly do, Excellence, then is not an act, but a habit Aristotel ------------------------------------------------------------------- -----From: Tomas Gudmundsson Do this in your Doc class : CMultiDocTemplate* pDocTemplate = new CMultiDocTemplate( IDR_XXXTYPE, RUNTIME_CLASS(CXXXDoc), RUNTIME_CLASS(CXXXFrame), RUNTIME_CLASS(CXXXView)); CFrameWnd *pFrame = pDocTemplate->CreateNewFrame(this,NULL); pDocTemplate->InitialUpdateFrame(pFrame,this,TRUE); It would be better to create the DocTemplate once and for all somewhere else.
Niels Ull Jacobsen -- nuj@kruger.dk Tuesday, October 22, 1996 >>> "Scott Daniels"18-10-96 04.29 >>> Environment: Win95, Visual C++ 4.1 Hi, >The app I am writing is a MDI app with one project window (similar to >Developer Studio). The problem is I want to create additional views to >display portions of the project document. The examples I have looked at >thus far show creating multiple views of the same document. What I need >is >similar, but the metaphor is totally different. What is the best way to >accomplish this task? I don't see how this is "totally different". You basically just want to enforce that the user only has one document open. This can be done by overriding CWinApp::OnFileNew and CWinApp::OnFileOpen, forcing them to close the previous document before opening the next. You can create the views yourself using the method shown in the ChkBook sample. If you need different types of view, use multiple document templates - otherwise just use one. >Thanks very much in advance for the help, >Scott Scott Daniels scottdfl@sprynet.com "Life appears the way you choose to see it."
| Вернуться в корень Архива |