void CStarDirClApp::OnDirNew() 
{
// TODO: Add your command handler code here
CDocument *pDoc = NULL;
POSITION pos1, pos2; 
CView *pView = NULL;
CWnd *pWnd = NULL; if (m_pDirectoryTemplate)//判断是否正确设置了Frame,Doc,View之间的关系
{
pos1 = m_pDirectoryTemplate->GetFirstDocPosition();
if (pos1 != NULL)//-----------------------------------------(1)
{
pDoc = m_pDirectoryTemplate->GetNextDoc(pos1);-----(2)
if (pDoc)
{
pos2 = pDoc->GetFirstViewPosition();-------(3)
while (pos2 != NULL)
{
pView = pDoc->GetNextView(pos2);
}  

if (pView)-----------------------------------(4)
{
pWnd = pView->GetParent();
pWnd = pWnd->GetParent();
ASSERT_KINDOF(CDirectoryFrame, pWnd);
pWnd->BringWindowToTop();
AfxGetMainWnd()->SendMessage(WM_COMMAND,(WPARAM)ID_DIR_BAR);
}
}
}
else
{
pDoc = m_pDirectoryTemplate->OpenDocumentFile(NULL);
if (pDoc)
{
CString sTitle;
sTitle.LoadString(IDS_DIRTREE);
pDoc->SetTitle(sTitle);
}

AfxGetMainWnd()->SendMessage(WM_COMMAND,(WPARAM)ID_DIR_BAR);
}
}
}
请详细解释一下作这么多判断是为什么?那几个相应的函数就是干这个用的?

解决方案 »

  1.   

    POSITION 到底是一个什么样的结构体?我在MSDN2004都查不到,它不是这几个函数返回值的类型吗?是不是在内存中有两个List,一个View List,一个Document List,那几个函数就是从List中得来的?    还有就是为什么就取第一个Doc和第一个View的指针,而不是第二个或者第三个?
      

  2.   

    加入这句pDoc = m_pDirectoryTemplate->GetNextDoc(pos1);
    改为两个 pDoc = m_pDirectoryTemplate->GetNextDoc(pos1);
             pDoc = m_pDirectoryTemplate->GetNextDoc(pos1);
    结果会怎么样?
      

  3.   

    pDoc = m_pDirectoryTemplate->GetNextDoc(pos1);
             pDoc = m_pDirectoryTemplate->GetNextDoc(pos1);
    如果这样连续调用两遍的话,两次返回的pDoc是不同的。你看看GetNextDoc函数,pos1这个变量是一直在改变的。调用一次后,返回当前的pDoc,同时pos1将指向下一个文档对象了
      

  4.   

    我这用VC Watch 察看,当地一个调用没有问题,但是当第二句的时候,就会down掉了,可见m_pDirectoryTemplate所指向的List没有第二个DOC,是不是?还有POSITION结构还没有给我解释,POSITION 到底是一个什么样的结构体?