可以隐藏或显示某视图的CSplitterEx类
前几天写程序,遇到一个问题。
类似的IE窗口的“历史”或“收藏夹”功能,当点击”历史“以后,会在左边出现一个视图,再点一下,这个视图就关闭(其实是隐藏).
费了半天劲,找到了一个代码,它只能隐藏列,我修改了一下,可以隐藏行了。
//CSplitterEx.h
#pragma
once
// CSplitterEx 框架
class CSplitterEx : public
CSplitterWnd
{
DECLARE_DYNCREATE(CSplitterEx)
protected:
public:
int
m_nHidedCol;
int m_nHidedRow;
CSplitterEx(); //
动态创建所使用的受保护的构造函数
//呵,加个昵称:头太晕 http://spaces.msn.com/members/headfaint
virtual
~CSplitterEx();
void ShowColumn(bool bShow=false);
void HideColumn(int
colHide);
void ShowRowumn(bool bShow=false);
void HideRowumn(int
rowHide);
protected:
DECLARE_MESSAGE_MAP()
};
//CSplitterEx.cpp
// CSplitterEx.cpp : 实现文件
//
//呵,加个昵称:头太晕 http://spaces.msn.com/members/headfaint
#include "stdafx.h"
#include "CSplitterEx.h"
// splitterex
IMPLEMENT_DYNCREATE(CSplitterEx, CSplitterWnd)
CSplitterEx::CSplitterEx()
:m_nHidedCol(-1),m_nHidedRow(-1)
{
}
CSplitterEx::~CSplitterEx()
{
}
BEGIN_MESSAGE_MAP(CSplitterEx, CSplitterWnd)
END_MESSAGE_MAP()
void CSplitterEx::ShowColumn(bool bShow)
{
//这个是显示所有列的. 加个昵称:头太晕 http://spaces.msn.com/members/headfaint
ASSERT_VALID(this);
ASSERT(m_nCols
< m_nMaxCols);
ASSERT(m_nHidedCol != -1);
int colNew = m_nHidedCol;
m_nHidedCol = -1;
int cxNew =
m_pColInfo[m_nCols].nCurSize;
m_nCols++; // add a column
ASSERT(m_nCols
== m_nMaxCols);
// fill the hided column
int col;
for (int row = 0; row <
m_nRows; row++)
{
CWnd* pPaneShow =
GetDlgItem(
AFX_IDW_PANE_FIRST + row * 16 +
m_nCols);
ASSERT(pPaneShow !=
NULL);
pPaneShow->ShowWindow(SW_SHOWNA);
for (col = m_nCols - 2; col >= colNew; col--)
{
CWnd* pPane
= GetPane(row, col);
ASSERT(pPane !=
NULL);
pPane->SetDlgCtrlID(IdFromRowCol(row, col + 1));
}
pPaneShow->SetDlgCtrlID(IdFromRowCol(row, colNew));
}
// new panes have been created -- recalculate layout
for (col = colNew
+ 1; col < m_nCols; col++)
m_pColInfo[col].nIdealSize = m_pColInfo[col -
1].nCurSize;
m_pColInfo[colNew].nIdealSize =
cxNew;
if(bShow)RecalcLayout();
}
void CSplitterEx::HideColumn(int colHide)
{
//这个是隐藏列的, 加个昵称:头太晕 http://spaces.msn.com/members/headfaint
ASSERT_VALID(this);
ASSERT(m_nCols
> 1);
ASSERT(colHide < m_nCols);
ASSERT(m_nHidedCol ==
-1);
m_nHidedCol = colHide;
// if the column has an active window -- change it
int rowActive,
colActive;
if (GetActivePane(&rowActive, &colActive) != NULL
&&
colActive == colHide)
{
if (++colActive >=
m_nCols)
colActive = 0;
SetActivePane(rowActive,
colActive);
}
// hide all column panes
for (int row = 0; row < m_nRows;
row++)
{
CWnd* pPaneHide = GetPane(row, colHide);
ASSERT(pPaneHide
!=
NULL);
pPaneHide->ShowWindow(SW_HIDE);
pPaneHide->SetDlgCtrlID(
AFX_IDW_PANE_FIRST
+ row * 16 + m_nCols);
for (int col = colHide + 1; col < m_nCols; col++)
{
CWnd*
pPane = GetPane(row, col);
ASSERT(pPane !=
NULL);
pPane->SetDlgCtrlID(IdFromRowCol(row, col -
1));
}
}
m_nCols--;
m_pColInfo[m_nCols].nCurSize =
m_pColInfo[colHide].nCurSize;
RecalcLayout();
}
void CSplitterEx::ShowRowumn(bool bShow)
{
//这个是显示行的, 加个昵称:头太晕 http://spaces.msn.com/members/headfaint
ASSERT_VALID(this);
ASSERT(m_nRows
< m_nMaxRows);
ASSERT(m_nHidedRow != -1);
int rowNew = m_nHidedRow;
m_nHidedRow = -1;
int cxNew =
m_pRowInfo[m_nRows].nCurSize;
m_nRows++; // add a column
ASSERT(m_nRows
== m_nMaxRows);
// fill the hided rowumn
int row;
for (int col = 0; col <
m_nCols; col++)
{
CWnd* pPaneShow =
GetDlgItem(
AFX_IDW_PANE_FIRST + col * 16 +
m_nRows);
ASSERT(pPaneShow !=
NULL);
pPaneShow->ShowWindow(SW_SHOWNA);
for (row = m_nRows - 2; row >= rowNew; row--)
{
CWnd* pPane
= GetPane(row, col);
ASSERT(pPane !=
NULL);
pPane->SetDlgCtrlID(IdFromRowCol(row+1, col));
}
pPaneShow->SetDlgCtrlID(IdFromRowCol(rowNew, col));
}
// new panes have been created -- recalculate layout
for (row = rowNew
+ 1; row < m_nRows; row++)
m_pRowInfo[row].nIdealSize = m_pRowInfo[row -
1].nCurSize;
m_pRowInfo[rowNew].nIdealSize = cxNew;
if(bShow)
RecalcLayout();
}
void CSplitterEx::HideRowumn(int rowHide)
{
//这个是隐藏行的, 加个昵称:头太晕 http://spaces.msn.com/members/headfaint
ASSERT_VALID(this);
ASSERT(m_nRows
> 1);
ASSERT(rowHide < m_nRows);
ASSERT(m_nHidedRow ==
-1);
m_nHidedRow = rowHide;
// if the rowumn has an active window -- change it
int rowActive,
colActive;
if (GetActivePane(&rowActive, &colActive) != NULL
&&
rowActive == rowHide)
{
if (++rowActive >=
m_nRows)
rowActive = 0;
SetActivePane(rowActive,
colActive);
}
// hide all rowumn panes
for (int col = 0; col < m_nCols;
col++)
{
CWnd* pPaneHide = GetPane(rowHide, col);
ASSERT(pPaneHide
!=
NULL);
pPaneHide->ShowWindow(SW_HIDE);
pPaneHide->SetDlgCtrlID(
AFX_IDW_PANE_FIRST
+ col * 16 + m_nRows);
for (int row = rowHide + 1; row < m_nRows; row++)
{
CWnd*
pPane = GetPane(row, col);
ASSERT(pPane !=
NULL);
pPane->SetDlgCtrlID(IdFromRowCol(row-1,
col));
}
}
m_nRows--;
m_pRowInfo[m_nRows].nCurSize =
m_pRowInfo[rowHide].nCurSize;
RecalcLayout();
}
// CSplitterEx 消息处理程序