Finding open window
Jackie Braun -- jbraun@eagle.wbm.ca Thursday, April 11, 1996 Hi. I am using VC 1.51, Win 3.1. I am developing an application which has several CMultiDocTemplates. Each document/view pair is to be created via a menu command. So, the first time the menu command is activated, the appropriate document/view/frame is created. If the same menu command is subsequently activated, I would like to bring the window containing the appropriate document/view to the front, and not create a new window. This sounds as though it should be simple enough to implement, but I am having trouble determining how to find appropriate window. I have looked at FindWindow(), but it searches only top-level windows. I would appreciate any suggestions. Thanks, Jackie Braun. ----------------------------------------------------------------- Jackie Braun, Ph.D. | Randco Software Corporation Consultant | 2530 Hanover Avenue jbraun@eagle.wbm.ca | Saskatoon SK Phone (306)343-3380 | Canada S7J 1G1 Fax (306)343-3341 -----------------------------------------------------------------
Darius Thabit -- darius@world.std.com Sunday, April 14, 1996 [Mini-digest: 5 responses] > I am developing an application which has several CMultiDocTemplates. Each > document/view pair is to be created via a menu command. So, the first tim > the menu command is activated, the appropriate document/view/frame is crea > If the same menu command is subsequently activated, I would like to bring > the window containing the appropriate document/view to the front, and not > create a new window. This sounds as though it should be simple enough to You can create a "new" view for a my doc template by calling CMultiDocTemplate::OpenDocumentFile(NULL). You can "open" an existing file associated with a template by passing a path to this routine, but if you use the CWinApp version of the call it searches the template list to see whether the file is already in an open window (this logic starts in appdlg.cpp). It sounds like you are saying that you will only have one window of each template type. If that's true, and if you never "save" these things, you could make up a dummy file name for each, and call CDocument::SetPathName() whenever you create a new window; then call CWinApp::OpenDocumentFile with the special name to activate that window later. Otherwise, you can steal the logic to search the template list (as I have done for some things). -----From: erik.heuer@ks-t.no (Erik Heuer) Look at EnumChildWindows. It allows you to search all children of a particular top level window. Erik Heuer, Kongsberg Simulation & Training, 3600 Kongsberg, Norway E-mail: erik.heuer@ks-t.no Phone:(+47) 32735766 Fax:(+47) 32736965 -----From: "Martin J. Mahoney"Try this it should satisfy your needs. In your CWinApp derived class add a CMapWordtoOb such as class CMyWinApp : public CWinApp { ... CMapWordToOb m_DocumentViewMap; ... }; and in your CWinApp derived class a a function like the following. long CMyWinApp::OnOpenDocumentView(WORD requestedTemplate) { CMDIChildWnd *myMDIFrame; m_DocumentViewMap.Lookup(requestedTemplate, (CObject *&)myMDIFrame); if (myMDIFrame == NULL) { //Document View never created so create new view and add to map myMDIFrame = CreateRequestedTemplate(requestedTemplate); m_DocumentViewMap.SetAt(requestedTemplate, myMDIFrame); } else { //Document view already exists just bring view to top and set focus myMDIFrame->ActivateDrame(); } return 0; } Martin J. Mahoney -----From: Niels Ull Jacobsen Here's a piece of code from my program, which opens a new (or and old) view on a document. It might be of use to you. I derived from CMultiDocTemplate to provide this functionality. CMDIChildWnd *CMyMultiDocTemplate::CreateView( CDocument* pDoc, BOOL bOrActivateLastViewOfClass /* = FALSE */) // Creates a new view on the document or activates an existing view of // a document // Returns a pointer to the frame window of the view { CMDIChildWnd *pFrame; ASSERT_VALID(this); ASSERT_VALID(pDoc); ASSERT(pDoc->IsKindOf(GetDocClass())); if (bOrActivateLastViewOfClass) { CView* pView; POSITION pos = pDoc->GetFirstViewPosition(); while (pos) { pView = pDoc->GetNextView(pos); if (pView->IsKindOf(m_pViewClass)) { pFrame = CAST(CMDIChildWnd, pView->GetParentFrame()); ASSERT_VALID(pFrame); pFrame->ActivateFrame(); return pFrame; } } } pFrame = CAST(CMDIChildWnd, CreateNewFrame(pDoc, NULL)); ASSERT_VALID(pFrame); if (pFrame != NULL) // Just for safe { ASSERT(pFrame->IsKindOf(m_pFrameClass)); InitialUpdateFrame(pFrame,pDoc,TRUE); }; return pFrame; }; Niels Ull Jacobsen, Krьger A/S (nuj@kruger.dk) Everything stated herein is THE OFFICIAL POLICY of the entire Kruger group and should be taken as legally binding in every respect. Pigs will grow wings and fly. -----From: JLR@ARTECH.COM.UY (Jose Lamas RЎos) There's a public member of CWinApp named m_templateList that you can use for this. Example: CDocument* CYourApp::IsDocOpen(parameters that identify the doc you're looking for) { POSITION posTpl = m_templateList.GetHeadPosition(); while (posTpl) { CDocTemplate* pTemplate = (CDocTemplate*) m_templateList.GetNext(posTpl); ASSERT_VALID(pTemplate); ASSERT(pTemplate->IsKindOf(RUNTIME_CLASS(CDocTemplate))); POSITION posDoc = pTemplate->GetFirstDocPosition(); while (posDoc) { CDocument* pDoc = pTemplate->GetNextDoc(posDoc); if (pDoc is what you are looking for) return pDoc; } } return NULL; } The above example allows you to iterate through all the documents currently opened for each of the templates you have added to the app (using AddDocTemplate). I don't know how you want to determine which of them is what you are looking for, but I guess you do. If you find the document and want to bring it to the front you can do it using the following: { POSITION posView = pDoc->GetFirstViewPosition(); while (posView) { CView* pView = pDocument->GetNextView(viewpos); if (pView is the one you want to activate) { pView->GetParentFrame()->ActivateFrame(); return; } } } Hope this helps
David W. Gillett -- DGILLETT@expertedge.com Tuesday, April 16, 1996 > I am using VC 1.51, Win 3.1. > > I am developing an application which has several > CMultiDocTemplates. Each document/view pair is to be created via a > menu command. So, the first time the menu command is activated, the > appropriate document/view/frame is created. If the same menu > command is subsequently activated, I would like to bring the window > containing the appropriate document/view to the front, and not > create a new window. This sounds as though it should be simple > enough to implement, but I am having trouble determining how to > find appropriate window. I have looked at FindWindow(), but it > searches only top-level windows. > > I would appreciate any suggestions. If you have a separate menu command for each doc/view pair, then you can't have a huge number of them, right? So what I would do is provide each with a CWnd* (or derivative...), initialized to NULL. In the handler for each menu command, you check the corresponding pointer -- if it's NULL, you create the doc/view and save the view pointer; if it's not NULL, you activate that view. [You could get slick and use something like an array or list that matches menu commands to doc/view templates and view pointers, and so let these menu entries share a single handler....] Dave
| Вернуться в корень Архива |