我建了个单文档框架结构,然后通过视图分区将视图分为三部分。
第一个视图你建立TREEVIEW,通过点击tree的不同部分去切换不同的视图显示在第二个视图里面。
当点击的位置发生变化时,我先将当前的视图销毁,然后显示选择的视图。现在遇到一个问题。
当我第一次运行时,可以正常加载图片,点击TREEcontrol切换视图没问题,当重新点击图片的treecontrol,再次加载图片的时候,会发现无法找到之前加载的DOC。
想请教这个是什么原因。
第一个视图你建立TREEVIEW,通过点击tree的不同部分去切换不同的视图显示在第二个视图里面。
当点击的位置发生变化时,我先将当前的视图销毁,然后显示选择的视图。现在遇到一个问题。
当我第一次运行时,可以正常加载图片,点击TREEcontrol切换视图没问题,当重新点击图片的treecontrol,再次加载图片的时候,会发现无法找到之前加载的DOC。
想请教这个是什么原因。
CView* pOldActiveView = GetActiveView();
CCreateContext cc;
cc.m_pCurrentDoc=pOldActiveView->GetDocument();
工程名字为Module,是MFC SDI文档
这是ModuleDoc.Cpp的加载图片的函数
BOOL CModuleDoc::OnNewDocument()
{
//if (!CDocument::OnNewDocument())
// return FALSE;
m_Cover.Load(IDR_COVER);
// TODO: 在此添加重新初始化代码
// (SDI 文档将重用该文档) return TRUE;
}
加载图片后就创建VIEW了,然后就是执行view的OnInitialUpdate,CoverView是从SCROLLview派生出的一个类
void CCoverView::OnInitialUpdate()
{
SetScrollSizes();
}
然后顺序执行下去,第一次加载图片完成
然后通过改变选取的TreeControl的选项不同去选择切换VIEW
void CMainTreeview::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
CTreeCtrl& treeCtrl=GetTreeCtrl();
DWORD num;
//获取当前选中的树项
HTREEITEM hSelectedItem=treeCtrl.GetSelectedItem();
//获取当前选中的树项文本
num = (DWORD)treeCtrl.GetItemData(hSelectedItem); if(num == (DWORD)(0) )
{
//切换到封面视图
pFrame->SwitchToView(COVERVIEW);
}
else if(num == (DWORD)(3))
{
//切换到封面视图
pFrame->SwitchToView(OUTDOOR1SYSTEMVIEW);
}
/*if(str.Find(_T("Cover"))!=-1)
{
//切换到编辑视图
pFrame->SwitchToView(COVERVIEW);
}
else if(str.Find(_T("OutDoor1System"))!=-1)
{
//切换到列表视图
//pFrame->SwitchToView(LISTVIEW);
}*/
*pResult = 0;
}切换目前没问题。
接着我重新选择第一个页面,直接就进入了绘图的OnInitialUpdate(),没有加载图片。
加入断点可以看出是在 CModuleDoc* pDoc = GetDocument();这里得到了一个空的指针,导致后续程序执行不正常那个。
通过加入断点可以知道,第一次执行和第二次执行唯一不同就是第一次执行了一次OnNewDocument函数
“老的VIEW已经被销毁了啊”
老的VIEW 销毁 前 要把 doc 保存下来。
问题在 SwitchToView 里吧
http://caojizi0612.blog.sohu.com/150276618.html
因为我的是SDI程序,所以只需要在全局获得DOC就可以了