[C/C++技术]可以隐藏或显示某视图的CSplitterEx类 |
可以隐藏或显示某视图的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 消息处理程序
|
阅读全文(2140) | 回复(0) | 编辑 | 精华 |
|
|
| « | November 2025 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | | | | |
|
| 公告 |
鸿之忆blog于2006年2月6日开张,欢迎光顾! | |
| Blog信息 |
|
blog名称:鸿之忆 日志总数:9 评论数量:9 留言数量:-1 访问次数:80426 建立时间:2006年2月6日 | |

|