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

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

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

各位高手,请帮我想想办法看看怎么解决!!!!!!
...全文
208 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
holyeagle 2004-08-14
  • 打赏
  • 举报
回复
恭喜
cbc 2004-08-14
  • 打赏
  • 举报
回复
对,可以一次创建完,再切换;偶终于解决了!!
holyeagle 2004-08-12
  • 打赏
  • 举报
回复
是否可以一次创建完,然后在OnSwitchView时候切换显示
Kudeet 2004-08-12
  • 打赏
  • 举报
回复
视图缩放时,标尺栏没反应;
------------------------
是否可以在视图缩放时自己调整标尺栏的位置。
cbc 2004-08-12
  • 打赏
  • 举报
回复
up
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();
}
}代码
wfq771105 2004-08-10
  • 打赏
  • 举报
回复
向各位学习,我想不应该是删除创建,而应该是隐藏显示巴
cbc 2004-08-10
  • 打赏
  • 举报
回复
不是,只有一个CSplitterWnd
Kudeet 2004-08-10
  • 打赏
  • 举报
回复
我是这么切换视图的:
m_wndSplitter.DeleteView(0,1);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CAlterPersonView),CSize(0,0),NULL);
m_wndSplitter.RecalcLayout();
是不是你的程序里有两个CSplitterWnd?

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