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.

283 lines
6.4 KiB
C++

2 years ago
// XTPControlScrollBar.cpp : implementation of the CXTPControlScrollBar class.
//
// This file is a part of the XTREME COMMANDBARS 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/XTPPropExchange.h"
#include "Common/XTPSystemHelpers.h"
#include "Common/XTPColorManager.h"
#include "Common/XTPHookManager.h"
#include "XTPCommandBarsDefines.h"
#include "XTPControl.h"
#include "XTPScrollBase.h"
#include "XTPControlScrollBar.h"
#include "XTPPaintManager.h"
#include "XTPCommandBar.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_XTP_CONTROL(CXTPControlScrollBar, CXTPControl)
CXTPControlScrollBar::CXTPControlScrollBar()
{
m_nWidth = 150;
m_spi.fVert = FALSE;
m_nMax = 100;
m_nMin = 0;
m_nPos = 0;
m_nPage = 0;
m_bInScroll = FALSE;
m_scrollBarStyle = xtpScrollStyleDefault;
}
CXTPControlScrollBar::~CXTPControlScrollBar()
{
}
void CXTPControlScrollBar::Copy(CXTPControl* pControl, BOOL bRecursive)
{
CXTPControl::Copy(pControl, bRecursive);
CXTPControlScrollBar* pControlScrollBar = DYNAMIC_DOWNCAST(CXTPControlScrollBar, pControl);
if (!pControlScrollBar)
return;
SetRange(pControlScrollBar->m_nMin, pControlScrollBar->m_nMax);
SetPos(pControlScrollBar->GetPos());
m_nPage = pControlScrollBar->m_nPage;
m_scrollBarStyle = pControlScrollBar->m_scrollBarStyle;
}
void CXTPControlScrollBar::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);
PX_Enum(pPX, _T("ScrollBarStyle"), m_scrollBarStyle, xtpScrollStyleDefault);
}
CSize CXTPControlScrollBar::GetSize(CDC* /*pDC*/)
{
if (m_spi.fVert)
{
return CSize(GetScrollBarPaintManager()->m_cxVScroll + 4, GetWidth());
}
return CSize(GetWidth(), GetScrollBarPaintManager()->m_cyHScroll + 4);
}
void CXTPControlScrollBar::Draw(CDC* pDC)
{
if (!m_pSBTrack || !m_pSBTrack->bTrackThumb)
SetupScrollInfo();
GetScrollBarPaintManager()->DrawScrollBar(pDC, this);
}
void CXTPControlScrollBar::SetPos(int nPos)
{
if (m_pSBTrack != NULL && !m_bInScroll)
return;
m_nPos = nPos;
RedrawParent(FALSE);
}
int CXTPControlScrollBar::GetPos() const
{
return m_nPos;
}
void CXTPControlScrollBar::SetRange( int nMin, int nMax)
{
if ((m_nMin != nMin) || (m_nMax != nMax))
{
m_nMin = nMin;
m_nMax = nMax;
RedrawParent(FALSE);
}
}
BOOL CXTPControlScrollBar::HasFocus() const
{
return m_pSBTrack != NULL;
}
void CXTPControlScrollBar::OnCalcDynamicSize(DWORD dwMode)
{
m_spi.fVert = (dwMode & LM_VERTDOCK);
}
void CXTPControlScrollBar::OnClick(BOOL bKeyboard, CPoint point)
{
if (IsCustomizeMode() && !bKeyboard)
{
CustomizeStartDrag(point);
}
else if (!bKeyboard)
{
m_pParent->SetPopuped(-1);
if (m_pParent->IsTrackingMode() == TRUE_POPUP) m_pParent->SetTrackingMode(TRUE, FALSE, FALSE);
m_pParent->SetSelected(GetIndex());
PerformTrackInit(m_pParent->m_hWnd, point, &m_spi, (GetKeyState(VK_SHIFT) < 0) ? TRUE : FALSE);
}
}
void CXTPControlScrollBar::OnScroll(UINT nSBCode, UINT nPos)
{
int nCurPos = GetPos();
switch (nSBCode)
{
case SB_TOP: nCurPos = m_nMin; break;
case SB_BOTTOM: nCurPos = m_nMax; break;
case SB_LINEUP: nCurPos = max(nCurPos - 1, m_nMin); break;
case SB_LINEDOWN: nCurPos = min(nCurPos + 1, m_nMax); break;
case SB_THUMBTRACK: nCurPos = nPos; break;
case SB_PAGEUP: nCurPos = max(nCurPos - m_nMax / 10, m_nMin); break;
case SB_PAGEDOWN: nCurPos = min(nCurPos + m_nMax / 10, m_nMax); break;
}
if (nCurPos == m_nPos)
return;
m_nPos = nCurPos;
RedrawParent(FALSE);
NotifySite(CBN_XTP_EXECUTE);
}
//////////////////////////////////////////////////////////////////////////
// CXTPControlScrollBar::Base
CRect CXTPControlScrollBar::GetScrollBarRect()
{
CRect rcItem(GetRect());
rcItem.DeflateRect(2, 2, 2, 2);
if (m_pParent->GetType() == xtpBarTypePopup && m_pParent->GetPosition() == xtpBarPopup)
{
CXTPPaintManager* pPaintManager = GetPaintManager();
rcItem.left += pPaintManager->GetPopupBarGripperWidth(GetParent())
+ pPaintManager->m_nPopupBarTextPadding - 2;
}
return rcItem;
}
void CXTPControlScrollBar::GetScrollInfo(SCROLLINFO* psi)
{
psi->cbSize = sizeof(SCROLLINFO);
psi->fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
psi->nMax = m_nMax;
psi->nMin = m_nMin;
psi->nPage = m_nPage;
psi->nPos = m_nPos;
}
BOOL CXTPControlScrollBar::IsScrollBarEnabled() const
{
return GetEnabled();
}
CWnd* CXTPControlScrollBar::GetParentWindow() const
{
return m_pParent;
}
CXTPScrollBarPaintManager* CXTPControlScrollBar::GetScrollBarPaintManager() const
{
return m_scrollBarStyle == xtpScrollStyleSlider ?
(CXTPScrollBarPaintManager*)GetPaintManager()->GetSliderPaintManager() :
(CXTPScrollBarPaintManager*)GetPaintManager()->GetGalleryPaintManager();
}
void CXTPControlScrollBar::DoScroll(int cmd, int pos)
{
m_bInScroll = TRUE;
CWnd* pParent = GetParent()->GetOwnerSite();
NMXTPSCROLL nmScroll;
nmScroll.hdr.code = XTP_SBN_SCROLL;
nmScroll.hdr.idFrom = GetID();
nmScroll.hdr.hwndFrom = GetParent()->GetSafeHwnd();
nmScroll.pSender = this;
nmScroll.nPos = pos;
nmScroll.nSBCode = cmd;
LRESULT lResult = 0;
AFX_NOTIFY notify;
notify.pResult = &lResult;
notify.pNMHDR = (NMHDR*)&nmScroll.hdr;
pParent->OnCmdMsg(GetID(), MAKELONG(XTP_SBN_SCROLL, WM_NOTIFY), &notify, NULL);
m_bInScroll = FALSE;
if (*notify.pResult)
return;
OnScroll(cmd, pos);
}
void CXTPControlScrollBar::RedrawScrollBar()
{
RedrawParent(FALSE);
}
void CXTPControlScrollBar::OnMouseMove(CPoint point)
{
int ht = HitTestScrollBar(point);
if (ht != m_spi.ht)
{
m_spi.ht = ht;
RedrawParent(FALSE);
}
}