现在CSplitterWnd中要对某个视图切换出去,让另外一个视图切换近来,不能用DELETEVIEW/CREATEVIEW来实现,因为这样的话,被切换出去的视图里的数据都没有了,不知道如何实现?
分数不够可以加
分数不够可以加
解决方案 »
- 网页文本框如何自动粘贴剪切板中的内容?
- 有没有检查文件是否为空的函数
- 如何判断 CFONT 是否已经可以使用
- 关于DLL的一个小问题
- 怎么在控件失去焦点前做检验,并阻止控件失去焦点?
- 在CListCtrl(report属性)里单击空行时会触发什么消息?
- 急!!!如何使Textout输出的文本带一黑框,立即给分
- vc如何通过TCP/IP来读取局域网内其他电脑上的文件啊?
- 小生有一疑惑,期待高手的出现:在API函数的结构sockaddr_in到结构sockaddr如何转化?用VB转化?或是能看出其中规律?
- vc++6.0 中,多个线程利用 ADO 如何同时访问数据库,并进行更改记录操作。
- 请问如何获得本机IPv6地址?
- 多视图如何获得视图指针
不过数据保存在View中肯定是不规范的,你应该把数据保存在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);
}
[email protected]加我MSN也好
{
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();//重新布置拆分器的客户区
}需要自己继承一个切分类
写这两个函数再调用这两个函数实现隐藏和切分
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;
}为什么一执行就报错啊,