今天要实现一个功能,如下图所示:
在1中点击Screen0,然后2中的视图如果视图Screen0存在,则激活Screen0窗口,如果不存在这新建一个Screen0窗口并显示。
实现代码:
第一步:判断树形控件所按下时的文件名
void CViewTree::OnClkTree(NMHDR* pNMHDR, LRESULT* pResult) { CPoint pt; GetCursorPos(&pt); ScreenToClient(&pt); UINT uFlag = 0; HTREEITEM hItem = HitTest(pt, &uFlag); if(hItem) { SelectItem(hItem); if(TVHT_ONITEMLABEL & uFlag) { CString szFileName; CString szFilePath; CString szNewFileName; BOOL bIsViewOpened = TRUE ; szFileName= GetItemText(hItem); int nIndex = szFileName.Find("."); szNewFileName = szFileName.Left(nIndex); CFileView * pView = (CFileView *)GetParent(); pView->FindFileNode(szFileName, szFilePath, bIsViewOpened); if (szFilePath != "" /*&& !bIsViewOpened*/) { if (bIsViewOpened) { FindDocment(szNewFileName); } else pView->OpenFileNode(szNewFileName, szFilePath); } } } *pResult = 0; }
CCFDesignView * CViewTree::FindDocment(CString szName) { CDocManager * pDocManager = AfxGetApp()->m_pDocManager; POSITION posDocManager = pDocManager->GetFirstDocTemplatePosition(); while(posDocManager != NULL) { CDocTemplate * pDocTemplate = (CDocTemplate *)pDocManager->GetNextDocTemplate(posDocManager); POSITION posDoc = pDocTemplate->GetFirstDocPosition(); while(posDoc != NULL) { CDocument * pDoc = pDocTemplate->GetNextDoc(posDoc); if (pDoc->GetTitle() == szName) { POSITION posView = pDoc->GetFirstViewPosition(); while (posView != NULL) { CView * pView = pDoc->GetNextView(posView); // CMainFrame * pMainFrame = (CMainFrame *)AfxGetMainWnd(); // pMainFrame->SetActiveView(pView); CChildFrame * pChildFrame = (CChildFrame *)pView->GetParentFrame(); pChildFrame->ActivateFrame(SW_SHOW); } } //pDoc->UpdateAllViews(NULL); } } // CWinApp *pApp = AfxGetApp(); // POSITION PosDocTemplate = pApp->GetFirstDocTemplatePosition(); // while(PosDocTemplate) // { // CDocTemplate* pDocTemplate = pApp->GetNextDocTemplate( PosDocTemplate ); // // POSITION PosDoc = pDocTemplate->GetFirstDocPosition(); // while(PosDoc) // { // CDocument* pDoc = pDocTemplate->GetNextDoc( PosDoc ); // // if (pDoc->GetTitle() == szName) // { // POSITION PosView = pDoc->GetFirstViewPosition(); // while(PosView) // { // CCFDesignView* pView = (CCFDesignView *)pDoc->GetNextView( PosView ); // //CMainFrame * pMainFrame = (CMainFrame *)AfxGetMainWnd(); // //pMainFrame->SetActiveView(pView, TRUE); // //CMainFrame* pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; // //pFrame->SetActiveView(pView); // // CFrameWnd* pParentFrame=(CFrameWnd*)pView->GetParent(); // // pParentFrame->SetActiveView(pView); // // CChildFrame * pChildFrame = (CChildFrame *)pView->GetParentFrame(); // // pChildFrame->ActivateFrame(SW_SHOW); // return NULL; // } // } // // } //} return NULL; }上述代码中屏蔽部分与为屏蔽部分都实现了激活视窗功能。
第三步:如果不存在,则新建一个视图,并初始化该视图。这里不贴出具体代码了。实现步骤与新建视图的步骤是一样的的,只不过添加了初始化的工作。
最后感谢一位朋友帮了我的大忙,没有他的话这个功能还得晚几天才能出来!@辅_, ,感谢你!