|
前几天写程序,遇到一个问题。 类似的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 : 实现文件 //
#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)
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) {
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) {
// 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 消息处理程序
|