关于CSplitterWnd多视图切分并切换问题,如何保存住所有视图状态

myview 2006-11-22 04:53:29
现在CSplitterWnd中要对某个视图切换出去,让另外一个视图切换近来,不能用DELETEVIEW/CREATEVIEW来实现,因为这样的话,被切换出去的视图里的数据都没有了,不知道如何实现?
分数不够可以加
...全文
557 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jorn 2007-03-15
  • 打赏
  • 举报
回复
给我解决方案阿
小弟我也在做类似的一个程序,都不知道怎么做!
谢谢了!!
myview 2006-11-30
  • 打赏
  • 举报
回复
已解决
myview 2006-11-24
  • 打赏
  • 举报
回复
我的代码如下,CSplitterView派生于CSplitterWnd类,重写函数如下
BOOL CSplitterView::Create(CWnd* pParentWnd, int nMaxRows, int nMaxCols, SIZE sizeMin, CCreateContext* pContext, DWORD dwStyle , UINT nID)
{
VERIFY(CreateStatic(pParentWnd,1,2,dwStyle,nID));
VERIFY(CreateView(0, 0, RUNTIME_CLASS(CtestView),
CSize(200, 0), pContext));
VERIFY(CreateView(0, 1, RUNTIME_CLASS(CtestView),
CSize(0, 0), pContext));
return true;

}
在MainFrame::OnCreateClient()代码如下:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
(m_splitter.CreateStatic(this, 2, 1));
(m_splitter.CreateView(0, 0, RUNTIME_CLASS(CSplitterView),CSize(0,100), pContext));
(m_splitter.CreateView(1, 0, RUNTIME_CLASS(CSplitterView),CSize(0, 0), pContext));
return TRUE;
}

为什么一执行就报错啊,
myview 2006-11-24
  • 打赏
  • 举报
回复
我继承了CSplitterWnd类,重写了Create函数,为什么执行就ERROR呢
myview 2006-11-23
  • 打赏
  • 举报
回复
关键是如何保存在DOC类呢?能给点代码吗?
zmx0506 2006-11-23
  • 打赏
  • 举报
回复
我看过这样的代码,就是所有视图都创建,只把当前的视图SHOW,把别的HIDE就是了啊,这对视图的显示没任何问题,不过你说的数据嘛,老实说,还之存Doc中好点
myview 2006-11-23
  • 打赏
  • 举报
回复
我的VIEW很多,不仅仅是2个VIEW的问题,还有人做过没啊
qiujian5628 2006-11-23
  • 打赏
  • 举报
回复
那个pane切分的时候就是指定那个View的你怎么切换?
换一种思想去处理不是很好
一个显示一个隐藏 不就达到了你所谓的切换功能了吗?
firein 2006-11-23
  • 打赏
  • 举报
回复
void CSecondSpli::HideColumn(int nColHide)
{
ASSERT( m_nCols > 1 );
ASSERT( nColHide < m_nCols );
if(m_nHiddenCol != -1 )
return;
//记录隐藏列
m_nHiddenCol = nColHide;

// 如果将被隐藏的子窗口是活动的,则移去其焦点
int nActiveCol=0;

if(GetActivePane( NULL, &nActiveCol )!=NULL)
if(nActiveCol==nColHide)
ActivateNext();//转移活动子窗口

//为了简化,仅以一行为例,隐藏该行的nColHide列。如果该拆分器包含多行,必须以循环方式隐藏所有行的nColHide列
CWnd* pPaneHide = GetPane(0, nColHide);//该拆分器仅包含1行(但包含多列)
ASSERT( pPaneHide != NULL );
pPaneHide->ShowWindow(SW_HIDE);//隐藏该列
pPaneHide->SetDlgCtrlID(ID_HIDE_COLUMN);//重设被隐藏子窗口的ID

//记录当前隐藏子窗口的尺寸,以备恢复显示。
m_pColInfo[m_nCols-1].nCurSize = m_pColInfo[nColHide].nCurSize;

//调整隐藏列之后的子窗口的ID号,使剩余子窗口的ID号与其新的显示位置协调一致
for( int nCol = nColHide + 1; nCol < m_nCols; nCol++ )
{
CWnd* pPane = GetPane( 0, nCol );
ASSERT( pPane != NULL );
pPane->SetDlgCtrlID( IdFromRowCol( 0, nCol - 1 ));
m_pColInfo[nCol-1].nCurSize = m_pColInfo[nCol].nCurSize;
}

m_nCols--;//总列数减1
//重新布置拆分器的客户区,同CFrameWnd:: RecalcLayout()功能相似
RecalcLayout();
}

