MFC新建一个tab页视图

来源:互联网 发布:破解网络尖兵 编辑:程序博客网 时间:2024/05/19 19:58

项目记录

功能描述:工具条点击某按钮,新打开一个视图

第一步,头文件里定义一个文档模板指针

CMultiDocTemplate* m_p3DEditViewTemplate;   //3d视图编辑文档模板

第二步,构造函数里以防万一先清空这个指针

m_p3DEditViewTemplate=NULL;

第三步,初始化函数里初始化模板类

virtual BOOL InitInstance();//在重写的这个函数里
    m_p3DEditViewTemplate = new CMultiDocTemplate(        nIDR,        RUNTIME_CLASS(CFhwdsDoc),               RUNTIME_CLASS(CChildFrame),                 RUNTIME_CLASS(CFhwds3DEditView));

其中CFhwds3DEditView继承于CView、Window3DOSG、GraphViewer(后两个是我们自己造的一个用于该视图显示三维osg,一个用于关联树节点那一套联动)

第四步,在某按钮的点击事件中生成这个视图

void CFhwdsApp::OnOpen3dEditView(){    // TODO: 在此添加命令处理程序代码    //若当前活动视图不是该视图则,若已有该视图,则设置为活动视图    if(this->OnActivateView(RUNTIME_CLASS(CFhwds3DEditView)) == FALSE){        //若没有则新建一个        this->OnNewView(m_p3DEditViewTemplate);        CMDIChildWndEx* pActiveChild =(CMDIChildWndEx*) ((CMainFrame*)AfxGetMainWnd())->MDIGetActive();        CMFCTabCtrl *pTabCtrl = (CMFCTabCtrl *)pActiveChild->GetRelatedTabGroup();        pTabCtrl->SetTabLabel(pTabCtrl->GetTabsNum()-1,_T("三维编辑视图"));        //画模型        IReservoirModelGraph *pIRModelGraph = ((CFhwdsApp*)AfxGetApp())->m_pIRModelGraph;        if(!pIRModelGraph) return ;        pIRModelGraph->updateDraw3d(this);    }}bool CFhwdsApp::OnNewView(CMultiDocTemplate* pDocTemplate){    CMDIChildWnd* pActiveChild = ((CMainFrame*)AfxGetMainWnd())->MDIGetActive();    CDocument* pDocument;    if (pActiveChild == NULL ||        (pDocument = pActiveChild->GetActiveDocument()) == NULL)    {        TRACE0("Now New the specify view\n");        ASSERT(pDocTemplate != NULL);        ASSERT(pDocTemplate->IsKindOf(RUNTIME_CLASS(CDocTemplate)));        pDocTemplate->OpenDocumentFile(NULL);        return TRUE;    }    // otherwise we have a new frame to the same document!    CMultiDocTemplate* pTemplate = pDocTemplate;    ASSERT_VALID(pTemplate);    CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild);    if (pFrame == NULL)    {        TRACE0("Warning: failed to create new frame\n");        return FALSE; // command failed    }    pTemplate->InitialUpdateFrame(pFrame, pDocument);    return TRUE;}bool CFhwdsApp::OnActivateView(CRuntimeClass *pView){    CMDIChildWnd* pActiveChild = ((CMainFrame*)AfxGetMainWnd())->MDIGetActive();    CDocument* pDoc;    if (pActiveChild  && (pDoc = pActiveChild->GetActiveDocument()) )    {        POSITION viewPos = pDoc->GetFirstViewPosition();        while(viewPos)        {            CView *pCurView = pDoc->GetNextView(viewPos);            if(pCurView->IsKindOf(pView))            {                CFrameWnd *pFrame = pCurView->GetParentFrame();                if(pFrame)                {                    pFrame->ActivateFrame();                    return true;                }            }        }    }    return false;}

好吧上面这段大致明白干了啥没深究过
第五步,析构部分

int CFhwdsApp::ExitInstance();//写这个函数里
if (m_p3DEditViewTemplate) delete m_p3DEditViewTemplate;

下面是效果图:

打开了不同的视图

原创粉丝点击