XTPControlProgress.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:6k
- // XTPControlProgress.cpp : implementation of the CXTPControlProgress class.
- //
- // This file is a part of the XTREME COMMANDBARS MFC class library.
- // (c)1998-2008 Codejock Software, All Rights Reserved.
- //
- // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
- // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
- // CONSENT OF CODEJOCK SOFTWARE.
- //
- // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
- // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
- // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
- // SINGLE COMPUTER.
- //
- // CONTACT INFORMATION:
- // support@codejock.com
- // http://www.codejock.com
- //
- /////////////////////////////////////////////////////////////////////////////
- #include "stdafx.h"
- #include "Common/XTPDrawHelpers.h"
- #include "Common/XTPColorManager.h"
- #include "Common/XTPPropExchange.h"
- #include "XTPControlProgress.h"
- #include "XTPPaintManager.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- CXTPProgressBase::CXTPProgressBase()
- {
- m_nMin = 0;
- m_nMax = 100;
- m_nPos = 0;
- }
- CXTPProgressBase::~CXTPProgressBase()
- {
- }
- void CXTPProgressBase::GetRange(int& nLower, int& nUpper) const
- {
- nLower = m_nMin;
- nUpper = m_nMax;
- }
- void CXTPProgressBase::SetRange(int nLower, int nUpper)
- {
- if (m_nMin != nLower || m_nMax != nUpper)
- {
- m_nMin = nLower;
- m_nMax = nUpper;
- RedrawProgress();
- }
- }
- void CXTPProgressBase::SetPos(int nPos)
- {
- if (nPos < m_nMin) nPos = m_nMin;
- if (nPos > m_nMax) nPos = m_nMax;
- if (m_nPos != nPos)
- {
- m_nPos = nPos;
- RedrawProgress();
- }
- }
- IMPLEMENT_XTP_CONTROL(CXTPControlProgress, CXTPControl)
- CXTPControlProgress::CXTPControlProgress()
- {
- m_nWidth = 100;
- }
- CSize CXTPControlProgress::GetSize(CDC* /*pDC*/)
- {
- return CSize(m_nWidth, m_nHeight > 0 ? m_nHeight : GetProgressPaintManager()->m_cyProgress);
- }
- void CXTPControlProgress::Draw(CDC* pDC)
- {
- GetProgressPaintManager()->DrawProgress(pDC, this);
- }
- void CXTPControlProgress::RedrawProgress()
- {
- RedrawParent(FALSE);
- }
- CXTPProgressPaintManager* CXTPControlProgress::GetProgressPaintManager() const
- {
- return GetPaintManager()->GetProgressPaintManager();
- }
- CRect CXTPControlProgress::GetProgressRect()
- {
- return GetRect();
- }
- void CXTPControlProgress::Copy(CXTPControl* pControl, BOOL bRecursive)
- {
- CXTPControl::Copy(pControl, bRecursive);
- CXTPControlProgress* pControlProgress = DYNAMIC_DOWNCAST(CXTPControlProgress, pControl);
- if (!pControlProgress)
- return;
- SetRange(pControlProgress->m_nMin, pControlProgress->m_nMax);
- SetPos(pControlProgress->GetPos());
- }
- void CXTPControlProgress::DoPropExchange(CXTPPropExchange* pPX)
- {
- CXTPControl::DoPropExchange(pPX);
- PX_Int(pPX, _T("Min"), m_nMin, 0);
- PX_Int(pPX, _T("Max"), m_nMax, 100);
- PX_Int(pPX, _T("Pos"), m_nPos, 0);
- }
- //////////////////////////////////////////////////////////////////////////
- // CXTPProgressPaintManager
- CXTPProgressPaintManager::CXTPProgressPaintManager(CXTPPaintManager* pPaintManager)
- {
- m_pPaintManager = pPaintManager;
- m_cyProgress = 16;
- }
- CXTPProgressPaintManager::~CXTPProgressPaintManager()
- {
- }
- void CXTPProgressPaintManager::RefreshMetrics()
- {
- m_themeProgress.OpenTheme(0, L"PROGRESS");
- }
- void CXTPProgressPaintManager::DrawProgress(CDC* pDC, CXTPProgressBase* pProgressBar)
- {
- CRect rc(pProgressBar->GetProgressRect());
- XTPPaintTheme theme = GetPaintManager()->BaseTheme();
- BOOL bThemed = (theme != xtpThemeOffice2000) && (theme != xtpThemeOfficeXP) && m_themeProgress.IsAppThemed();
- BOOL bVertical = FALSE;
- int nLower, nUpper, nPos;
- pProgressBar->GetRange(nLower, nUpper);
- nPos = pProgressBar->GetPos();
- int nWidth, dxBlock;
- CRect rcClient(rc);
- if (!bThemed)
- rcClient.DeflateRect(2, 2);
- else if (bVertical)
- rcClient.DeflateRect(3, 4);
- else
- rcClient.DeflateRect(4, 3);
- if (bVertical)
- {
- nWidth = rcClient.bottom - rcClient.top;
- dxBlock = (rcClient.right - rcClient.left) * 2 / 3;
- }
- else
- {
- nWidth = rcClient.right - rcClient.left;
- dxBlock = (rcClient.bottom - rcClient.top) * 2 / 3;
- }
- int x = MulDiv(nWidth, nPos - nLower, nUpper - nLower);
- if (!bThemed)
- {
- pDC->FillSolidRect(rc, GetXtremeColor(COLOR_BTNFACE));
- pDC->Draw3dRect(rc, GetXtremeColor(COLOR_3DSHADOW), GetXtremeColor(COLOR_3DSHADOW));
- if (rcClient.Width() < 2)
- return;
- pDC->FillSolidRect(rcClient.left, rcClient.top, x, rcClient.Height(), GetXtremeColor(COLOR_HIGHLIGHT));
- }
- else
- {
- m_themeProgress.DrawThemeBackground(*pDC, bVertical ? PP_BARVERT : PP_BAR, 0, rc, NULL);
- int dxSpace = 2;
- if (bThemed)
- {
- m_themeProgress.GetThemeInt(0, 0, TMT_PROGRESSCHUNKSIZE, &dxBlock);
- m_themeProgress.GetThemeInt(0, 0, TMT_PROGRESSSPACESIZE, &dxSpace);
- }
- rc = rcClient;
- if (dxBlock == 0)
- dxBlock = 1; // avoid div by zero
- int nBlocks = (x + (dxBlock + dxSpace) - 1) / (dxBlock + dxSpace); // round up
- for (int i = 0; i < nBlocks; i++)
- {
- if (bVertical)
- {
- rc.top = rc.bottom - dxBlock;
- // are we past the end?
- if (rc.bottom <= rcClient.top)
- break;
- if (rc.top <= rcClient.top)
- rc.top = rcClient.top + 1;
- }
- else
- {
- rc.right = rc.left + dxBlock;
- // are we past the end?
- if (rc.left >= rcClient.right)
- break;
- if (rc.right >= rcClient.right)
- rc.right = rcClient.right - 1;
- }
- m_themeProgress.DrawThemeBackground(*pDC, bVertical ? PP_CHUNKVERT : PP_CHUNK, 0, rc, NULL);
- if (bVertical)
- {
- rc.bottom = rc.top - dxSpace;
- }
- else
- {
- rc.left = rc.right + dxSpace;
- }
- }
- }
- }