本站首页    管理页面    写新日志    退出


[C/C++技术]可以隐藏或显示某视图的CSplitterEx类
鸿 发表于 2006/2/8 13:05:08

可以隐藏或显示某视图的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
2345678
9101112131415
16171819202122
23242526272829
30

  公告

鸿之忆blog于2006年2月6日开张,欢迎光顾!


  我的分类(专题)
  最近日志

  最新评论

  留言板

  链接


  Blog信息
blog名称:鸿之忆
日志总数:9
评论数量:9
留言数量:-1
访问次数:80426
建立时间:2006年2月6日



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.031 second(s), page refreshed 144792401 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号