如何在Outlook Style MFC程序上获取派生CMFCShellTreeCtl的CDocument?

时间:2019-01-07 18:59:25

标签: mfc

我是MFC的新手,并已使用向导构建了一个“外观”样式的MFC应用程序。我已经使用CMFCShellTreetCtrl扩展了CMyShellTreeCtrl并具有数据成员变量,并且一切正常。现在,我想将数据移到CDocument类中。由于在单击或枚举每个项目时可以对数据进行多次访问,因此我认为我将创建一个成员变量m_pDoc来访问CDocument中的公共变量。我遇到的问题是,我找不到从何处获取CDocument的问题,因为调用树OnCreate时似乎没有建立。在OnCreate

CWnd* pWndMain = AfxGetMainWnd();
ASSERT(pWndMain);
ASSERT(pWndMain->IsKindOf(RUNTIME_CLASS(CFrameWnd)) &&  !pWndMain->IsKindOf(RUNTIME_CLASS(CMDIFrameWnd))); // Not an SDI app.
m_pDoc = (CMyDoc*) ((CFrameWnd*)pWndMain)->GetActiveDocument();

在m_pDoc中返回NULL,如果我尝试使用AfterCreate()(在CreateOutlookBar之后调用),则已经太晚了,因为已经使用了m_pDoc并导致崩溃。

    // Create and setup "Outlook" navigation bar:
    if (!CreateOutlookBar(m_wndNavigationBar, ID_VIEW_NAVIGATION, m_wndTree, m_wndCalendar, 250))
    {
        TRACE0("Failed to create navigation pane\n");
        return -1;      // fail to create
    }
  m_wndTree.AfterCreate();

有什么想法吗?

TIA !!

1 个答案:

答案 0 :(得分:0)

我提出了以下建议,但是我不确定这是否正确。同样,我是MFC的新手(我一直直接使用Win32)。这可以正常工作,所以它是 AN 答案,但是 THE 是正确答案吗?

  POSITION docpos = AfxGetApp()->GetFirstDocTemplatePosition();
  CDocTemplate *doctemplate = AfxGetApp()->GetNextDocTemplate(docpos);
  docpos=doctemplate->GetFirstDocPosition();
  m_pDoc = (CMyDoc*)doctemplate->GetNextDoc(docpos);
  ASSERT(m_pDoc);
  ASSERT(m_pDoc->IsKindOf(RUNTIME_CLASS(CMyDoc)));

TIA !!