我是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 !!
答案 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 !!