我几周来一直在努力解决问题。我有一个MDI应用程序,探索风格。在右侧,我有一个CTabView,它有5个CListViews和一个CFormView。根据我在leftview(CTreeView)中的选择,我应该从CTabView中删除(或添加)FormView。
可以通过拖放重新排列CTabView(您可以将CTestFormView作为第一个选项卡拖动),并按顺序存储它们。
以下是有一个模拟问题的示例项目的链接:
在左视图中,我有:
一旦我选择"没有test-form-view" item,使用CTabView :: RemoveView从CTabView中删除CTestFormView。
要重现这一点,您可以执行以下简单步骤:
" 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视图导致了这个问题吗?
答案 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);