void CSecondSpli::ShowColumn()
{
ASSERT( m_nCols < m_nMaxCols );
if( m_nHiddenCol == -1 )
return;
int nShowCol = m_nHiddenCol;
m_nHiddenCol = -1;
int cxNew = m_pColInfo[m_nCols].nCurSize;//取得隐藏列的原始尺寸(宽度)
m_nCols++; // 总列数加1
int nCol;
//显示被隐藏的列。如果有多行被隐藏,要进行循环处理
CWnd* pPaneShow = GetDlgItem(ID_HIDE_COLUMN);
ASSERT( pPaneShow != NULL );
pPaneShow->ShowWindow( SW_SHOWNA );
//调整隐藏列之后的子窗口的ID号,使剩余子窗口的ID号与其新的显示位置协调一致
for( nCol = m_nCols - 2; nCol >= nShowCol; --nCol )
{
CWnd* pPane = GetPane( 0, nCol );//拆分器仅包含一行
ASSERT( pPane != NULL );
pPane->SetDlgCtrlID( IdFromRowCol( 0, nCol + 1 ));
}
pPaneShow->SetDlgCtrlID( IdFromRowCol( 0, nShowCol ));//恢复标准ID号
// 调整列信息,使其与新的子窗口位置协调一致
for( nCol = nShowCol+1; nCol < m_nCols; nCol++ )
m_pColInfo[nCol].nIdealSize = m_pColInfo[nCol - 1].nCurSize;
m_pColInfo[nShowCol].nIdealSize = cxNew;
RecalcLayout();//重新布置拆分器的客户区
}

需要自己继承一个切分类
写这两个函数

再调用这两个函数实现隐藏和切分
myview 2006-11-23
  • 打赏
  • 举报
回复
帮帮我拉,头都搞疼了,切换的时候不能DELETEVIEW,要隐藏,保存该视图数据,下次切换进来的时候可以快速显示,

帮我一下,可以吗?感谢
firein 2006-11-23
  • 打赏
  • 举报
回复
哈哈 我刚做过和这个差不多的
myview 2006-11-23
  • 打赏
  • 举报
回复
shl6894() :兄弟,能给个简单的例子吗?我的EMAIL:
njhjb@hotmail.com加我MSN也好
zhuzhiyou 2006-11-23
  • 打赏
  • 举报
回复
帮顶
一分之千 2006-11-23
  • 打赏
  • 举报
回复
视图切换的时候不要删除,用SHOW和HIDE,数据保存到DOC里边使用序列化,如下:
void CxxxDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar<<m_nSnowNum<<m_nSnowSpeed<<m_nWindSpeed
<<m_strWindDirection<<m_strBackGround<<m_bStart;
for(int i=0;i<m_nSnowNum;i++)
ar<<Snow[i].m_ptPoint;
// TODO: add storing code here
}
else
{
ar>>m_nSnowNum>>m_nSnowSpeed>>m_nWindSpeed
>>m_strWindDirection>>m_strBackGround>>m_bStart;
for(int i=0;i<m_nSnowNum;i++)
ar>>Snow[i].m_ptPoint;
// TODO: add loading code here
}
// m_SnowList.Serialize(ar);
}
myview 2006-11-23
  • 打赏
  • 举报
回复
没有人帮顶啊
myview 2006-11-22
  • 打赏
  • 举报
回复
最小化?在同一个PANE中难道能出现2个VIEW?

我是要把原来的PANE里的VIEW切换出去,把新的VIEW切换近来啊
qiujian5628 2006-11-22
  • 打赏
  • 举报
回复
以前写过类似的东西
但是也是一直没能很好的实现
最后没有办法
将要隐藏的视图最小化 要显示的最大化 重新设置大小那样
基本能实现功能 有一点别扭的就是那个分割线
myview 2006-11-22
  • 打赏
  • 举报
回复
所谓的切换就是其中一个ListView实例中已经有很多图片,现在要把该视图隐藏掉,用另外一个ListView的实例来显示,关键是如何保存住前一个实例中的图片,以备以后直接切换进来显示
flyswift 2006-11-22
  • 打赏
  • 举报
回复
不太明白你所谓的切换是什么意思..
不过数据保存在View中肯定是不规范的,你应该把数据保存在doc中.

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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