高分,在线等,一个单文档多视图问题(如何动态改变一个拆分窗口的某个View)

cbc 2004-08-10 03:30:23

我设计了一个标尺(CSplitterWnd继承),在OnCreateClient中拆分为4个窗格;
另外又设计了两个View类;我想在第一个View类中显示标尺;而在另一个view类中不显示标尺;两个view类可以随时切换.现在问题是第一次启动时标尺可以显示(第一个View类设为首先启动);切换至第二个view类时也没问题,但是当再从第二个view类切换至第一个view类时,就出现异常错误!追踪时,发现是GetPane(1,1)为无效Wnd

而我再第一个view类中将标尺注视掉,不显示就没问题了!!!!!!!!!!!!!111111111
但是标尺是很重要的,不能去除!

各位高手,请帮我想想办法看看怎么解决!!!!!!
...全文
144 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
syy64 2004-08-13
对,考虑同步问题。
回复
无敌魔仙 2004-08-12
就是你不是需要和视图同步吗?比如尺寸变化,那么这时候(wm_size消息)需要按你的要求修改标尺栏的
回复
cbc 2004-08-12
视图变换时???请说的具体一些好码?
回复
无敌魔仙 2004-08-12
在视图变化时需要修改标尺才能同步厄
回复
cbc 2004-08-12
在每次进入到第一个视图时,都吧m_rulers删除,重新创建,

现在切换是没问题了,没错误,但是
和第一次进入的时候还是不一样;视图和标尺栏没法同步;比如
视图缩放时,标尺栏没反应;而且打印预览时,标尺栏也出来了!
回复
cbc 2004-08-12
贴出切换
void CMainFrame::OnSwitchView(UINT nCmdID)
{
if (nCmdID == m_nCurrentView)
return; // already selected

// if(m_Rulers!=NULL){
// delete m_Rulers; m_Rulers=NULL;
// }
// Set the child window ID of the active view to AFX_IDW_PANE_FIRST.
// This is necessary so that CFrameWnd::RecalcLayout will allocate
// this "first pane" to that portion of the frame window's client
// area not allocated to control bars. Set the child ID of
// the previously active view to some other ID; we will use the
// command ID as the child ID.
CView* pOldActiveView = GetActiveView();
::SetWindowLong(pOldActiveView->m_hWnd, GWL_ID, m_nCurrentView);

CRuntimeClass* pNewViewClass;
switch (nCmdID)
{
case ID_VIEW_DESIGN:
pNewViewClass = RUNTIME_CLASS(CLABELPView);
break;
case ID_VIEW_PAGE:
pNewViewClass = RUNTIME_CLASS(CPageView);
break;
default:
ASSERT(0);
return;
}
// create the new view
CCreateContext context;
context.m_pNewViewClass = pNewViewClass;
context.m_pCurrentDoc = GetActiveDocument();

CView* pNewView = STATIC_DOWNCAST(CView, CreateView(&context));

if (pNewView != NULL)
{
// the new view is there, but invisible and not active...
SetActiveView(pNewView);
pNewView->ShowWindow(SW_SHOW);


if(m_nCurrentView==ID_VIEW_PAGE){
if(m_Rulers!=NULL){
delete m_Rulers; m_Rulers=NULL;
}
m_Rulers=new CRulerSplitterWnd();
// m_Rulers->CreateView(1,1,pNewViewClass,CSize(0,0),&context);
if (!m_Rulers->CreateRulers(this, &context)) {
TRACE("Error creation of rulers\n");
}
}
pNewView->OnInitialUpdate();
// SetActiveView(pNewView);
// pNewView->ShowWindow(SW_SHOW);

pNewView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
RecalcLayout();
m_nCurrentView = nCmdID;
// finally destroy the old view...
// pOldActiveView->ShowWindow(SW_HIDE);
pOldActiveView->DestroyWindow();
}
}代码
回复
xiaoyvr 2004-08-11
应该和窗口的ID有关吧,CSplitterWnd的每一个pane各有一个ID,而getpane就是根据ID得到窗口指针的。
回复
Kudeet 2004-08-10
换种切换方法,不用GetPane呢?
回复
flyelf 2004-08-10
仔细跟踪从第一个视图切换到第二个视图的时候,都发生了什么变化
回复
发帖
界面
创建于2007-09-28

1.5w+

社区成员

VC/MFC 界面
申请成为版主
帖子事件
创建了帖子
2004-08-10 03:30
社区公告
暂无公告