Stuck with Tabbed View dynamic creation
Hello,
I am currently developping an application which requires dynamic view
creation in a single document interface application (SDI).
Each view is of the same type.I have based my code on a tutorial found
on CodeGuru/CodeProject.
Here is the code which creates a new "watch view":
void CMainFrame::OnWatchesNew()
{
int lViewIndex = (int)mViewsVector.size();
CRuntimeClass* lViewRuntimeClass = RUNTIME_CLASS(CProcessMemoryView);
CCreateContext context;
context.m_pCurrentDoc = GetActiveDocument();
context.m_pCurrentFrame = this;
context.m_pLastView = GetActiveView();
context.m_pNewViewClass = lViewRuntimeClass;
context.m_pNewDocTemplate = GetActiveDocument()->GetDocTemplate();
TCITEM lItem={0};
if(mTabCtrl.InsertItem(lViewIndex,&lItem)==-1)
return;
CView*
pView=DYNAMIC_DOWNCAST(CView,CreateView(&context,AFX_IDW_PANE_FIRST
+lViewIndex+1));
if(NULL==pView)
{
return;
}
mViewsVector.push_back(pView);
CProcessMemoryDoc* lDocument =
static_cast<CProcessMemoryDoc*>(GetActiveDocument());
std::basic_string<TCHAR> lWatchName = lDocument-
GetAvailableWatchName();
lItem.mask = TCIF_TEXT;
lItem.pszText = (LPWSTR)lWatchName.c_str();
mTabCtrl.SetItem(lViewIndex,&lItem);
lDocument->AddWatch(lWatchName);
int nCurSel=mTabCtrl.GetCurSel();
if(nCurSel!=-1)
{
mViewsVector[nCurSel]->ShowWindow(SW_HIDE);
}
mTabCtrl.SetCurSel(lViewIndex);
pView->ShowWindow(SW_SHOW);
pView->OnInitialUpdate();
pView->SetActiveWindow();
RecalcLayout();
SetActiveView(pView);
RepositionWindows();
}
with:
void
CMainFrame::RepositionWindows()
{
if(NULL==mTabCtrl.m_hWnd)
return;
CView* p = GetActiveView();
if(NULL==p)
return;
if(NULL==p->m_hWnd)
return;
CRect r;
mTabCtrl.GetClientRect(r);
mTabCtrl.AdjustRect(FALSE,r);
mTabCtrl.ClientToScreen(r);
ScreenToClient(r);
p->MoveWindow(r,TRUE);
}
The problem is that the new view is not refreshed correctly (rows does
not appear,....),I have tried nearly everything,with no success...
If I defines views in the OnCreateClient functions,it works well :
BOOL
CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext*
pContext)
{
CRuntimeClass* lViewRuntimeClass = RUNTIME_CLASS(CProcessMemoryView);
mTabFont.CreateFont(12, 0, 0, 0, FW_NORMAL, FALSE, FALSE,
0,ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH, _T("Arial"));
// Create tab control
if(!mTabCtrl.Create(WS_CHILD|WS_VISIBLE|
TCS_BOTTOM,CRect(0,0,0,0),this,AFX_IDW_PANE_FIRST))
return FALSE;
mTabCtrl.SetFont(&mTabFont,TRUE);
TCITEM lItem={0};
if(mTabCtrl.InsertItem(0,&lItem)==-1)
return FALSE;
pContext->m_pNewViewClass=lViewRuntimeClass;
CWnd* pView=CreateView(pContext,AFX_IDW_PANE_FIRST+1);
if(NULL==pView)
{
TRACE("CMainFrame::OnCreateClient -E- can not create view\r");
return FALSE;
}
mViewsVector.push_back(DYNAMIC_DOWNCAST(CView,pView));
SetActiveView(DYNAMIC_DOWNCAST(CView,pView));
CProcessMemoryDoc* lDocument =
static_cast<CProcessMemoryDoc*>(GetActiveDocument());
std::basic_string<TCHAR> lWatchName = lDocument-
GetAvailableWatchName();
lItem.mask = TCIF_TEXT;
lItem.pszText = (LPWSTR)lWatchName.c_str();
mTabCtrl.SetItem(0,&lItem);
lDocument->AddWatch(lWatchName);
return true;
}
Any idea?
Thank you in advance.
Nassim.