void CDuiLayout::SetControlRect(CRect rc) { m_rc = rc; if(m_nSplitWidth == 0) { m_nSplitWidth = (m_nLayoutType == LAYOUT_TYPE_HORIZONTAL) ? m_sizeSplit.cy : m_sizeSplit.cx; } // 计算panel、分割线、滑块的位置 if(m_nLayoutType == LAYOUT_TYPE_HORIZONTAL) { int nTop = m_rc.top; for(size_t i = 0; i < m_vecItemInfo.size(); i++) { LayoutItemInfo &itemInfo = m_vecItemInfo.at(i); int nLayoutPos = GetLayoutPos(&itemInfo); int nPosBottom = nTop+nLayoutPos-1; if(i == (m_vecItemInfo.size() - 1)) { nPosBottom = m_rc.bottom; } CRect rcPanel(m_rc.left, nTop, m_rc.right, nPosBottom); itemInfo.pControlPanel->SetRect(rcPanel); itemInfo.pControlPanel->OnPositionChange(); itemInfo.rcSplit = CRect(m_rc.left, nTop+nLayoutPos, m_rc.right, nTop+nLayoutPos+m_nSplitWidth); int nThumbX = m_rc.left + (m_rc.Width() - m_sizeThumb.cx) / 2; int nThumbY = nTop + nLayoutPos + (m_nSplitWidth - m_sizeThumb.cy) /2 ; itemInfo.rcThumb = CRect(nThumbX, nThumbY, nThumbX+m_sizeThumb.cx, nThumbY+m_sizeThumb.cy); nTop += (nLayoutPos+m_nSplitWidth); } }else if(m_nLayoutType == LAYOUT_TYPE_VERTICAL) { int nLeft = m_rc.left; for(size_t i = 0; i < m_vecItemInfo.size(); i++) { LayoutItemInfo &itemInfo = m_vecItemInfo.at(i); int nLayoutPos = GetLayoutPos(&itemInfo); int nPosRight = nLeft+nLayoutPos-1; if(i == (m_vecItemInfo.size() - 1)) { nPosRight = m_rc.right; } CRect rcPanel(nLeft, m_rc.top, nPosRight, m_rc.bottom); itemInfo.pControlPanel->SetRect(rcPanel); itemInfo.pControlPanel->OnPositionChange(); itemInfo.rcSplit = CRect(nLeft+nLayoutPos, m_rc.top, nLeft+nLayoutPos+m_nSplitWidth, m_rc.bottom); int nThumbX = nLeft + nLayoutPos + (m_nSplitWidth - m_sizeThumb.cx) /2 ; int nThumbY = m_rc.top + (m_rc.Height() - m_sizeThumb.cy) / 2; itemInfo.rcThumb = CRect(nThumbX, nThumbY, nThumbX+m_sizeThumb.cx, nThumbY+m_sizeThumb.cy); nLeft += (nLayoutPos+m_nSplitWidth); } } }
void CXTPDockingPaneSidePanel::OnSizeParentEx(CSidePanelArray& arrSide, CWnd* /*pParent*/, CRect rect) { XTPDockingPaneDirection direction = arrSide[0]->m_direction; BOOL bHorizontal = direction == xtpPaneDockTop || direction == xtpPaneDockBottom; int nCount = (int)arrSide.GetSize(), i, j; LENGTH* pLength = new LENGTH[nCount]; for (i = 0; i < nCount; i++) { CXTPDockingPaneSidePanel* pPanel = arrSide[i]; CRect rcPanel(pPanel->m_rcWindow); MINMAXINFO mmi; pPanel->GetMinMaxInfo(&mmi); if (rcPanel.Height() > mmi.ptMaxTrackSize.y) rcPanel.bottom = rcPanel.top + mmi.ptMaxTrackSize.y; if (rcPanel.Height() < mmi.ptMinTrackSize.y) rcPanel.bottom = rcPanel.top + mmi.ptMinTrackSize.y; if (rcPanel.Width() > mmi.ptMaxTrackSize.x) rcPanel.right = rcPanel.left + mmi.ptMaxTrackSize.x; if (rcPanel.Width() < mmi.ptMinTrackSize.x) rcPanel.right = rcPanel.left + mmi.ptMinTrackSize.x; pLength[i].nSize = bHorizontal ? rcPanel.Width() : rcPanel.Height(); pLength[i].nPos = bHorizontal ? rcPanel.left : rcPanel.top; pLength[i].nIndex = i; pLength[i].pPanel = pPanel; pLength[i].nHeight = bHorizontal ? min(rect.Height(), rcPanel.Height()) : min(rect.Width(), rcPanel.Width()); } SortLength(pLength, 0, nCount - 1); for (i = 1; i < nCount; i++) { int nLengthIndex = arrSide[i]->m_nLengthIndex; int nLeft = pLength[nLengthIndex].StartPos(); int nRight = pLength[nLengthIndex].EndPos(); for (j = nLengthIndex - 1; j >= 0; j--) { if (pLength[j].EndPos() > nLeft) { if (pLength[j].nIndex < i) { pLength[j].nPos = nLeft - pLength[j].nSize; nLeft = pLength[j].StartPos(); } } else break; } SortLength(pLength, j + 1, nLengthIndex - 1); for (j = nLengthIndex + 1; j < nCount; j++) { if (pLength[j].StartPos() < nRight) { if (pLength[j].nIndex < i) { pLength[j].nPos = nRight; nRight = pLength[j].EndPos(); } } else break; } SortLength(pLength, nLengthIndex + 1, j - 1); } int nBegin = 0; int nEnd = bHorizontal ? rect.Width() : rect.Height(); int nRight = nEnd; int nLeft = nBegin; for (i = nCount - 1; i >= 0; i--) { if (pLength[i].EndPos() > nRight) { pLength[i].nPos = nRight - pLength[i].nSize; nRight = pLength[i].StartPos(); } else break; } for (i = 0; i < nCount; i++) { if (pLength[i].StartPos() < nLeft) { pLength[i].nPos = nLeft; nLeft = pLength[i].EndPos(); } else break; } int nTotal = pLength[nCount - 1].EndPos(); int cxExtra = nTotal - nEnd; if (cxExtra > 0) { nLeft = 0; for (i = 0; i < nCount; i++) { pLength[i].nPos = nLeft; int cxAddExtra = nTotal == 0 ? cxExtra / nCount : cxExtra * pLength[i].nSize / nTotal; nTotal -= pLength[i].nSize; pLength[i].nSize -= cxAddExtra; cxExtra -= cxAddExtra; nLeft = pLength[i].EndPos(); } } for (i = 0; i < nCount; i++) { int nIndex = pLength[i].nIndex; CXTPDockingPaneSidePanel* pPanel = arrSide[nIndex]; pPanel->MovePanel(&pLength[i], rect); } delete[] pLength; }