nim_duilib/duilib/Control/ScrollBar.cpp
jiajia_deng 4933d1f2bc Remove dependency on shared
Signed-off-by: jiajia_deng <2894220@gmail.com>
2019-09-20 16:27:58 +08:00

893 lines
24 KiB
C++

#include "stdafx.h"
#include "ScrollBar.h"
namespace ui
{
ScrollBar::ScrollBar() :
m_bHorizontal(false),
m_bShowButton1(true),
m_bShowButton2(true),
m_bAutoHide(true),
m_nRange(100),
m_nScrollPos(0),
m_nLineSize(8),
m_nThumbMinLength(30),
m_nLastScrollPos(0),
m_nLastScrollOffset(0),
m_nScrollRepeatDelay(0),
m_pOwner(nullptr),
m_ptLastMouse(),
m_rcButton1(0, 0, 0, 0),
m_rcButton2(0, 0, 0, 0),
m_rcThumb(0, 0, 0, 0),
m_uButton1State(kControlStateNormal),
m_uButton2State(kControlStateNormal),
m_uThumbState(kControlStateNormal),
m_sImageModify(),
m_bkStateImage(),
m_button1StateImage(),
m_button2StateImage(),
m_thumbStateImage(),
m_railStateImage(),
m_weakFlagOwner()
{
m_cxyFixed.cx = DEFAULT_SCROLLBAR_SIZE;
m_cxyFixed.cy = 0;
m_ptLastMouse.x = m_ptLastMouse.y = 0;
m_bkStateImage.SetControl(this);
m_thumbStateImage.SetControl(this);
m_bFloat = true;
SetNeedButtonUpWhenKillFocus(true);
}
Box* ScrollBar::GetOwner() const
{
return m_pOwner;
}
void ScrollBar::SetOwner(ScrollableBox* pOwner)
{
m_pOwner = pOwner;
}
void ScrollBar::SetEnabled(bool bEnable)
{
Control::SetEnabled(bEnable);
if( bEnable ) {
m_uButton1State = kControlStateNormal;
m_uButton2State = kControlStateNormal;
m_uThumbState = kControlStateNormal;
}
else {
m_uButton1State = kControlStateDisabled;
m_uButton2State = kControlStateDisabled;
m_uThumbState = kControlStateDisabled;
}
}
void ScrollBar::SetFocus()
{
if (m_pOwner != NULL) m_pOwner->SetFocus();
else Control::SetFocus();
}
void ScrollBar::SetVisible_(bool bVisible)
{
if( m_bVisible == bVisible ) return;
bool v = IsVisible();
m_bVisible = bVisible;
if( m_bFocused ) m_bFocused = false;
if (!bVisible && m_pWindow && m_pWindow->GetFocus() == this) {
m_pWindow->SetFocus(NULL) ;
}
if( IsVisible() != v ) {
ArrangeSelf();
}
}
bool ScrollBar::ButtonUp(EventArgs& msg)
{
bool ret = false;
if( IsMouseFocused() ) {
SetMouseFocused(false);
Invalidate();
UiRect pos = GetPos();
if (::PtInRect(&pos, msg.ptMouse)) {
m_uButtonState = kControlStateHot;
m_nHotAlpha = 255;
Activate();
ret = true;
}
else {
m_uButtonState = kControlStateNormal;
m_nHotAlpha = 0;
}
}
UiRect ownerPos = m_pOwner->GetPos();
if (m_bAutoHide && !::PtInRect(&ownerPos, msg.ptMouse)) {
SetVisible(false);
}
return ret;
}
bool ScrollBar::HasHotState()
{
return true;
}
bool ScrollBar::MouseEnter(EventArgs& msg)
{
bool ret = __super::MouseEnter(msg);
if (ret) {
m_uButton1State = kControlStateHot;
m_uButton2State = kControlStateHot;
m_uThumbState = kControlStateHot;
}
return ret;
}
bool ScrollBar::MouseLeave(EventArgs& msg)
{
bool ret = __super::MouseLeave(msg);
if (ret) {
m_uButton1State = kControlStateNormal;
m_uButton2State = kControlStateNormal;
m_uThumbState = kControlStateNormal;
}
return ret;
}
void ScrollBar::SetPos(UiRect rc)
{
Control::SetPos(rc);
rc = m_rcItem;
if (m_bHorizontal) {
int cx = rc.right - rc.left;
if (m_bShowButton1) cx -= m_cxyFixed.cy;
if (m_bShowButton2) cx -= m_cxyFixed.cy;
if (cx > m_cxyFixed.cy) {
m_rcButton1.left = rc.left;
m_rcButton1.top = rc.top;
if (m_bShowButton1) {
m_rcButton1.right = rc.left + m_cxyFixed.cy;
m_rcButton1.bottom = rc.top + m_cxyFixed.cy;
}
else {
m_rcButton1.right = m_rcButton1.left;
m_rcButton1.bottom = m_rcButton1.top;
}
m_rcButton2.top = rc.top;
m_rcButton2.right = rc.right;
if (m_bShowButton2) {
m_rcButton2.left = rc.right - m_cxyFixed.cy;
m_rcButton2.bottom = rc.top + m_cxyFixed.cy;
}
else {
m_rcButton2.left = m_rcButton2.right;
m_rcButton2.bottom = m_rcButton2.top;
}
m_rcThumb.top = rc.top;
m_rcThumb.bottom = rc.top + m_cxyFixed.cy;
if (m_nRange > 0) {
int cxThumb = cx * (rc.right - rc.left) / (m_nRange + rc.right - rc.left);
if (cxThumb < m_nThumbMinLength) cxThumb = m_nThumbMinLength;
m_rcThumb.left = m_nScrollPos * (cx - cxThumb) / m_nRange + m_rcButton1.right;
m_rcThumb.right = m_rcThumb.left + cxThumb;
if (m_rcThumb.right > m_rcButton2.left) {
m_rcThumb.left = m_rcButton2.left - cxThumb;
m_rcThumb.right = m_rcButton2.left;
}
}
else {
m_rcThumb.left = m_rcButton1.right;
m_rcThumb.right = m_rcButton2.left;
}
}
else {
int cxButton = (rc.right - rc.left) / 2;
if (cxButton > m_cxyFixed.cy) cxButton = m_cxyFixed.cy;
m_rcButton1.left = rc.left;
m_rcButton1.top = rc.top;
if (m_bShowButton1) {
m_rcButton1.right = rc.left + cxButton;
m_rcButton1.bottom = rc.top + m_cxyFixed.cy;
}
else {
m_rcButton1.right = m_rcButton1.left;
m_rcButton1.bottom = m_rcButton1.top;
}
m_rcButton2.top = rc.top;
m_rcButton2.right = rc.right;
if (m_bShowButton2) {
m_rcButton2.left = rc.right - cxButton;
m_rcButton2.bottom = rc.top + m_cxyFixed.cy;
}
else {
m_rcButton2.left = m_rcButton2.right;
m_rcButton2.bottom = m_rcButton2.top;
}
::ZeroMemory(&m_rcThumb, sizeof(m_rcThumb));
}
}
else {
int cy = rc.bottom - rc.top;
if (m_bShowButton1) cy -= m_cxyFixed.cx;
if (m_bShowButton2) cy -= m_cxyFixed.cx;
if (cy > m_cxyFixed.cx) {
m_rcButton1.left = rc.left;
m_rcButton1.top = rc.top;
if (m_bShowButton1) {
m_rcButton1.right = rc.left + m_cxyFixed.cx;
m_rcButton1.bottom = rc.top + m_cxyFixed.cx;
}
else {
m_rcButton1.right = m_rcButton1.left;
m_rcButton1.bottom = m_rcButton1.top;
}
m_rcButton2.left = rc.left;
m_rcButton2.bottom = rc.bottom;
if (m_bShowButton2) {
m_rcButton2.top = rc.bottom - m_cxyFixed.cx;
m_rcButton2.right = rc.left + m_cxyFixed.cx;
}
else {
m_rcButton2.top = m_rcButton2.bottom;
m_rcButton2.right = m_rcButton2.left;
}
m_rcThumb.left = rc.left;
m_rcThumb.right = rc.left + m_cxyFixed.cx;
if (m_nRange > 0) {
int cyThumb = cy * (rc.bottom - rc.top) / (m_nRange + rc.bottom - rc.top);
if (cyThumb < m_nThumbMinLength) cyThumb = m_nThumbMinLength;
m_rcThumb.top = m_nScrollPos * (cy - cyThumb) / m_nRange + m_rcButton1.bottom;
m_rcThumb.bottom = m_rcThumb.top + cyThumb;
if (m_rcThumb.bottom > m_rcButton2.top) {
m_rcThumb.top = m_rcButton2.top - cyThumb;
m_rcThumb.bottom = m_rcButton2.top;
}
}
else {
m_rcThumb.top = m_rcButton1.bottom;
m_rcThumb.bottom = m_rcButton2.top;
}
}
else {
int cyButton = (rc.bottom - rc.top) / 2;
if (cyButton > m_cxyFixed.cx) cyButton = m_cxyFixed.cx;
m_rcButton1.left = rc.left;
m_rcButton1.top = rc.top;
if (m_bShowButton1) {
m_rcButton1.right = rc.left + m_cxyFixed.cx;
m_rcButton1.bottom = rc.top + cyButton;
}
else {
m_rcButton1.right = m_rcButton1.left;
m_rcButton1.bottom = m_rcButton1.top;
}
m_rcButton2.left = rc.left;
m_rcButton2.bottom = rc.bottom;
if (m_bShowButton2) {
m_rcButton2.top = rc.bottom - cyButton;
m_rcButton2.right = rc.left + m_cxyFixed.cx;
}
else {
m_rcButton2.top = m_rcButton2.bottom;
m_rcButton2.right = m_rcButton2.left;
}
::ZeroMemory(&m_rcThumb, sizeof(m_rcThumb));
}
}
}
void ScrollBar::HandleMessage(EventArgs& event)
{
ASSERT(m_pOwner);
if (!IsMouseEnabled() && event.Type > kEventMouseBegin && event.Type < kEventMouseEnd) {
if (m_pOwner != NULL) m_pOwner->HandleMessageTemplate(event);
return;
}
if (event.Type == kEventInternalSetFocus) {
return;
}
else if (event.Type == kEventInternalKillFocus) {
return;
}
else if (event.Type == kEventMouseButtonDown || event.Type == kEventInternalDoubleClick || event.Type == kEventPointDown) {
if (!IsEnabled()) return;
m_nLastScrollOffset = 0;
m_nScrollRepeatDelay = 0;
auto callback = nbase::Bind(&ScrollBar::ScrollTimeHandle, this);
TimerManager::GetInstance()->AddCancelableTimer(m_weakFlagOwner.GetWeakFlag(), callback, 50, TimerManager::REPEAT_FOREVER);
if (::PtInRect(&m_rcButton1, event.ptMouse)) {
m_uButton1State = kControlStatePushed;
if (!m_bHorizontal) {
if (m_pOwner != NULL) m_pOwner->LineUp();
else SetScrollPos(m_nScrollPos - m_nLineSize);
}
else {
if (m_pOwner != NULL) m_pOwner->LineLeft();
else SetScrollPos(m_nScrollPos - m_nLineSize);
}
}
else if (::PtInRect(&m_rcButton2, event.ptMouse)) {
m_uButton2State = kControlStatePushed;
if (!m_bHorizontal) {
if (m_pOwner != NULL) m_pOwner->LineDown();
else SetScrollPos(m_nScrollPos + m_nLineSize);
}
else {
if (m_pOwner != NULL) m_pOwner->LineRight();
else SetScrollPos(m_nScrollPos + m_nLineSize);
}
}
else if (::PtInRect(&m_rcThumb, event.ptMouse)) {
m_uThumbState = kControlStatePushed;
SetMouseFocused(true);
m_ptLastMouse = event.ptMouse;
m_nLastScrollPos = m_nScrollPos;
}
else {
if (!m_bHorizontal) {
if (event.ptMouse.y < m_rcThumb.top) {
if (m_pOwner != NULL) m_pOwner->PageUp();
else SetScrollPos(m_nScrollPos + m_rcItem.top - m_rcItem.bottom);
}
else if (event.ptMouse.y > m_rcThumb.bottom){
if (m_pOwner != NULL) m_pOwner->PageDown();
else SetScrollPos(m_nScrollPos - m_rcItem.top + m_rcItem.bottom);
}
}
else {
if (event.ptMouse.x < m_rcThumb.left) {
if (m_pOwner != NULL) m_pOwner->PageLeft();
else SetScrollPos(m_nScrollPos + m_rcItem.left - m_rcItem.right);
}
else if (event.ptMouse.x > m_rcThumb.right){
if (m_pOwner != NULL) m_pOwner->PageRight();
else SetScrollPos(m_nScrollPos - m_rcItem.left + m_rcItem.right);
}
}
}
ButtonDown(event);
return;
}
else if (event.Type == kEventMouseButtonUp || event.Type == kEventPointUp) {
m_nScrollRepeatDelay = 0;
m_nLastScrollOffset = 0;
m_weakFlagOwner.Cancel();
if (IsMouseFocused()) {
if (::PtInRect(&m_rcItem, event.ptMouse)) {
m_uThumbState = kControlStateHot;
}
else {
m_uThumbState = kControlStateNormal;
}
}
else if (m_uButton1State == kControlStatePushed) {
m_uButton1State = kControlStateNormal;
Invalidate();
}
else if (m_uButton2State == kControlStatePushed) {
m_uButton2State = kControlStateNormal;
Invalidate();
}
ButtonUp(event);
return;
}
else if (event.Type == kEventMouseEnter) {
MouseEnter(event);
}
else if (event.Type == kEventMouseLeave) {
MouseLeave(event);
}
else if (event.Type == kEventMouseMove || event.Type == kEventPointMove) {
if (IsMouseFocused()) {
if (!m_bHorizontal) {
int vRange = m_rcItem.bottom - m_rcItem.top - m_rcThumb.bottom + m_rcThumb.top;
if (m_bShowButton1) {
vRange -= m_cxyFixed.cx;
}
if (m_bShowButton2) {
vRange -= m_cxyFixed.cx;
}
if (vRange != 0)
m_nLastScrollOffset = (event.ptMouse.y - m_ptLastMouse.y) * m_nRange / vRange;
}
else {
int hRange = m_rcItem.right - m_rcItem.left - m_rcThumb.right + m_rcThumb.left;
if (m_bShowButton1) {
hRange -= m_cxyFixed.cy;
}
if (m_bShowButton2) {
hRange -= m_cxyFixed.cy;
}
if (hRange != 0)
m_nLastScrollOffset = (event.ptMouse.x - m_ptLastMouse.x) * m_nRange / hRange;
}
}
return;
}
else if (event.Type == kEventInternalMenu) {
return;
}
else if (event.Type == kEventSetCursor) {
if (m_cursorType == kCursorHand) {
::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(IDC_HAND)));
return;
}
else if (m_cursorType == kCursorArrow){
::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
return;
}
else {
ASSERT(FALSE);
}
}
if (m_pOwner != NULL) m_pOwner->HandleMessageTemplate(event);
}
void ScrollBar::SetAttribute(const std::wstring& strName, const std::wstring& strValue)
{
if (strName == _T("button1normalimage")) SetButton1StateImage(kControlStateNormal, strValue);
else if (strName == _T("button1hotimage")) SetButton1StateImage(kControlStateHot, strValue);
else if (strName == _T("button1pushedimage")) SetButton1StateImage(kControlStatePushed, strValue);
else if (strName == _T("button1disabledimage")) SetButton1StateImage(kControlStateDisabled, strValue);
else if (strName == _T("button2normalimage")) SetButton2StateImage(kControlStateNormal, strValue);
else if (strName == _T("button2hotimage")) SetButton2StateImage(kControlStateHot, strValue);
else if (strName == _T("button2pushedimage")) SetButton2StateImage(kControlStatePushed, strValue);
else if (strName == _T("button2disabledimage")) SetButton2StateImage(kControlStateDisabled, strValue);
else if (strName == _T("thumbnormalimage")) SetThumbStateImage(kControlStateNormal, strValue);
else if (strName == _T("thumbhotimage")) SetThumbStateImage(kControlStateHot, strValue);
else if (strName == _T("thumbpushedimage")) SetThumbStateImage(kControlStatePushed, strValue);
else if (strName == _T("thumbdisabledimage")) SetThumbStateImage(kControlStateDisabled, strValue);
else if (strName == _T("railnormalimage")) SetRailStateImage(kControlStateNormal, strValue);
else if (strName == _T("railhotimage")) SetRailStateImage(kControlStateHot, strValue);
else if (strName == _T("railpushedimage")) SetRailStateImage(kControlStatePushed, strValue);
else if (strName == _T("raildisabledimage")) SetRailStateImage(kControlStateDisabled, strValue);
else if (strName == _T("bknormalimage")) SetBkStateImage(kControlStateNormal, strValue);
else if (strName == _T("bkhotimage")) SetBkStateImage(kControlStateHot, strValue);
else if (strName == _T("bkpushedimage")) SetBkStateImage(kControlStatePushed, strValue);
else if (strName == _T("bkdisabledimage")) SetBkStateImage(kControlStateDisabled, strValue);
else if (strName == _T("hor")) SetHorizontal(strValue == _T("true"));
else if (strName == _T("linesize")) SetLineSize(_ttoi(strValue.c_str()));
else if (strName == _T("thumbminlength")) SetThumbMinLength(_ttoi(strValue.c_str()));
else if (strName == _T("range")) SetScrollRange(_ttoi(strValue.c_str()));
else if (strName == _T("value")) SetScrollPos(_ttoi(strValue.c_str()));
else if (strName == _T("showbutton1")) SetShowButton1(strValue == _T("true"));
else if (strName == _T("showbutton2")) SetShowButton2(strValue == _T("true"));
else if (strName == _T("autohidescroll")) SetAutoHideScroll(strValue == _T("true"));
else Control::SetAttribute(strName, strValue);
}
void ScrollBar::Paint(IRenderContext* pRender, const UiRect& rcPaint)
{
if (!::IntersectRect(&m_rcPaint, &rcPaint, &m_rcItem)) return;
PaintBk(pRender);
PaintButton1(pRender);
PaintButton2(pRender);
PaintThumb(pRender);
PaintRail(pRender);
}
void ScrollBar::ClearImageCache()
{
__super::ClearImageCache();
m_bkStateImage.ClearCache();
m_button1StateImage.ClearCache();
m_button2StateImage.ClearCache();
m_thumbStateImage.ClearCache();
m_railStateImage.ClearCache();
}
bool ScrollBar::IsHorizontal()
{
return m_bHorizontal;
}
void ScrollBar::SetHorizontal(bool bHorizontal)
{
if( m_bHorizontal == bHorizontal ) return;
m_bHorizontal = bHorizontal;
if( m_bHorizontal ) {
if( m_cxyFixed.cy == 0 ) {
m_cxyFixed.cx = 0;
m_cxyFixed.cy = DEFAULT_SCROLLBAR_SIZE;
}
}
else {
if( m_cxyFixed.cx == 0 ) {
m_cxyFixed.cx = DEFAULT_SCROLLBAR_SIZE;
m_cxyFixed.cy = 0;
}
}
if( m_pOwner != NULL )
m_pOwner->Arrange();
else
ArrangeAncestor();
}
int64_t ScrollBar::GetScrollRange() const
{
return m_nRange;
}
void ScrollBar::SetScrollRange(int64_t nRange)
{
if( m_nRange == nRange ) return;
m_nRange = nRange;
if( m_nRange < 0 ) m_nRange = 0;
if( m_nScrollPos > m_nRange ) m_nScrollPos = m_nRange;
if (m_nRange == 0) {
SetVisible_(false);
}
else if (!m_bAutoHide && !IsVisible()) {
SetVisible(true);
}
SetPos(m_rcItem);
}
int64_t ScrollBar::GetScrollPos() const
{
return m_nScrollPos;
}
void ScrollBar::SetScrollPos(int64_t nPos)
{
if( m_nScrollPos == nPos ) return;
m_nScrollPos = nPos;
if( m_nScrollPos < 0 ) m_nScrollPos = 0;
if( m_nScrollPos > m_nRange ) m_nScrollPos = m_nRange;
SetPos(m_rcItem);
}
int ScrollBar::GetLineSize() const
{
return m_nLineSize;
}
void ScrollBar::SetLineSize(int nSize)
{
DpiManager::GetInstance()->ScaleInt(nSize);
m_nLineSize = nSize;
}
int ScrollBar::GetThumbMinLength() const
{
return m_nThumbMinLength;
}
void ScrollBar::SetThumbMinLength(int nThumbMinLength)
{
DpiManager::GetInstance()->ScaleInt(nThumbMinLength);
m_nThumbMinLength = nThumbMinLength;
}
bool ScrollBar::IsShowButton1()
{
return m_bShowButton1;
}
void ScrollBar::SetShowButton1(bool bShow)
{
m_bShowButton1 = bShow;
SetPos(m_rcItem);
}
std::wstring ScrollBar::GetButton1StateImage(ControlStateType stateType)
{
return m_button1StateImage[stateType].imageAttribute.simageString;
}
void ScrollBar::SetButton1StateImage(ControlStateType stateType, const std::wstring& pStrImage)
{
m_button1StateImage[stateType].SetImageString(pStrImage);
Invalidate();
}
bool ScrollBar::IsShowButton2()
{
return m_bShowButton2;
}
void ScrollBar::SetShowButton2(bool bShow)
{
m_bShowButton2 = bShow;
SetPos(m_rcItem);
}
std::wstring ScrollBar::GetButton2StateImage(ControlStateType stateType)
{
return m_button2StateImage[stateType].imageAttribute.simageString;
}
void ScrollBar::SetButton2StateImage(ControlStateType stateType, const std::wstring& pStrImage)
{
m_button2StateImage[stateType].SetImageString(pStrImage);
Invalidate();
}
std::wstring ScrollBar::GetThumbStateImage(ControlStateType stateType)
{
return m_thumbStateImage[stateType].imageAttribute.simageString;
}
void ScrollBar::SetThumbStateImage(ControlStateType stateType, const std::wstring& pStrImage)
{
m_thumbStateImage[stateType].SetImageString(pStrImage);
Invalidate();
}
std::wstring ScrollBar::GetRailStateImage(ControlStateType stateType)
{
return m_railStateImage[stateType].imageAttribute.simageString;
}
void ScrollBar::SetRailStateImage(ControlStateType stateType, const std::wstring& pStrImage)
{
m_railStateImage[stateType].SetImageString(pStrImage);
Invalidate();
}
std::wstring ScrollBar::GetBkStateImage(ControlStateType stateType)
{
return m_bkStateImage[stateType].imageAttribute.simageString;
}
void ScrollBar::SetBkStateImage(ControlStateType stateType, const std::wstring& pStrImage)
{
m_bkStateImage[stateType].SetImageString(pStrImage);
Invalidate();
}
void ScrollBar::SetAutoHideScroll(bool hide)
{
if (m_bAutoHide != hide) {
m_bAutoHide = hide;
}
}
void ScrollBar::ScrollTimeHandle()
{
++m_nScrollRepeatDelay;
if(m_uThumbState == kControlStatePushed) {
if( !m_bHorizontal ) {
if( m_pOwner != NULL ) m_pOwner->SetScrollPos(CSize(m_pOwner->GetScrollPos().cx, \
m_nLastScrollPos + m_nLastScrollOffset));
else SetScrollPos(m_nLastScrollPos + m_nLastScrollOffset);
}
else {
if( m_pOwner != NULL ) m_pOwner->SetScrollPos(CSize(m_nLastScrollPos + m_nLastScrollOffset, \
m_pOwner->GetScrollPos().cy));
else SetScrollPos(m_nLastScrollPos + m_nLastScrollOffset);
}
}
else if( m_uButton1State == kControlStatePushed ) {
if( m_nScrollRepeatDelay <= 5 ) return;
if( !m_bHorizontal ) {
if( m_pOwner != NULL ) m_pOwner->LineUp();
else SetScrollPos(m_nScrollPos - m_nLineSize);
}
else {
if( m_pOwner != NULL ) m_pOwner->LineLeft();
else SetScrollPos(m_nScrollPos - m_nLineSize);
}
}
else if( m_uButton2State == kControlStatePushed ) {
if( m_nScrollRepeatDelay <= 5 ) return;
if( !m_bHorizontal ) {
if( m_pOwner != NULL ) m_pOwner->LineDown();
else SetScrollPos(m_nScrollPos + m_nLineSize);
}
else {
if( m_pOwner != NULL ) m_pOwner->LineRight();
else SetScrollPos(m_nScrollPos + m_nLineSize);
}
}
else {
if( m_nScrollRepeatDelay <= 5 ) return;
POINT pt = { 0 };
::GetCursorPos(&pt);
::ScreenToClient(m_pWindow->GetHWND(), &pt);
if( !m_bHorizontal ) {
if( pt.y < m_rcThumb.top ) {
if( m_pOwner != NULL ) m_pOwner->PageUp();
else SetScrollPos(m_nScrollPos + m_rcItem.top - m_rcItem.bottom);
}
else if ( pt.y > m_rcThumb.bottom ){
if( m_pOwner != NULL ) m_pOwner->PageDown();
else SetScrollPos(m_nScrollPos - m_rcItem.top + m_rcItem.bottom);
}
}
else {
if( pt.x < m_rcThumb.left ) {
if( m_pOwner != NULL ) m_pOwner->PageLeft();
else SetScrollPos(m_nScrollPos + m_rcItem.left - m_rcItem.right);
}
else if ( pt.x > m_rcThumb.right ){
if( m_pOwner != NULL ) m_pOwner->PageRight();
else SetScrollPos(m_nScrollPos - m_rcItem.left + m_rcItem.right);
}
}
}
return;
}
void ScrollBar::PaintBk(IRenderContext* pRender)
{
m_bkStateImage.PaintStatusImage(pRender, m_uButtonState);
}
void ScrollBar::PaintButton1(IRenderContext* pRender)
{
if (!m_bShowButton1) return;
m_sImageModify.clear();
m_sImageModify = StringHelper::Printf(_T("destscale='false' dest='%d,%d,%d,%d'"), m_rcButton1.left - m_rcItem.left, \
m_rcButton1.top - m_rcItem.top, m_rcButton1.right - m_rcItem.left, m_rcButton1.bottom - m_rcItem.top);
if (m_uButton1State == kControlStateDisabled) {
if (!DrawImage(pRender, m_button1StateImage[kControlStateDisabled], m_sImageModify)) {
}
else return;
}
else if (m_uButton1State == kControlStatePushed) {
if (!DrawImage(pRender, m_button1StateImage[kControlStatePushed], m_sImageModify)) {
}
else return;
if (!DrawImage(pRender, m_button1StateImage[kControlStateHot], m_sImageModify)) {
}
else return;
}
else if (m_uButton1State == kControlStateHot || m_uThumbState == kControlStatePushed) {
if (!DrawImage(pRender, m_button1StateImage[kControlStateHot], m_sImageModify)) {
}
else return;
}
if (!DrawImage(pRender, m_button1StateImage[kControlStateNormal], m_sImageModify)) {
}
else return;
}
void ScrollBar::PaintButton2(IRenderContext* pRender)
{
if (!m_bShowButton2) return;
m_sImageModify.clear();
m_sImageModify = StringHelper::Printf(_T("destscale='false' dest='%d,%d,%d,%d'"), m_rcButton2.left - m_rcItem.left, \
m_rcButton2.top - m_rcItem.top, m_rcButton2.right - m_rcItem.left, m_rcButton2.bottom - m_rcItem.top);
if (m_uButton2State == kControlStateDisabled) {
if (!DrawImage(pRender, m_button2StateImage[kControlStateDisabled], m_sImageModify)) {
}
else return;
}
else if (m_uButton2State == kControlStatePushed) {
if (!DrawImage(pRender, m_button2StateImage[kControlStatePushed], m_sImageModify)) {
}
else return;
if (!DrawImage(pRender, m_button2StateImage[kControlStateHot], m_sImageModify)) {
}
else return;
}
else if (m_uButton2State == kControlStateHot || m_uThumbState == kControlStatePushed) {
if (!DrawImage(pRender, m_button2StateImage[kControlStateHot], m_sImageModify)) {
}
else return;
}
if (!DrawImage(pRender, m_button2StateImage[kControlStateNormal], m_sImageModify)) {
}
else return;
}
void ScrollBar::PaintThumb(IRenderContext* pRender)
{
if (m_rcThumb.left == 0 && m_rcThumb.top == 0 && m_rcThumb.right == 0 && m_rcThumb.bottom == 0) return;
m_sImageModify.clear();
m_sImageModify = StringHelper::Printf(_T("destscale='false' dest='%d,%d,%d,%d'"), m_rcThumb.left - m_rcItem.left, \
m_rcThumb.top - m_rcItem.top, m_rcThumb.right - m_rcItem.left, m_rcThumb.bottom - m_rcItem.top);
m_thumbStateImage.PaintStatusImage(pRender, m_uThumbState, m_sImageModify);
}
void ScrollBar::PaintRail(IRenderContext* pRender)
{
if (m_rcThumb.left == 0 && m_rcThumb.top == 0 && m_rcThumb.right == 0 && m_rcThumb.bottom == 0) return;
m_sImageModify.clear();
if (!m_bHorizontal) {
m_sImageModify = StringHelper::Printf(_T("destscale='false' dest='%d,%d,%d,%d'"), m_rcThumb.left - m_rcItem.left, \
(m_rcThumb.top + m_rcThumb.bottom) / 2 - m_rcItem.top - m_cxyFixed.cx / 2, \
m_rcThumb.right - m_rcItem.left, \
(m_rcThumb.top + m_rcThumb.bottom) / 2 - m_rcItem.top + m_cxyFixed.cx - m_cxyFixed.cx / 2);
}
else {
m_sImageModify = StringHelper::Printf(_T("destscale='false' dest='%d,%d,%d,%d'"), \
(m_rcThumb.left + m_rcThumb.right) / 2 - m_rcItem.left - m_cxyFixed.cy / 2, \
m_rcThumb.top - m_rcItem.top, \
(m_rcThumb.left + m_rcThumb.right) / 2 - m_rcItem.left + m_cxyFixed.cy - m_cxyFixed.cy / 2, \
m_rcThumb.bottom - m_rcItem.top);
}
if (m_uThumbState == kControlStateDisabled) {
if (!DrawImage(pRender, m_railStateImage[kControlStateDisabled], m_sImageModify)) {
}
else return;
}
else if (m_uThumbState == kControlStatePushed) {
if (!DrawImage(pRender, m_railStateImage[kControlStatePushed], m_sImageModify)) {
}
else return;
if (!DrawImage(pRender, m_railStateImage[kControlStateHot], m_sImageModify)) {
}
else return;
}
else if (m_uThumbState == kControlStateHot) {
if (!DrawImage(pRender, m_railStateImage[kControlStateHot], m_sImageModify)) {
}
else return;
}
if (!DrawImage(pRender, m_railStateImage[kControlStateNormal], m_sImageModify)) {
}
else return;
}
}