可以隱藏或顯示某視圖的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 消息處理程序 |
可以隱藏或顯示某視圖的CSplitterEx類
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.