可以隐藏或显示某视图的CSplitterEx类

王朝vc·作者佚名  2006-02-01
窄屏简体版  字體: |||超大  

可以隐藏或显示某视图的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 消息处理程序

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航