void CXTPSkinObjectProgress::DoStep(int nStep)
{
	CXTPClientRect rcClient(this);

	CXTPSkinManagerClass* pClassProgress = GetSkinClass();

	DWORD dwStyle = GetStyle();
	BOOL bVert = dwStyle & PBS_VERTICAL;
	CRect rcMargins = pClassProgress->GetThemeRect(bVert ? PP_BARVERT : PP_BAR, 0,  TMT_SIZINGMARGINS);

	rcClient.DeflateRect(rcMargins);

	int dxBlock = pClassProgress->GetThemeInt(0, 0, TMT_PROGRESSCHUNKSIZE, rcClient.Height() * 2 / 3);
	int dxSpace = pClassProgress->GetThemeInt(0, 0, TMT_PROGRESSSPACESIZE, 2);

	if (dxBlock == 1 && dxSpace == 0)
		dxBlock = 8;

	m_nMarqueePos += (dxBlock + dxSpace) * nStep;

	if (m_nMarqueePos > rcClient.right)
		m_nMarqueePos = rcClient.left + m_nMarqueePos - rcClient.right;

	Invalidate(FALSE);
}
void CXTPSkinObjectProgress::OnDraw(CDC* pDC)
{
	CRect rcClient;
	GetClientRect(&rcClient);

	CXTPBufferDC dcMem(*pDC, rcClient);

	dcMem.FillSolidRect(rcClient, GetColor(COLOR_3DFACE));

	DWORD dwStyle = GetStyle();
	BOOL bVert = dwStyle & PBS_VERTICAL;
	int nBarPart = bVert ? PP_BARVERT : PP_BAR;
	int nChunkPart = bVert ? PP_CHUNKVERT : PP_CHUNK;

	CXTPSkinManagerClass* pClassProgress = GetSkinClass();
	pClassProgress->DrawThemeBackground(&dcMem, nBarPart, 0,  rcClient);

	CRect rc = rcClient;

	CRect rcMargins = pClassProgress->GetThemeRect(nBarPart, 0,  TMT_SIZINGMARGINS);

	rc.DeflateRect(rcMargins);

	int iWidth, dxBlock;

	if (GetStyle() & PBS_MARQUEE)
	{
		rcClient = rc;

		dxBlock = pClassProgress->GetThemeInt(0, 0, TMT_PROGRESSCHUNKSIZE, rc.Height() * 2 / 3);
		int dxSpace = pClassProgress->GetThemeInt(0, 0, TMT_PROGRESSSPACESIZE, 2);

		rc.left = m_nMarqueePos + rcClient.left;

		if (dxBlock == 1 && dxSpace == 0)
		{
			dxBlock = 8;

			rc.right = rc.left + 5 * dxBlock;

			if (rc.right > rcClient.right)
			{
				CRect rcPart(rcClient.left, rc.top, rcClient.left + rc.right - rcClient.right, rc.bottom);
				pClassProgress->DrawThemeBackground(&dcMem, nChunkPart, 0,  rcPart);

				rc.right = rcClient.right;
			}

			pClassProgress->DrawThemeBackground(&dcMem, nChunkPart, 0,  rc);
			return;
		}

		for (int i = 0; i < 5; i++)
		{
			if (rc.left >= rcClient.right)
				rc.left = rcClient.left;

			rc.right = rc.left + dxBlock;

			if (rc.right > rcClient.right)
				rc.right = rcClient.right;

			pClassProgress->DrawThemeBackground(&dcMem, nChunkPart, 0,  rc);
			rc.left = rc.right + dxSpace;
		}
		return;
	}

	PBRANGE range;
	SendMessage(PBM_GETRANGE, (WPARAM) FALSE, (LPARAM) &range);

	int iLow = range.iLow;
	int iHigh = range.iHigh;
	int iPos =  (int)SendMessage(PBM_GETPOS);


	if (bVert)
	{
		iWidth = rc.Height();
		dxBlock = (rcClient.right - rcClient.left) * 2 / 3;
	}
	else
	{
		iWidth = rc.Width();
		dxBlock = (rcClient.bottom - rcClient.top) * 2 / 3;
	}

	int x = MulDiv(iWidth, iPos - iLow, iHigh - iLow);

	dxBlock = pClassProgress->GetThemeInt(0, 0, TMT_PROGRESSCHUNKSIZE, dxBlock);
	int dxSpace = pClassProgress->GetThemeInt(0, 0, TMT_PROGRESSSPACESIZE, 2);


	if (dxBlock == 0)
		dxBlock = 1;

	if (dxBlock == 1 && dxSpace == 0)
	{
		if (bVert)
		{
			rc.top = rc.bottom - x;
		}
		else
		{
			rc.right = rc.left + x;
		}
		pClassProgress->DrawThemeBackground(&dcMem, nChunkPart, 0,  rc);
		return;
	}

	int nBlocks = (x + (dxBlock + dxSpace) - 1) / (dxBlock + dxSpace);

	for (int i = 0; i < nBlocks; i++)
	{
		if (bVert)
		{
			rc.top = rc.bottom - dxBlock;

			if (rc.bottom <= rcClient.top)
				break;

			if (rc.top <= rcClient.top)
				rc.top = rcClient.top + 1;

		}
		else
		{
			rc.right = rc.left + dxBlock;

			if (rc.left >= rcClient.right)
				break;

			if (rc.right >= rcClient.right)
				rc.right = rcClient.right - 1;
		}

		pClassProgress->DrawThemeBackground(&dcMem, nChunkPart, 0,  rc);


		if (bVert)
			rc.bottom = rc.top - dxSpace;
		else
			rc.left = rc.right + dxSpace;
	}
}