BOOL COXSplitterWnd::SwapPanes(CWnd* pFirstWnd, CWnd* pSecondWnd) { ASSERT(pFirstWnd && pSecondWnd); int nCol1, nCol2, nRow1, nRow2; if (!IsChildPane(pFirstWnd, &nRow1, &nCol1) || !IsChildPane(pSecondWnd, &nRow2, &nCol2)) { return FALSE; } int nID1=IdFromRowCol(nRow1,nCol1); int nID2=IdFromRowCol(nRow2,nCol2); pSecondWnd->SetDlgCtrlID(nID1); pFirstWnd->SetDlgCtrlID(nID2); //exchange by row info CSplitterWnd::CRowColInfo info; CSplitterWnd::CRowColInfo* pInfo1=m_pRowInfo; CSplitterWnd::CRowColInfo* pInfo2=m_pRowInfo; pInfo1+=nID1 - (AFX_IDW_PANE_FIRST + nRow1 * 16 + nCol1); pInfo2+=nID2 - (AFX_IDW_PANE_FIRST + nRow2 * 16 + nCol2); memcpy(&info, pInfo1, sizeof(CSplitterWnd::CRowColInfo)); memcpy(pInfo1, pInfo2, sizeof(CSplitterWnd::CRowColInfo)); memcpy(pInfo2, &info, sizeof(CSplitterWnd::CRowColInfo)); RecalcLayout(); RedrawWindow(); return TRUE; }
BOOL COXSplitterWnd::RemoveRow(int nDelRow) { ASSERT(GetRowCount()>1); if(GetRowCount()<=1) { return FALSE; } ASSERT(nDelRow>=0 && nDelRow<GetRowCount()); ASSERT(::IsWindow(GetSafeHwnd())); // delete all views in specified row for(int nCol=0; nCol<m_nMaxCols; nCol++) { CWnd* pView=GetDlgItem(IdFromRowCol(nDelRow,nCol)); if(pView!=NULL) { DeleteView(nDelRow,nCol); } } // create new array of row info CRowColInfo* pRowInfo=new CRowColInfo[m_nMaxRows-1]; int nRow=0; for(nRow=0; nRow<m_nMaxRows-1; nRow++) { int nExistingRow=(nRow<nDelRow ? nRow : nRow+1); if(nExistingRow!=nDelRow) { // copy existing row data pRowInfo[nRow].nMinSize=m_pRowInfo[nExistingRow].nMinSize; pRowInfo[nRow].nIdealSize=m_pRowInfo[nExistingRow].nIdealSize; pRowInfo[nRow].nCurSize=m_pRowInfo[nExistingRow].nCurSize; } } // delete old array delete[] m_pRowInfo; // save new one m_pRowInfo=pRowInfo; // reset pane IDs (in forward direction) for(nRow=nDelRow+1; nRow<m_nMaxRows; nRow++) { for(int nCol=0; nCol<m_nMaxCols; nCol++) { CWnd* pView=GetDlgItem(IdFromRowCol(nRow,nCol)); ASSERT(pView!=NULL); pView->SetDlgCtrlID(IdFromRowCol(nRow-1,nCol)); } } // set new number of rows m_nMaxRows--; m_nRows=m_nMaxRows; return TRUE; }
BOOL COXSplitterWnd::RemoveColumn(int nDelCol) { ASSERT(GetColumnCount()>1); if(GetColumnCount()<=1) { return FALSE; } ASSERT(nDelCol>=0 && nDelCol<GetColumnCount()); ASSERT(::IsWindow(GetSafeHwnd())); // delete all views in specified column for(int nRow=0; nRow<m_nMaxRows; nRow++) { CWnd* pView=GetDlgItem(IdFromRowCol(nRow,nDelCol)); if(pView!=NULL) { DeleteView(nRow,nDelCol); } } // create new array of column info CRowColInfo* pColInfo=new CRowColInfo[m_nMaxCols-1]; int nCol=0; for(nCol=0; nCol<m_nMaxCols-1; nCol++) { int nExistingCol=(nCol<nDelCol ? nCol : nCol+1); if(nExistingCol!=nDelCol) { // copy existing column data pColInfo[nCol].nMinSize=m_pColInfo[nExistingCol].nMinSize; pColInfo[nCol].nIdealSize=m_pColInfo[nExistingCol].nIdealSize; pColInfo[nCol].nCurSize=m_pColInfo[nExistingCol].nCurSize; } } // delete old array delete[] m_pColInfo; // save new one m_pColInfo=pColInfo; // reset pane IDs (in forward direction) for(nCol=nDelCol+1; nCol<m_nMaxCols; nCol++) { for(int nRow=0; nRow<m_nMaxRows; nRow++) { CWnd* pView=GetDlgItem(IdFromRowCol(nRow,nCol)); ASSERT(pView!=NULL); pView->SetDlgCtrlID(IdFromRowCol(nRow,nCol-1)); } } // set new number of columns m_nMaxCols--; m_nCols=m_nMaxCols; return TRUE; }
BOOL COXSplitterWnd::InsertColumn(int nInsertBefore, int nWidth) { ASSERT(nInsertBefore>=0 && nInsertBefore<=GetColumnCount()); ASSERT(::IsWindow(GetSafeHwnd())); // create new array of column info CRowColInfo* pColInfo=new CRowColInfo[m_nMaxCols+1]; int nCol=0; for(nCol=0; nCol<m_nMaxCols+1; nCol++) { int nExistingCol=(nCol<nInsertBefore ? nCol : nCol-1); if(nCol==nInsertBefore) { // set data for inserted column pColInfo[nCol].nMinSize=0; pColInfo[nCol].nIdealSize=nWidth; pColInfo[nCol].nCurSize=-1; } else { // copy existing column data pColInfo[nCol].nMinSize=m_pColInfo[nExistingCol].nMinSize; pColInfo[nCol].nIdealSize=m_pColInfo[nExistingCol].nIdealSize; pColInfo[nCol].nCurSize=m_pColInfo[nExistingCol].nCurSize; } } // delete old array delete[] m_pColInfo; // save new one m_pColInfo=pColInfo; // set new number of columns m_nMaxCols++; m_nCols=m_nMaxCols; // reset pane IDs (do that in backward direction) for(nCol=m_nMaxCols-2; nCol>=nInsertBefore; nCol--) { for(int nRow=m_nMaxRows-1; nRow>=0; nRow--) { CWnd* pView=GetDlgItem(IdFromRowCol(nRow,nCol)); ASSERT(pView!=NULL); pView->SetDlgCtrlID(IdFromRowCol(nRow,nCol+1)); } } return TRUE; }
BOOL COXSplitterWnd::InsertRow(int nInsertBefore, int nHeight) { ASSERT(nInsertBefore>=0 && nInsertBefore<=GetRowCount()); ASSERT(::IsWindow(GetSafeHwnd())); // create new array of row info CRowColInfo* pRowInfo=new CRowColInfo[m_nMaxRows+1]; int nRow=0; for(nRow=0; nRow<m_nMaxRows+1; nRow++) { int nExistingRow=(nRow<nInsertBefore ? nRow : nRow-1); if(nRow==nInsertBefore) { // set data for inserted row pRowInfo[nRow].nMinSize=0; pRowInfo[nRow].nIdealSize=nHeight; pRowInfo[nRow].nCurSize=-1; } else { // copy existing row data pRowInfo[nRow].nMinSize=m_pRowInfo[nExistingRow].nMinSize; pRowInfo[nRow].nIdealSize=m_pRowInfo[nExistingRow].nIdealSize; pRowInfo[nRow].nCurSize=m_pRowInfo[nExistingRow].nCurSize; } } // delete old array delete[] m_pRowInfo; // save new one m_pRowInfo=pRowInfo; // set new number of rows m_nMaxRows++; m_nRows=m_nMaxRows; // reset pane IDs (do that in backward direction) for(nRow=m_nMaxRows-2; nRow>=nInsertBefore; nRow--) { for(int nCol=m_nMaxCols-1; nCol>=0; nCol--) { CWnd* pView=GetDlgItem(IdFromRowCol(nRow,nCol)); ASSERT(pView!=NULL); pView->SetDlgCtrlID(IdFromRowCol(nRow+1,nCol)); } } return TRUE; }
void CCustInfoSplitterWnd ::ShowColumn() { ASSERT_VALID( this ); ASSERT( m_nCols < m_nMaxCols ); ASSERT( m_nHiddenCol != -1 ); int nShowCol = m_nHiddenCol; m_nHiddenCol = -1; int cxNew = m_pColInfo[m_nCols].nCurSize; m_nCols++; // add a column ASSERT( m_nCols == m_nMaxCols ); int nCol; // Show the hidden column for( int nRow = 0; nRow < m_nRows; ++nRow ) { CWnd* pPaneShow = GetDlgItem( AFX_IDW_PANE_FIRST+nRow +16*m_nCols ); ASSERT( pPaneShow != NULL ); pPaneShow->ShowWindow( SW_SHOWNA ); for( nCol = m_nCols - 2; nCol >= nShowCol; --nCol ) { CWnd* pPane = GetPane( nRow, nCol ); ASSERT( pPane != NULL ); pPane->SetDlgCtrlID( IdFromRowCol( nRow, nCol + 1 )); } pPaneShow->SetDlgCtrlID( IdFromRowCol( nRow, nShowCol )); } // new panes have been created -- recalculate layout for( nCol = nShowCol+1; nCol < m_nCols; nCol++ ) m_pColInfo[nCol].nIdealSize = m_pColInfo[nCol - 1].nCurSize; /* m_pColInfo[nShowCol].nIdealSize = cxNew;*/ RecalcLayout(); }
void AW_CMultiViewSplitter::SetCurrentView(int nRow, int nCol, int nViewID) { long paneID = MAKELONG(nRow,nCol); map<long, int>::iterator itCur; itCur = m_mapCurrentViews.find(paneID); if (itCur != m_mapCurrentViews.end()) (*itCur).second = nViewID; else m_mapCurrentViews.insert(map<long,int>::value_type(paneID,nViewID)); CWnd * pView = GetView(nViewID); pView->SetDlgCtrlID(IdFromRowCol(nRow, nCol)); pView->ShowWindow(SW_SHOW); }
HBRUSH CMySplitterWnd::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CSplitterWnd::OnCtlColor(pDC, pWnd, nCtlColor); if(nCtlColor == CTLCOLOR_LISTBOX && pWnd->GetDlgCtrlID() == IdFromRowCol(1,0)) { // Pane 1,0 is a list box. Set the color of the text to be blue. pDC->SetBkColor(m_BkColor); pDC->SetTextColor(RGB(0,0,255)); return (HBRUSH)m_hbrListBoxBkgnd.GetSafeHandle(); } // TODO: Return a different brush if the default is not desired return hbr; }
void CBCGPSplitterWnd::RecalcLayout() { for (int col = 0; col < m_nCols; col++) { for (int row = 0; row < m_nRows; row++) { if (GetDlgItem(IdFromRowCol(row, col)) == NULL) { // Not created yet, do nothing return; } } } CSplitterWnd::RecalcLayout(); }
void CCustInfoSplitterWnd ::HideColumn(int nColHide) { ASSERT_VALID( this ); ASSERT( m_nCols > 1 ); ASSERT( nColHide < m_nCols ); ASSERT( m_nHiddenCol == -1 ); m_nHiddenCol = nColHide; // if the column has an active window -- change it int nActiveRow, nActiveCol; if( GetActivePane( &nActiveRow, &nActiveCol ) != NULL ) { if( nActiveCol == nColHide ) { if( ++nActiveCol >= m_nCols ) nActiveCol = 0; SetActivePane( nActiveRow, nActiveCol ); } } // hide all column panes for( int nRow = 0; nRow < m_nRows; nRow++) { CWnd* pPaneHide = GetPane(nRow, nColHide); ASSERT( pPaneHide != NULL ); pPaneHide->ShowWindow(SW_HIDE); pPaneHide->SetDlgCtrlID( AFX_IDW_PANE_FIRST+nRow +16*m_nCols ); for( int nCol = nColHide + 1; nCol < m_nCols; nCol++ ) { CWnd* pPane = GetPane( nRow, nCol ); ASSERT( pPane != NULL ); pPane->SetDlgCtrlID( IdFromRowCol( nRow, nCol - 1 )); } } m_nCols--; m_pColInfo[m_nCols].nCurSize = m_pColInfo[nColHide].nCurSize; RecalcLayout(); }