removeview后CTabView同步

时间:2017-04-14 11:33:02

标签: c++ visual-studio visual-c++ mfc

我几周来一直在努力解决问题。我有一个MDI应用程序,探索风格。在右侧,我有一个CTabView,它有5个CListViews和一个CFormView。根据我在leftview(CTreeView)中的选择,我应该从CTabView中删除(或添加)FormView。

可以通过拖放重新排列CTabView(您可以将CTestFormView作为第一个选项卡拖动),并按顺序存储它们。

以下是有一个模拟问题的示例项目的链接:

Explore sample project

在左视图中,我有:

enter image description here

一旦我选择"没有test-form-view" item,使用CTabView :: RemoveView从CTabView中删除CTestFormView。

要重现这一点,您可以执行以下简单步骤:

  1. 转到"使用test-form-view"
  2. 将CTestFormView拖动为第一个标签 enter image description here
  3. 选择,让我们说,CExploreListView4
  4. enter image description here

    1. 选择"没有test-form-view"左视图中的项目 enter image description here
    2. " CTestFormView"已从CTabView中消失,并选择了第一个选项卡。右键单击此CExploreListView1,您将看到CExploreListView 4 的上下文菜单,而不是CExploreListView 1 的上下文菜单。

      如果您从leftview(" With-test-form-view")中选择另一个树项目(添加CTestFormView),则CTabView中的所有列表视图都不会正确重绘。 CTabView中有错误吗?

      使用以下代码,我将删除CTabView中的视图:

      RemoveView(nTabIndex);
      

      这是我用来动态地向CTabView添加视图的代码:

      int CExploreTabbedView::AddView(CRuntimeClass* pViewClass, const CString& strViewLabel, int iIndex /*= -1*/, CCreateContext* pContext/* = NULL*/, BOOL bAfterCreation/* = FALSE*/)
      {
      ASSERT_VALID(this);
      ENSURE(pViewClass != NULL);
      ENSURE(pViewClass->IsDerivedFrom(RUNTIME_CLASS(CView)));
      
      CView* pView = DYNAMIC_DOWNCAST(CView, pViewClass->CreateObject());
      ASSERT_VALID(pView);
      
      if(! pView->Create(NULL, _T(""), WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0), &m_wndTabs, (UINT)-1, pContext))
      {
          TRACE1(_T("CTabView:Failed to create view '%s'\n"), pViewClass->m_lpszClassName);
          return -1;
      }
      
      CDocument* pDoc = GetDocument();
      if (pDoc != NULL)
      {
          ASSERT_VALID(pDoc);
      
          BOOL bFound = FALSE;
          for (POSITION pos = pDoc->GetFirstViewPosition();! bFound && pos != NULL;)
          {
              if(pDoc->GetNextView(pos) == pView)
                  bFound = TRUE;
          }
          if(! bFound)
              pDoc->AddView(pView);
      }
      
      pView->SetParent(this);
      
      if(bAfterCreation)
          pView->SendMessage(WM_INITIALUPDATE, 0, 0);
      
      m_wndTabs.InsertTab(pView, strViewLabel, iIndex);
      
      int nTabs = m_wndTabs.GetTabsNum();
      return nTabs - 1;
      }
      

      你能帮我弄清楚为什么删除/添加CTabView视图导致了这个问题吗?

1 个答案:

答案 0 :(得分:0)

您必须指定添加视图的上下文并在其中设置文档。 像:

    CCreateContext newContext;
    newContext.m_pNewViewClass = NULL;
    newContext.m_pNewDocTemplate = NULL;
    newContext.m_pLastView = NULL;
    newContext.m_pCurrentFrame = NULL;
    newContext.m_pCurrentDoc =  GetDocument();
    CTabView *pTab = GetLayoutViewsTab();
    int index=pTab->AddView(RUNTIME_CLASS(YourClass), tabName,-1,&newContext);