• 如何实现SDI程序使用CSplitterWnd创建的多个视图的动态地显示和关闭视图


    为了实现该功能我们需要对CSplitterWnd进行增强,具体实现如下:

    一、定义头文件


    显示代码打印01 ////////////////////////////////////////////////////////////////// 

    02 // 

    03 // splitex.h 

    04 class CSplitterWndEx : public CSplitterWnd 

    05 { 

    06 protected: 

    07    int m_nHidedCol;    // hide column number, -1 if all columns 

    08                        // are shown 

    09   

    10 public: 

    11    CSplitterWndEx(); 

    12   

    13    void ShowColumn(); 

    14    void HideColumn(int colHide); 

    15   

    16 // ClassWizard generated virtual function overrides 

    17    //{{AFX_VIRTUAL(CSplitterWndEx) 

    18    //}}AFX_VIRTUAL 

    19   

    20 // Generated message map functions 

    21 protected: 

    22    //{{AFX_MSG(CSplitterWndEx) 

    23       // NOTE - the ClassWizard will add and remove member 

    24       //        functions here. 

    25       //}}AFX_MSG 

    26   

    27     DECLARE_MESSAGE_MAP() 

    28 };

    二、具体实现代码


    显示代码打印001 ////////////////////////////////////////////////////////////////// 

    002 // 

    003 // splitex.cpp 

    004 #include "stdafx.h" 

    005 #include "splitex.h" 

    006   

    007 #ifdef _DEBUG 

    008 #define new DEBUG_NEW 

    009 #undef THIS_FILE 

    010 static char THIS_FILE[] = __FILE__; 

    011 #endif 

    012   

    013 ////////////////////////////////////////////////////////////////// 

    014 / 

    015 // CSplitterWndEx 

    016   

    017 CSplitterWndEx::CSplitterWndEx() : 

    018     m_nHidedCol(-1) 

    019 { 

    020 } 

    021   

    022 void CSplitterWndEx::ShowColumn() 

    023 { 

    024    ASSERT_VALID(this); 

    025    ASSERT(m_nCols < m_nMaxCols); 

    026    ASSERT(m_nHidedCol != -1); 

    027   

    028    int colNew = m_nHidedCol; 

    029    m_nHidedCol = -1; 

    030    int cxNew = m_pColInfo[m_nCols].nCurSize; 

    031    m_nCols++;    // add a column 

    032    ASSERT(m_nCols == m_nMaxCols); 

    033   

    034    // fill the hidden column 

    035    int col; 

    036    for (int row = 0; row < m_nRows; row++) 

    037    { 

    038       CWnd* pPaneShow = GetDlgItem( 

    039          AFX_IDW_PANE_FIRST + row * 16 + m_nCols); 

    040       ASSERT(pPaneShow != NULL); 

    041       pPaneShow->ShowWindow(SW_SHOWNA); 

    042   

    043       for (col = m_nCols - 2; col >= colNew; col--) 

    044       { 

    045          CWnd* pPane = GetPane(row, col); 

    046          ASSERT(pPane != NULL); 

    047          pPane->SetDlgCtrlID(IdFromRowCol(row, col + 1)); 

    048       } 

    049   

    050       pPaneShow->SetDlgCtrlID(IdFromRowCol(row, colNew)); 

    051    } 

    052   

    053    // new panes have been created -- recalculate layout 

    054    for (col = colNew + 1; col < m_nCols; col++) 

    055       m_pColInfo[col].nIdealSize = m_pColInfo[col - 1].nCurSize; 

    056    m_pColInfo[colNew].nIdealSize = cxNew; 

    057    RecalcLayout(); 

    058 } 

    059   

    060 void CSplitterWndEx::HideColumn(int colHide) 

    061 { 

    062    ASSERT_VALID(this); 

    063    ASSERT(m_nCols > 1); 

    064    ASSERT(colHide < m_nCols); 

    065    ASSERT(m_nHidedCol == -1); 

    066    m_nHidedCol = colHide; 

    067   

    068    // if the column has an active window -- change it 

    069    int rowActive, colActive; 

    070    if (GetActivePane(&rowActive, &colActive) != NULL && 

    071        colActive == colHide) 

    072    { 

    073       if (++colActive >= m_nCols) 

    074          colActive = 0; 

    075       SetActivePane(rowActive, colActive); 

    076    } 

    077   

    078    // hide all column panes 

    079    for (int row = 0; row < m_nRows; row++) 

    080    { 

    081       CWnd* pPaneHide = GetPane(row, colHide); 

    082       ASSERT(pPaneHide != NULL); 

    083       pPaneHide->ShowWindow(SW_HIDE); 

    084       pPaneHide->SetDlgCtrlID( 

    085          AFX_IDW_PANE_FIRST + row * 16 + m_nCols); 

    086   

    087       for (int col = colHide + 1; col < m_nCols; col++) 

    088       { 

    089          CWnd* pPane = GetPane(row, col); 

    090          ASSERT(pPane != NULL); 

    091          pPane->SetDlgCtrlID(IdFromRowCol(row, col - 1)); 

    092       } 

    093    } 

    094    m_nCols--; 

    095    m_pColInfo[m_nCols].nCurSize = m_pColInfo[colHide].nCurSize; 

    096     RecalcLayout(); 

    097 } 

    098   

    099 BEGIN_MESSAGE_MAP(CSplitterWndEx, CSplitterWnd) 

    100 //{{AFX_MSG_MAP(CSplitterWndEx) 

    101    // NOTE - the ClassWizard will add and remove mapping macros here. 

    102 //}}AFX_MSG_MAP 

    103 END_MESSAGE_MAP()


    文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/3_program/c++/cppsl/2007919/72107.html

  • 相关阅读:
    Linux中的计算器(bc)
    在Linux中显示日历(cal)
    在Linux中显示日期(date)
    Linux中的注销当前用户
    Linux中的提示符
    在Linux中启动X Window
    硬盘知识
    划分Linux分区
    Linux中的关机
    hdu4424 Conquer a New Region 并查集/类似最小生成树
  • 原文地址:https://www.cnblogs.com/cy163/p/1929078.html
Copyright © 2020-2023  润新知