ورود

View Full Version : سوال: جابجایی بین View ها



حسین محمدی
سه شنبه 11 فروردین 1388, 11:37 صبح
با سلام

من توسط متد زیر بین View های ساخته شده برای document جابجا می شوم. و در این جابجایی View ی قبلی از بین می رود و View جدید ساخته می شود.



BOOL CCreditsDoc::SwitchToView(CRuntimeClass* pNewViewClass)
{
CFrameWnd* pMainWnd = (CFrameWnd*)AfxGetMainWnd();

CView* pOldActiveView = pMainWnd->GetActiveView();
CSplitterWnd* pSplitter = (CSplitterWnd *)pOldActiveView->GetParent();

pOldActiveView = (CView*)pSplitter->GetPane(0, 1);

// If we're already displaying this kind of view, no need to go further.
if (pOldActiveView->IsKindOf(pNewViewClass))
return TRUE;

//CSplitterWnd* pSplitter = (CSplitterWnd *)pOldActiveView->GetParent();
int row, col;
ASSERT(pSplitter->IsChildPane(pOldActiveView, &row, &col));
CRect viewrect;
pOldActiveView->GetWindowRect(&viewrect);

// set flag so that document will not be deleted when view is destroyed
m_bAutoDelete = FALSE;

// Delete existing view
pOldActiveView->DestroyWindow();

// set flag back to default
m_bAutoDelete = TRUE;

// Create new view
CCreateContext context;
context.m_pNewViewClass = pNewViewClass;
context.m_pCurrentDoc = this;
context.m_pNewDocTemplate = NULL;
context.m_pLastView = NULL;
context.m_pCurrentFrame = NULL;
if (!pSplitter->CreateView(row, col, pNewViewClass, viewrect.Size(), &context))
return FALSE;

// Set active
CView* pNewView = (CView *)pSplitter->GetPane(row, col);
pSplitter->GetParentFrame()->SetActiveView(pNewView);
pSplitter->RecalcLayout();
pNewView->SendMessage(WM_PAINT);
return TRUE;
}


ولی در جایی که یک View خاص باید نمایش داده شود باید حتما یک متغیر عضو آن که از جنس int است مقدار دهی شود. یعنی هنگامیکه شی آن View ساخته میشود باید این مقدار به عنوان یک پارامتر به constructor آن پاس شود ولی من اصلا نمی دانم کجا این شی ساخته می شود تا این متغیر را مقدار دهی اولیه (initialize) کنم.

حسین محمدی
سه شنبه 11 فروردین 1388, 11:42 صبح
البته باید یادآوری کنم که پروژه من SDI و به همراه یک Splitter است که یک ردیف و دو ستون دارد و view ی مربوط به ستون دوم عوض خواهد شد.