void CTuotuoTabCtrl::DoPaint(CDCHandle dc, const RECT &rcClip) const
{
	RECT rcClient;
	GetClientRect(&rcClient);

	dc.SetBkMode(TRANSPARENT);
	s()->Toolbar()->DrawRebarBackPart(dc, rcClient, m_hWnd);

	int iOffSetTop = rcClient.bottom - s()->Tab()->GetTabHeight();
	if (iOffSetTop < 0)
		iOffSetTop = 0;
	rcClient.top += iOffSetTop;

	// draw scroll button
	if (m_bOverflowLeft || m_bOverflowRight || (m_bClosingTabs && m_iLastLayout == 2))
	{
		if (m_bOverflowLeft)
		{
			s()->Tab()->DrawTabScrollButton(dc, m_rcScrollLLeft, m_ePosition == POS_ScrollLLeftBtn ? m_eButtonStatus : Btn_MouseOut, 0);
		}
		else
		{
			s()->Tab()->DrawTabScrollButton(dc, m_rcScrollLLeft, Btn_Disabled, 0);
		}

		if (m_bOverflowRight)
			s()->Tab()->DrawTabScrollButton(dc, m_rcScrollRRight, m_ePosition == POS_ScrollRRightBtn ? m_eButtonStatus : Btn_MouseOut, 1);
		else
			s()->Tab()->DrawTabScrollButton(dc, m_rcScrollRRight, Btn_Disabled, 1);
	}

	// draw sidebar button
	// draw "new tab" button
	//s()->Tab()->DrawNewTabButton(dc, m_rcNewTabBtn, m_ePosition == POS_NewTabBtn ? m_eButtonStatus : Btn_MouseOut);

	// draw tabs
	if (GetItemCountInDraggingMode() == 0)
		return;

	dc.IntersectClipRect(&m_rcTabItemAreaDraw);
	dc.SetViewportOrg(m_iScrollOffsetAni + m_rcTabItemArea.left, 0);

	// we draw the selected item at the last
	dc.SelectFont(s()->Common()->GetDefaultFont());
	ButtonStatus eTabCloseBtnStatus = m_ePosition == POS_TabItemClose ? m_eButtonStatus : Btn_MouseOut;
	int iRightBorder = m_rcTabItemArea.right - m_rcTabItemArea.left - m_iScrollOffsetAni;
	size_t nScrollLeft = - m_iScrollOffsetAni / m_iCurrentWidth;
	size_t nScrollRight = iRightBorder / m_iCurrentWidth + (iRightBorder % m_iCurrentWidth == 0 ? 0 : 1);
	size_t nPaintRight = min(nScrollRight, m_TabItems.size() - 1);

	if (m_nDragToPos == -2)
	{
		for (size_t i = nScrollLeft == 0 ? 0 : nScrollLeft - 1; i <= nPaintRight; i++)
			if (m_TabItems[i] != m_pSelectedItem)
				m_TabItems[i]->DoPaint(dc, m_TabItems[i] == m_pHotItem ? Btn_MouseOver : Btn_MouseOut, m_TabItems[i] == m_pHotItem ? m_ePosition : POS_TabItem, m_eButtonStatus, m_eTabCloseButton == CloseBtn_AlwaysDisplay, iOffSetTop, false);
		dc.SelectFont(s()->Common()->GetBoldFont());
		if (m_pSelectedItem && TAB_MATCH_INTERVAL(nScrollLeft, m_pSelectedItem->GetIndex(), nScrollRight))
			m_pSelectedItem->DoPaint(dc, Btn_MouseDown, m_pSelectedItem == m_pHotItem ? m_ePosition : POS_TabItem, m_eButtonStatus, m_eTabCloseButton != CloseBtn_AlwaysHide, iOffSetTop, false);

		dc.SelectClipRgn(NULL);
		dc.SetViewportOrg(0, 0);
	}
	else		// 拖动状态
	{
		if (m_bDraggingSource)			// 正常状态显示 || 在自己的框架里面拖动
		{
			for (size_t i = nScrollLeft; i <= nPaintRight; i++)
				if (m_TabItems[i] != m_pSelectedItem)
					m_TabItems[i]->DoPaint(dc, Btn_MouseOut, POS_TabItem, Btn_MouseOut, m_eTabCloseButton != CloseBtn_AlwaysHide, iOffSetTop, false);

			dc.SelectClipRgn(NULL);
			dc.SetViewportOrg(0, 0);
			dc.SelectFont(s()->Common()->GetBoldFont());

			if (m_pDraggingItem)
				m_pSelectedItem->DoPaint(dc, Btn_MouseDown, POS_TabItem, Btn_MouseOut, m_eTabCloseButton != CloseBtn_AlwaysHide, iOffSetTop, false);
		}
		else												// 拖到别人的框架里面了
		{
			for (size_t i = nScrollLeft; i <= nPaintRight; i++)
				m_TabItems[i]->DoPaint(dc, Btn_MouseOut, POS_TabItem, Btn_MouseOut, m_eTabCloseButton == CloseBtn_AlwaysDisplay, iOffSetTop, false);

			dc.SelectClipRgn(NULL);
			dc.SetViewportOrg(0, 0);
			dc.SelectFont(s()->Common()->GetBoldFont());

			if (m_pDraggingItem)
				m_pDraggingItem->DoPaint(dc, Btn_MouseDown, POS_TabItem, Btn_MouseOut, m_eTabCloseButton != CloseBtn_AlwaysHide, iOffSetTop, false);
		}
	}
}