You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
357 lines
8.0 KiB
C++
357 lines
8.0 KiB
C++
2 years ago
|
// XTPSkinObjectProgress.cpp: implementation of the CXTPSkinObjectProgress class.
|
||
|
//
|
||
|
// This file is a part of the XTREME SKINFRAMEWORK MFC class library.
|
||
|
// (c)1998-2012 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/XTPWinThemeWrapper.h"
|
||
|
#include "Common/XTPDrawHelpers.h"
|
||
|
|
||
|
#include "XTPSkinObject.h"
|
||
|
#include "XTPSkinObjectFrame.h"
|
||
|
#include "XTPSkinObjectProgress.h"
|
||
|
#include "XTPSkinManager.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[]=__FILE__;
|
||
|
#define new DEBUG_NEW
|
||
|
#endif
|
||
|
|
||
|
#ifndef PBS_MARQUEE
|
||
|
#define PBS_MARQUEE 0x08
|
||
|
#endif
|
||
|
|
||
|
#ifndef PBM_SETMARQUEE
|
||
|
#define PBM_SETMARQUEE (WM_USER+10)
|
||
|
#endif
|
||
|
|
||
|
#define TID_TIMER 102
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPSkinObjectProgress
|
||
|
IMPLEMENT_DYNCREATE(CXTPSkinObjectProgress, CXTPSkinObjectFrame)
|
||
|
|
||
|
CXTPSkinObjectProgress::CXTPSkinObjectProgress()
|
||
|
{
|
||
|
m_strClassName = _T("PROGRESS");
|
||
|
|
||
|
m_nMarqueePos = 0;
|
||
|
m_nMarqueeDelay = 0;
|
||
|
}
|
||
|
|
||
|
CXTPSkinObjectProgress::~CXTPSkinObjectProgress()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CXTPSkinObjectProgress, CXTPSkinObjectFrame)
|
||
|
//{{AFX_MSG_MAP(CXTPSkinObjectProgress)
|
||
|
ON_WM_ERASEBKGND()
|
||
|
ON_WM_PAINT()
|
||
|
ON_WM_CREATE()
|
||
|
ON_MESSAGE(WM_PRINTCLIENT, OnPrintClient)
|
||
|
ON_MESSAGE(PBM_SETMARQUEE, OnStartMarquee)
|
||
|
ON_MESSAGE(PBM_STEPIT, OnStepIt)
|
||
|
ON_MESSAGE(PBM_SETPOS, OnSetPos)
|
||
|
ON_WM_TIMER()
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPSkinObjectProgress message handlers
|
||
|
|
||
|
|
||
|
int CXTPSkinObjectProgress::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
||
|
{
|
||
|
if (CXTPSkinObjectFrame::OnCreate(lpCreateStruct) == -1)
|
||
|
return -1;
|
||
|
|
||
|
if ((GetExStyle() & WS_EX_STATICEDGE) && m_pManager->IsEnabled())
|
||
|
{
|
||
|
ModifyStyleEx(WS_EX_STATICEDGE, 0);
|
||
|
SetWindowPos(NULL, 0,0,0,0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void CXTPSkinObjectProgress::OnSkinChanged(BOOL bPrevState, BOOL bNewState)
|
||
|
{
|
||
|
CXTPSkinObjectFrame::OnSkinChanged(bPrevState, bNewState);
|
||
|
|
||
|
BOOL bRemovedStaticEdge = m_pManager->IsEnabled() || CXTPWinThemeWrapper().IsThemeActive();
|
||
|
BOOL bStaticEdgeRemoved = (GetExStyle() & WS_EX_STATICEDGE) == 0;
|
||
|
|
||
|
if (bStaticEdgeRemoved != bRemovedStaticEdge)
|
||
|
{
|
||
|
if (bRemovedStaticEdge)
|
||
|
ModifyStyleEx(WS_EX_STATICEDGE, 0);
|
||
|
else
|
||
|
ModifyStyleEx(0, WS_EX_STATICEDGE);
|
||
|
|
||
|
SetWindowPos(NULL, 0,0,0,0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BOOL CXTPSkinObjectProgress::OnEraseBkgnd(CDC* /*pDC*/)
|
||
|
{
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
LRESULT CXTPSkinObjectProgress::OnPrintClient(WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
if ((lParam & PRF_CLIENT) == 0)
|
||
|
return Default();
|
||
|
|
||
|
CDC* pDC = CDC::FromHandle((HDC)wParam);
|
||
|
if (pDC) OnDraw(pDC);
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
void CXTPSkinObjectProgress::OnPaint()
|
||
|
{
|
||
|
CXTPSkinObjectPaintDC dc(this); // device context for painting
|
||
|
OnDraw(&dc);
|
||
|
}
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
LRESULT CXTPSkinObjectProgress::OnStepIt(WPARAM /*wParam*/, LPARAM /*lParam*/)
|
||
|
{
|
||
|
if (((GetStyle() & PBS_MARQUEE) == 0))
|
||
|
return Default();
|
||
|
|
||
|
DoStep(1);
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
LRESULT CXTPSkinObjectProgress::OnSetPos(WPARAM /*wParam*/, LPARAM /*lParam*/)
|
||
|
{
|
||
|
LRESULT lResult = Default();
|
||
|
|
||
|
Invalidate(FALSE);
|
||
|
return lResult;
|
||
|
}
|
||
|
|
||
|
|
||
|
LRESULT CXTPSkinObjectProgress::OnStartMarquee(WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
m_nMarqueePos = 0;
|
||
|
m_nMarqueeDelay = 0;
|
||
|
|
||
|
if (((GetStyle() & PBS_MARQUEE) == 0))
|
||
|
return Default();
|
||
|
|
||
|
BOOL bMarquee = wParam && (lParam > 0);
|
||
|
m_nMarqueePos = 0;
|
||
|
|
||
|
KillTimer(TID_TIMER);
|
||
|
|
||
|
if (bMarquee)
|
||
|
{
|
||
|
m_nMarqueeDelay = (UINT)lParam;
|
||
|
SetTimer(TID_TIMER, m_nMarqueeDelay, NULL);
|
||
|
}
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
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::OnTimer(UINT_PTR nIDEvent)
|
||
|
{
|
||
|
if (nIDEvent == TID_TIMER && (GetStyle() & PBS_MARQUEE))
|
||
|
{
|
||
|
DoStep(m_nMarqueeDelay > 50 ? 1 : 2);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
CWnd::OnTimer(nIDEvent);
|
||
|
}
|