Ejemplo n.º 1
0
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;
}