DragonNest/Common/EtInterface/EtUISlider.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

253 lines
5.9 KiB
C++

#include "StdAfx.h"
#include "EtUISlider.h"
#include "EtUIDialog.h"
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
CEtUISlider::CEtUISlider( CEtUIDialog *pParent )
: CEtUIControl( pParent )
{
m_Property.UIType = UI_CONTROL_SLIDER;
m_Property.SliderProperty.nMinValue = 0;
m_Property.SliderProperty.nMaxValue = 100;
m_nValue = 0;
m_fButtonX = 0.0f;
m_bPressed = false;
m_fDragOffset = 0.0f;
m_fDragX = 0.0f;
}
CEtUISlider::~CEtUISlider(void)
{
}
void CEtUISlider::Initialize( SUIControlProperty *pProperty )
{
CEtUIControl::Initialize( pProperty );
if( m_Property.SliderProperty.nMinValue == m_Property.SliderProperty.nMaxValue )
{
m_Property.SliderProperty.nMinValue = 0;
m_Property.SliderProperty.nMaxValue = 100;
}
SetValue( 0 );
UpdateRects();
}
bool CEtUISlider::IsInside( float fX, float fY )
{
if( CEtUIControl::IsInside( fX, fY ) )
{
return true;
}
if( m_ButtonCoord.IsInside( fX, fY ) )
{
return true;
}
return false;
}
bool CEtUISlider::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam )
{
if( !IsEnable() || !IsShow() )
{
return false;
}
if( uMsg == WM_KEYDOWN )
{
switch( wParam )
{
case VK_HOME:
SetValueInternal( m_Property.SliderProperty.nMinValue, true );
return true;
case VK_END:
SetValueInternal( m_Property.SliderProperty.nMaxValue, true );
return true;
case VK_LEFT:
case VK_DOWN:
SetValueInternal( m_nValue - 1, true );
return true;
case VK_RIGHT:
case VK_UP:
SetValueInternal( m_nValue + 1, true );
return true;
case VK_NEXT:
SetValueInternal( m_nValue - ( 10 > ( m_Property.SliderProperty.nMaxValue - m_Property.SliderProperty.nMinValue ) / 10 ? 10 : ( m_Property.SliderProperty.nMaxValue - m_Property.SliderProperty.nMinValue ) / 10 ), true );
return true;
case VK_PRIOR:
SetValueInternal( m_nValue + ( 10 > ( m_Property.SliderProperty.nMaxValue - m_Property.SliderProperty.nMinValue ) / 10 ? 10 : ( m_Property.SliderProperty.nMaxValue - m_Property.SliderProperty.nMinValue ) / 10 ), true );
return true;
}
}
return false;
}
bool CEtUISlider::HandleMouse( UINT uMsg, float fX, float fY, WPARAM wParam, LPARAM lParam )
{
if( !IsEnable() || !IsShow() )
{
return false;
}
switch( uMsg )
{
case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK:
if( m_ButtonCoord.IsInside( fX, fY ) )
{
m_bPressed = true;
SetCapture( m_pParent->GetHWnd() );
m_fDragX = fX;
m_fDragOffset = m_fButtonX - m_fDragX;
if( !m_bFocus )
{
m_pParent->RequestFocus( this );
}
return true;
}
if( m_Property.UICoord.IsInside( fX, fY ) )
{
m_fDragX = fX;
m_fDragOffset = 0;
m_bPressed = true;
if( !m_bFocus )
{
m_pParent->RequestFocus( this );
}
if( fX > m_fButtonX + m_Property.UICoord.fX )
{
SetValueInternal( m_nValue + 1, true );
return true;
}
if( fX < m_fButtonX + m_Property.UICoord.fX )
{
SetValueInternal( m_nValue - 1, true );
return true;
}
}
break;
case WM_LBUTTONUP:
if( m_bPressed )
{
m_bPressed = false;
ReleaseCapture();
m_pParent->ProcessCommand( EVENT_SLIDER_VALUE_CHANGED, true, this );
return true;
}
break;
case WM_MOUSEMOVE:
if( m_bPressed )
{
SetValueInternal( ValueFromPos( m_Property.UICoord.fX + fX + m_fDragOffset ), true );
return true;
}
break;
case WM_MOUSEWHEEL:
{
int nScrollAmount;
nScrollAmount = int((short)HIWORD(wParam)) / WHEEL_DELTA;
SetValueInternal( m_nValue - nScrollAmount, true );
return true;
}
}
return false;
}
void CEtUISlider::UpdateRects()
{
SUIElement *pElement = GetElement(1);
if( !pElement ) return;
m_ButtonCoord = m_Property.UICoord;
m_ButtonCoord.SetSize( pElement->fTextureWidth, pElement->fTextureHeight );
m_ButtonCoord.fX -= m_ButtonCoord.fWidth * 0.5f;
m_ButtonCoord.fY -= (m_ButtonCoord.fHeight - m_Property.UICoord.fHeight)/2.0f;
m_fButtonX = ( ( m_nValue - m_Property.SliderProperty.nMinValue ) * m_Property.UICoord.fWidth / ( m_Property.SliderProperty.nMaxValue - m_Property.SliderProperty.nMinValue ) );
m_ButtonCoord.fX += m_fButtonX;
}
void CEtUISlider::SetValueInternal( int nValue, bool bFromInput )
{
nValue = max( m_Property.SliderProperty.nMinValue, nValue );
nValue = min( m_Property.SliderProperty.nMaxValue, nValue );
if( nValue == m_nValue )
{
return;
}
m_nValue = nValue;
UpdateRects();
m_pParent->ProcessCommand( EVENT_SLIDER_VALUE_CHANGED, bFromInput, this );
}
int CEtUISlider::ValueFromPos( float fX )
{
float fValuePerPixel;
fValuePerPixel = ( m_Property.SliderProperty.nMaxValue - m_Property.SliderProperty.nMinValue ) / m_Property.UICoord.fWidth;
return ( int ) (0.5f + m_Property.SliderProperty.nMinValue + fValuePerPixel * ( fX - m_Property.UICoord.fX ) );
}
void CEtUISlider::Render( float fElapsedTime )
{
m_CurrentState = UI_STATE_NORMAL;
if( !IsShow() )
{
m_CurrentState = UI_STATE_HIDDEN;
}
else if( !IsEnable() )
{
m_CurrentState = UI_STATE_DISABLED;
}
else if( m_bPressed )
{
m_CurrentState = UI_STATE_PRESSED;
}
else if( m_bMouseEnter )
{
m_CurrentState = UI_STATE_MOUSEENTER;
}
else if( m_bFocus )
{
m_CurrentState = UI_STATE_FOCUS;
}
UpdateBlendRate();
SUIElement *pElement(NULL);
pElement = GetElement(0);
pElement->TextureColor.Blend( m_CurrentState, fElapsedTime, m_fBlendRate );
if( m_bExistTemplateTexture )
m_pParent->DrawSprite( m_Template.m_hTemplateTexture, pElement->TemplateUVCoord, pElement->TextureColor.dwCurrentColor, m_Property.UICoord );
else
m_pParent->DrawSprite( pElement->UVCoord, pElement->TextureColor.dwCurrentColor, m_Property.UICoord );
pElement = GetElement(1);
pElement->TextureColor.Blend( m_CurrentState, fElapsedTime, m_fBlendRate );
if( m_bExistTemplateTexture )
m_pParent->DrawSprite( m_Template.m_hTemplateTexture, pElement->TemplateUVCoord, pElement->TextureColor.dwCurrentColor, m_ButtonCoord );
else
m_pParent->DrawSprite( pElement->UVCoord, pElement->TextureColor.dwCurrentColor, m_ButtonCoord );
}