我FUKE!写了一大堆,没保存住,我想哭。。。不管了,把代码贴出来就算了,不懂的留言问我。
void CUsefulSplitterWnd::HideColumn(int place,int colHide)
{
int rowActive, colActive;
if (GetActivePane(&rowActive, &colActive) != NULL &&
colActive == place)
{
if (++colActive >= m_nCols)
colActive = 0;
SetActivePane(rowActive, colActive);
}
int id=AFX_IDW_PANE_FIRST;
for(int i=0;i<place;i++)
{
CWnd* pPane=GetPane(0,i);
pPane->SetDlgCtrlID(id+i);
pPane->ShowWindow(SW_SHOW);
}
for(i=place;i<m_nCols-1;i++)
{
CWnd* pPane=GetPane(0,i+1);
pPane->SetDlgCtrlID(id+i);
pPane->ShowWindow(SW_SHOW);
}
m_ppView[colHide]->SetDlgCtrlID(id+i);
m_ppView[colHide]->ShowWindow(SW_HIDE);
m_nCols--;
m_pSavedColInfo[colHide] = m_pColInfo[place];
for(i=place;i<m_nCols;i++)
m_pColInfo[i] = m_pColInfo[i+1];
RecalcLayout();
}
AFX_IDW_PANE_FIRST //第一个视图的ID号 MFC内部常量
m_nCols //当前视图的个数 MFC内部变量
m_pColInfo //包含当前每个视图的大小和位置等信息的结构体数组 MFC内部变量
m_ppView //存储所有视图指针的数组 我定义的变量
m_pSavedColInfo //用来存储被删除视图的大小和位置等信息的结构体数组 我定义的变量
SetDlgCtrlID( ) //设置窗口或对话框新的ID号
例如:
m_ppView[colHide]->SetDlgCtrlID(id+i);
m_ppView[colHide]->ShowWindow(SW_HIDE);
两句代码的作用是把要隐藏的视图移动到第i个位置,并使其隐藏。
大体思想,把要隐藏的视图后面的视图均往前移动一个位置,然后把要隐藏的视图移动到最后的位置并使其隐藏,然后使m_nCols减一,再RecalcLayout( )一把就OK了!
CodeProject上面有个牛人写了个CExtSplitter,非常好用!看懂我的代码后再看他的就容易多了。
源地址:http://www.codeproject.com/KB/splitter/extsplitter.aspx
用的时候要注意,C2DArray和CExtSplitter两个类都要导入,除了在使用的地方包含其头文件外,还要修改一下你的stdafx.h,看看和他的stdafx.h有什么不同你就知道了。