www.gusucode.com > VC++自定义图表控件及使用例子源码程序 > VC++自定义图表控件及使用例子源码程序\code\ChartCtrl_demo\ChartDemo\ChartCtrl\ChartScrollBar.cpp
//Download by http://www.NewXing.com /* * * ChartScrollBar.h * * Written by C閐ric Moonen (cedric_moonen@hotmail.com) * * * * This code may be used for any non-commercial and commercial purposes in a compiled form. * The code may be redistributed as long as it remains unmodified and providing that the * author name and this disclaimer remain intact. The sources can be modified WITH the author * consent only. * * This code is provided without any garanties. I cannot be held responsible for the damage or * the loss of time it causes. Use it at your own risks * * An e-mail to notify me that you are using this code is appreciated also. * * */ #include "stdafx.h" #include "ChartScrollBar.h" #include "ChartAxis.h" #include "ChartCtrl.h" #include "math.h" CChartScrollBar::CChartScrollBar(CChartAxis* pParentAxis) : CScrollBar(), m_pParentAxis(pParentAxis), m_bEnabled(false), m_bAutoHide(true) { } CChartScrollBar::~CChartScrollBar() { } void CChartScrollBar::CreateScrollBar(const CRect& PlottingRect) { CRect Temp = PlottingRect; Temp.top++; Temp.left++; DWORD dwStyle = SBS_HORZ | WS_CHILD; if (m_pParentAxis->IsHorizontal()) { if (m_pParentAxis->IsSecondary()) dwStyle |= SBS_TOPALIGN; else dwStyle += SBS_BOTTOMALIGN; } else { if (m_pParentAxis->IsSecondary()) dwStyle |= SBS_VERT | SBS_RIGHTALIGN; else dwStyle += SBS_VERT | SBS_LEFTALIGN; } CScrollBar::Create(dwStyle, Temp, m_pParentAxis->m_pParentCtrl,100); SCROLLINFO info; info.cbSize = sizeof(SCROLLINFO); info.fMask = SIF_ALL; info.nMin = 1; info.nMax = 1; info.nPage = 1; info.nPos = 1; CScrollBar::SetScrollInfo(&info); } bool CChartScrollBar::IsScrollInverted() const { bool bInverted = false; if (m_pParentAxis->IsInverted() && m_pParentAxis->IsHorizontal()) bInverted = true; if (!m_pParentAxis->IsInverted() && !m_pParentAxis->IsHorizontal()) bInverted = true; return bInverted; } void CChartScrollBar::Refresh() { int iTotalSteps = 0; int iCurrentStep = 0; m_pParentAxis->GetScrollbarSteps(iTotalSteps,iCurrentStep); SCROLLINFO info; info.cbSize = sizeof(SCROLLINFO); info.fMask = SIF_ALL; info.nMin = 0; info.nMax = iTotalSteps-1; info.nPage = 10; info.nPos = iCurrentStep; if (IsScrollInverted()) info.nPos = iTotalSteps - 9 - iCurrentStep; else info.nPos = iCurrentStep; CScrollBar::SetScrollInfo(&info); } void CChartScrollBar::OnHScroll(UINT nSBCode, UINT nPos) { int MinPos; int MaxPos; int PreviousPos = CScrollBar::GetScrollPos(); CScrollBar::GetScrollRange(&MinPos, &MaxPos); int CurPos = PreviousPos; bool bUpdate = true; switch (nSBCode) { case SB_LEFT: CurPos = 0; break; case SB_RIGHT: CurPos = MaxPos; break; case SB_ENDSCROLL: bUpdate = false; break; case SB_LINELEFT: if (CurPos > MinPos) CurPos--; break; case SB_LINERIGHT: if (CurPos < MaxPos-9) CurPos++; break; case SB_PAGELEFT: if (CurPos > MinPos) CurPos = max(MinPos, CurPos - 10); break; case SB_PAGERIGHT: if (CurPos < MaxPos-9) CurPos = min(MaxPos, CurPos + 10); break; case SB_THUMBPOSITION: CurPos = nPos; break; case SB_THUMBTRACK: CurPos = nPos; break; } if (bUpdate) { // Set the new position of the thumb (scroll box). CScrollBar::SetScrollPos(CurPos); MoveAxisToPos(PreviousPos,CurPos); } } void CChartScrollBar::OnVScroll(UINT nSBCode, UINT nPos) { int MinPos; int MaxPos; int PreviousPos = CScrollBar::GetScrollPos(); CScrollBar::GetScrollRange(&MinPos, &MaxPos); int CurPos = PreviousPos; bool bUpdate = true; switch (nSBCode) { case SB_BOTTOM: CurPos = MaxPos; break; case SB_TOP: CurPos = 0; break; case SB_ENDSCROLL: bUpdate = false; break; case SB_LINEDOWN: if (CurPos < MaxPos-9) CurPos++; break; case SB_LINEUP: if (CurPos > MinPos) CurPos--; break; case SB_PAGEUP: if (CurPos > MinPos) CurPos = max(MinPos, CurPos - 10); break; case SB_PAGEDOWN: if (CurPos < MaxPos-9) CurPos = min(MaxPos, CurPos + 10); break; case SB_THUMBPOSITION: CurPos = nPos; break; case SB_THUMBTRACK: CurPos = nPos; break; } if (bUpdate) { // Set the new position of the thumb (scroll box). CScrollBar::SetScrollPos(CurPos); MoveAxisToPos(PreviousPos,CurPos); } } void CChartScrollBar::MoveAxisToPos(int PreviousPos, int CurPos) { m_pParentAxis->SetAxisToScrollStep(PreviousPos,CurPos,IsScrollInverted()); } void CChartScrollBar::OnMouseEnter() { if (m_bEnabled && m_bAutoHide) ShowWindow(SW_SHOW); } void CChartScrollBar::OnMouseLeave() { if (m_bEnabled && m_bAutoHide) ShowWindow(SW_HIDE); }