单文档程序,视图通过静态拆分,拆分稍微复杂了点,大致描述下是:先拆分一次得
到上下视图,假设为View上和View下。再把View上左右拆分了,为View左和View右。
其中View右会根据View左的树形视图里选择的不同,动态的切换不同的视图:View右1、
View右2、View右3等等。 正常使用时候都是没有问题的,现在碰到的问题是,如果
焦点在View下的时候,执行打开新文档这个操作,重新载入了新的文档后,View右1里
无论什么方式都获得不到doc指针了(AfxGetMainWnd正常,但是GetDocument,
GetActiveView,GetActiveDocument都返回NULL),但是通过View左是可以获得doc指针的,
如果再通过View左使得右侧视图切换到View右2再切换回View右1时,又正常了。 现象挺
奇怪的,好像是视图关联什么的丢失了,实在找不到头绪,请大侠们指教。
到上下视图,假设为View上和View下。再把View上左右拆分了,为View左和View右。
其中View右会根据View左的树形视图里选择的不同,动态的切换不同的视图:View右1、
View右2、View右3等等。 正常使用时候都是没有问题的,现在碰到的问题是,如果
焦点在View下的时候,执行打开新文档这个操作,重新载入了新的文档后,View右1里
无论什么方式都获得不到doc指针了(AfxGetMainWnd正常,但是GetDocument,
GetActiveView,GetActiveDocument都返回NULL),但是通过View左是可以获得doc指针的,
如果再通过View左使得右侧视图切换到View右2再切换回View右1时,又正常了。 现象挺
奇怪的,好像是视图关联什么的丢失了,实在找不到头绪,请大侠们指教。
点击切换一下View右,则View右又正常了。按我的理解,如果CSplitterWnd的某个视图正常的通过DeleteView,CreateView来装载,都应该
正确的和doc关联上,而重新创建时,好像View右没关联上。大侠帮忙看看,谢谢了~~
暂时靠在OnFileOpen里主动设置ActivePane为其它的来规避本问题。
但是具体产生的原因实在想不明白。
m_cSplitterWnd.DeleteView(0, 1);
m_cSplitterWnd.CreateView(0, 1, RUNTIME_CLASS(CMyView), CSize(100, 100), NULL);
这段代码用来删除View右,再创建新的View右。
当焦点不在View下的时候,新创建出来的View右(新创建的,this指针不同,但是没关系,一样能关联到doc指针上)都可以正常的关联到当前doc指针上;当焦点切换到View下的时候,执行这段代码所创建出来的View右,始终是无法获得doc指针的。我觉得是不是因为我的拆分是做了两次,第一次拆分产生View下和View上,第二次拆分把View上拆分成了View左和View右。
代码在mainframe的OnCreateClient函数里:
m_cEventView.CreateStatic (this, 2, 1) 拆分上下
m_cConfigView.CreateStatic (&m_cEventView, 1, 2) 把第一次拆分的CSplitterWnd作为拆分对象拆分为左右。 是不是这里导致的问题
下 m_cConfigView.CreateStatic (&m_cEventView, 1, 2) 这样的呢: 上 这样的拆分该怎么写
左 右
最后参数不要给NULL,可以自己构造一个CCreateContext结构。
一般情况是不需要把视图删除重建的,不同的视图可以创建多个根据需要切换,同类视图也可以只用一个根据需要显示不同数据。
15楼没看懂什么意思。
我的意思就是创建三分视图,一般可以先上下拆分:m_cSplitter1.CreateStatic (this, 2, 1) this
代表mainframe指针, 再m_cSplitter2.CreateStatic (&m_cSplitter1, 1, 2) 把分割视图类m_cSplitter1作为被拆分对象传入,完成第二次拆分。 这样拆分得到的视图是上面一左一右两个,下面一个。可如果我想拆分得到上面一个大的,下面一左一右两个的话,拆分语句该怎么写呢?(就是想先上下拆分,再把下面的视图拆成左右两个)
m_wndSplitter1.CreateStatic(this, 2, 1);
m_wndSplitter2.CreateStatic(&m_wndSplitter1, 1, 2, WS_CHILD | WS_VISIBLE, m_wndSplitter1.IdFromRowCol(1, 0));
m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(100, 100), pContext);
m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(CRightView), CSize(100, 100), pContext);
m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CTopView), CSize(100, 100), pContext);
上面那个问题还有点不太明白的地方,想问下这个CCreateContext该怎么构造。我试着
CCreateContext pContext;
pContext.m_pCurrentDoc = GetActiveView()-> GetDocument();
pContext.m_pCurrentFrame = this; //this为当前的MainFrame
好像不行,会有问题。