Files
Leviathan/Client/Game/engine/Ui/Controls/KUIControlScroll.cpp
T
2026-06-01 12:46:52 +02:00

1468 lines
37 KiB
C++

#include "stdafx.h"
#include "KUIControlScroll.h"
#include "KUIWndManager.h"
#include "KUIControlButton.h"
#include "KUITextureManager.h"
#include "KResourceManager.h"
//#include <string>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// KUIControlScrollBase Implement
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
using namespace KUI_MESSAGE;
namespace
{
//const std::string SCROLL_THUMB = "scrollbar_bar";
//const std::string SCROLL_DOWN_BTN = "scrollbar_down";
//const std::string SCROLL_UP_BTN = "scrollbar_up";
//const std::string SCROLL_LEFT_BTN = "scrollbar_down";
//const std::string SCROLL_RIGHT_BTN = "scrollbar_up";
//const std::string SCROLL_VERTICAL_BACK = "scrollbar_background";
//const std::string SCROLL_HORIZONTAL_BACK = "scrollbar_background";
const std::string SCROLL_THUMB = "button_scrollbar_bar";
const std::string SCROLL_DOWN_BTN = "button_scrollbar_down";
const std::string SCROLL_UP_BTN = "button_scrollbar_up";
const std::string SCROLL_LEFT_BTN = "button_scrollbar_down";
const std::string SCROLL_RIGHT_BTN = "button_scrollbar_up";
const std::string SCROLL_VERTICAL_BACK = "static_scrollbar_backgroundable";
const std::string SCROLL_HORIZONTAL_BACK = "static_scrollbar_backgroundable";
const int SCROLL_BTN_GAP = 0;
const float SCROLL_BAR_UNIT_DEVIDER = 20.f;
}
KUIControlScrollBase::KUIControlScrollBase()
{
m_bMouseDrag = false;
m_dwMaxRange = 1;
m_nCurrentPos = 0;
m_pThumbBtn = NULL;
m_bUseWheel = true; // 휠사용여부.
memset(m_pScrollBarBtn, 0 ,sizeof(m_pScrollBarBtn));
}
KUIControlScrollBase::~KUIControlScrollBase()
{
}
void KUIControlScrollBase::PumpUpMessage(LPCSTR lpszControlID, DWORD dwMessage, DWORD lParam, DWORD wParam)
{
if(KBUTTON_CLICK == dwMessage)
{
int nPos = GetPosition();
int nAddValue = 1;
if(strncmp(lpszControlID, "scroll_btn_down", 15) == 0)
nAddValue = 1;
else if(strncmp(lpszControlID, "scroll_btn_up", 13) == 0)
nAddValue = -1;
// Home, End 추가. bintitle 2010.05.04
else if(strncmp(lpszControlID, "scroll_btn_home", 15) == 0)
nAddValue = (-nPos);
else if(strncmp(lpszControlID, "scroll_btn_end", 14) == 0)
nAddValue = (-nPos) + m_dwMaxRange;
else
return;
nPos = nPos + nAddValue;
//// Pos 가 Change
//if(nPos != GetPosition())
//{
// PumpUpMessage(GetID(), KSCROLL_CHANGE, GetPosition(), 0);
//}
SetPosition(nPos);
PumpUpMessage(GetID(), KSCROLL_SELECT, GetPosition(), 0);
return;
}
KUIControl::PumpUpMessage( lpszControlID, dwMessage, lParam, wParam);
}
DWORD KUIControlScrollBase::OnKeyMessage(DWORD dwMessage, DWORD dwKeyCode)
{
DWORD dwRet = KUIControl::OnKeyMessage(dwMessage, dwKeyCode);
if(KMR_NO_GET & dwRet)
return dwRet;
// 여기에 처리
return dwRet;
}
DWORD KUIControlScrollBase::OnMouseMessage( DWORD dwMessage, int x, int y )
{
DWORD dwRet = KUIControl::OnMouseMessage(dwMessage,x,y);
if(KMR_NO_GET & dwRet)
return dwRet;
// 여기에 처리
int nOldPos = m_nCurrentPos;
// Drag 처리
if( m_bMouseDrag )
{
switch( dwMessage )
{
case KMOUSE_MOVE:
_SetThumbRect(x,y);
_EvalPositionFromThumRect();
break;
case KLBUTTON_UP:
_EvalThumbRect();
m_bMouseDrag = false;
break;
default:
break;
}
}
// Scroll 이동범위 체크
else if(IsInRect(x,y) )
{
switch(dwMessage)
{
case KWHEEL_DOWN:
{
if(m_nCurrentPos < (int)m_dwMaxRange - 1)
{
++m_nCurrentPos;
_EvalThumbRect();
}
}
break;
case KWHEEL_UP:
{
if(m_nCurrentPos > 0)
{
--m_nCurrentPos;
_EvalThumbRect();
}
}
break;
case KLBUTTON_UP:
_EvalThumbRect();
break;
case KLBUTTON_DOWN:
if(m_pThumbBtn->IsInRect(x,y) )
{
m_ptMovingOffset = KPoint( x - m_pThumbBtn->GetRect().left, y - m_pThumbBtn->GetRect().top);
m_bMouseDrag = true;
}
else
{
m_ptMovingOffset = KPoint(m_pThumbBtn->GetRect().GetWidth() / 2,m_pThumbBtn->GetRect().GetHeight() / 2);
// Thumb의 포지션을 옮긴다.
_EvalPosition(x,y);
_EvalThumbRect();
}
break;
default:
break;
}
}
// MJ 2004/11/14
// 휠 메시지의 경우 윈도우 창에만 커서가 있어도 처리하자
else if( m_bUseWheel && GetParent()->IsInRect( x, y ) )
{
switch(dwMessage)
{
case KWHEEL_UP:
{
if(m_nCurrentPos > 0)
{
m_nCurrentPos--;
_EvalThumbRect();
}
}
break;
case KWHEEL_DOWN:
{
if(m_nCurrentPos < (int)m_dwMaxRange - 1)
{
m_nCurrentPos++;
_EvalThumbRect();
}
}
break;
}
}
if(nOldPos != m_nCurrentPos )
{
// PumpUpMessage(GetID(), KSCROLL_CHANGE, nOldPos, 0); // 사용의 필요성이 없으며, 현재 사용되는 곳 또한 없으므로 제거. bintitle. 2010.09.07.
PumpUpMessage(GetID(), KSCROLL_SELECT, m_nCurrentPos, 0);
}
return dwRet;
}
void KUIControlScrollBase::SetMaxRange(DWORD dwMaxRange)
{
if( m_dwMaxRange == dwMaxRange ) return;
m_dwMaxRange = dwMaxRange;
_ResizeThumb();
if(m_nCurrentPos >= dwMaxRange)
SetPosition(dwMaxRange - 1);
InvalidateWnd();
}
void KUIControlScrollBase::SetPosition(int nPos)
{
if( m_nCurrentPos == nPos ) return;
if(nPos <= 0)
nPos = 0;
else if(nPos >= m_dwMaxRange)
nPos = m_dwMaxRange - 1;
m_nCurrentPos = nPos;
_EvalThumbRect();
InvalidateWnd();
}
const KRect KUIControlScrollBase::GetRectWithBtn() const
{
return m_rcRegion + m_rcBtnOffset;
}
void KUIControlScrollBase::_initControl()
{
KUIWnd::_ClearChildList();
KRect rcOrigin = m_rcRegion;
_CalScrollBarRect( &m_rcRegion);
// Btn 만큼의 Offset
m_rcBtnOffset = rcOrigin - m_rcRegion;
KUIControl::_initControl();
}
// 추가. bintitle. 2010.05.12
void KUIControlScrollBase::ScrollUp()
{
int nPos = GetPosition();
nPos = nPos - 1;
//// Pos 가 Change
//if(nPos != GetPosition())
//{
// PumpUpMessage(GetID(), KSCROLL_CHANGE, GetPosition(), 0);
//}
SetPosition(nPos);
PumpUpMessage(GetID(), KSCROLL_SELECT, GetPosition(), 0);
}
// 추가. bintitle. 2010.05.12
void KUIControlScrollBase::ScrollDown()
{
int nPos = GetPosition();
nPos = nPos + 1;
//// Pos 가 Change
//if(nPos != GetPosition())
//{
// PumpUpMessage(GetID(), KSCROLL_CHANGE, GetPosition(), 0);
//}
SetPosition(nPos);
PumpUpMessage(GetID(), KSCROLL_SELECT, GetPosition(), 0);
}
// 추가. bintitle. 2010.05.12
void KUIControlScrollBase::ScrollRefresh()
{
int nPos = GetPosition();
SetPosition(nPos);
PumpUpMessage(GetID(), KSCROLL_SELECT, nPos, 0);
}
/// 2011.06.22 - prodongi
bool KUIControlScrollBase::getButtonRect(unsigned int type, KRect &r) const
{
if (TOTAL_BTN <= type)
return false;
if (!m_pScrollBarBtn[type])
return false;
r = m_pScrollBarBtn[type]->GetRect();
return true;
}
KRect KUIControlScrollBase::getRectWithButton() const
{
KRect r, tempr;
r = m_rcRegion;
if (m_pScrollBarBtn[SCROLL_BAR_UP])
{
r.top -= m_pScrollBarBtn[SCROLL_BAR_UP]->GetRect().GetHeight();
}
if (m_pScrollBarBtn[SCROLL_BAR_DOWN])
{
r.bottom += m_pScrollBarBtn[SCROLL_BAR_DOWN]->GetRect().GetHeight();
}
return r;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// KUIControlHScroll Implement
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
namespace
{
KUIWnd* HScrollCreator()
{
return new KUIControlHScroll;
}
bool bHScrollRegister = KUIFactory::GetInstance()->RegisterCreator( HScrollCreator, "h_scroll");
}
void KUIControlHScroll::SetHScrollName()
{
if( strcmp( m_sAniName.c_str(), SCROLL_HORIZONTAL_BACK.c_str() ) !=0 )
{
int aniLen = strlen(m_sAniName.c_str());
int defaultLen = strlen(SCROLL_HORIZONTAL_BACK.c_str());
if( aniLen <= defaultLen )
return;
const char *cStr = strstr(m_sAniName.c_str(), SCROLL_HORIZONTAL_BACK.c_str()) + defaultLen;
scroll_left_btn = SCROLL_LEFT_BTN;
scroll_left_btn += cStr;
scroll_right_btn = SCROLL_RIGHT_BTN;
scroll_right_btn += cStr;
scroll_thumb = SCROLL_THUMB;
scroll_thumb += cStr;
}
else
{
scroll_left_btn = SCROLL_LEFT_BTN;
scroll_right_btn = SCROLL_RIGHT_BTN;
scroll_thumb = SCROLL_THUMB;
}
}
void KUIControlHScroll::_initControl()
{
if ( m_sAniName.empty() )
m_sAniName = SCROLL_HORIZONTAL_BACK;
KUIControlScrollBase::_initControl();
SetHScrollName();
// Thumb생성
KUIWND_CREATE_ARG arg;
arg.lpszSprName = m_sSprName.c_str();
arg.lpszAniName = scroll_thumb.c_str();
arg.lpszClassName = "button";
arg.lpszID = "_thumb_btn";
arg.pParent = this;
arg.rcRect = m_rcRegion;
arg.rcRect.right = -1;
arg.rcRect.bottom = -1;
arg.dwStyle = 0;
m_pThumbBtn = reinterpret_cast<KUIControlButton*>( m_pManager->CreateControl( arg ));
// Scroll Left Btn 생성
arg.lpszClassName = "simplebutton";
arg.lpszSprName = m_sSprName.c_str();
arg.lpszAniName = scroll_left_btn;
arg.lpszID = "scroll_btn_up";
arg.dwStyle = 0;
KResSprite * pFrame = KSpriteManager::GetManager()->GetResSprite(m_sSprName.c_str(),
scroll_left_btn.c_str() , 0);
if(NULL == pFrame)
assert( false && "Cannot Find Res Frame");
int nSizeX = pFrame->GetSizeX();
arg.rcRect = KRect(m_rcRegion.left - nSizeX - SCROLL_BTN_GAP, m_rcRegion.top,-1, -1);
m_pScrollBarBtn[SCROLL_BAR_UP] = reinterpret_cast<KUIControlSimpleButton*>( m_pManager->CreateControl( arg ) );
// Scroll Right Btn 생성
arg.lpszAniName = scroll_right_btn;
arg.lpszID = "scroll_btn_down";
pFrame = KSpriteManager::GetManager()->GetResSprite(m_sSprName.c_str(),
scroll_right_btn.c_str(), 0);
if(NULL == pFrame)
assert( false && "Cannot Find Res Frame");
nSizeX = pFrame->GetSizeX();
arg.rcRect = KRect(m_rcRegion.right + SCROLL_BTN_GAP, m_rcRegion.top,-1,-1);
m_pScrollBarBtn[SCROLL_BAR_DOWN] = reinterpret_cast<KUIControlSimpleButton*>( m_pManager->CreateControl( arg ) );
// 가로로 세조각
_reArrangeRect( true );
_ResizeThumb();
// Thumb Setting
_EvalThumbRect();
}
void KUIControlHScroll::_EvalPosition(int x, int y)
{
KRect rcThumbRect = m_pThumbBtn->GetRect();
DWORD dwWidth = m_rcRegion.GetWidth() - ( (rcThumbRect.GetWidth() + 1) / 2);
int nWidthDiff = x - m_rcRegion.left;
if(nWidthDiff < 0)
nWidthDiff = 0;
float fPosRatio = (float)nWidthDiff / (float)dwWidth;
if(fPosRatio > 1.0f)
fPosRatio = 1.0f;
m_nCurrentPos = (m_dwMaxRange - 1) * fPosRatio;
InvalidateWnd();
}
void KUIControlHScroll::_EvalPositionFromThumRect()
{
const KRect& rcThumbRect = m_pThumbBtn->GetRect();
DWORD dwWidthDiff = m_rcRegion.GetWidth() - rcThumbRect.GetWidth();
float fPosRatio = 0.f;
if( dwWidthDiff > 0)
fPosRatio = (float) (rcThumbRect.left - m_rcRegion.left) / (float)dwWidthDiff;
if( m_dwMaxRange > 1)
fPosRatio += 1 / (float)( m_dwMaxRange - 1) / 2.0f;
m_nCurrentPos = (m_dwMaxRange - 1) * fPosRatio;
InvalidateWnd();
}
void KUIControlHScroll::_EvalThumbRect()
{
KRect rcThumbRect = m_pThumbBtn->GetRect();
DWORD dwWidth = m_rcRegion.GetWidth();
DWORD dwThumbWidth = rcThumbRect.GetWidth();
float fPosRatio = 1.0f;
if(m_dwMaxRange > 1)
{
fPosRatio = (float)m_nCurrentPos / (float)(m_dwMaxRange - 1);
}
DWORD dwAddWidth = (dwWidth - dwThumbWidth) * fPosRatio;
m_pThumbBtn->MovePos(m_rcRegion.left + dwAddWidth, m_rcRegion.top);
InvalidateWnd();
}
void KUIControlHScroll::_SetThumbRect(int x, int y)
{
int nMaxPosX = m_rcRegion.right - m_pThumbBtn->GetRect().GetWidth();
x -= m_ptMovingOffset.x;
x = max( x, m_rcRegion.left);
x = min(x,nMaxPosX );
m_pThumbBtn->MovePos(x, m_rcRegion.top);
InvalidateWnd();
}
void KUIControlHScroll::_ResizeThumb()
{
int nScrollUnit = (float)m_rcRegion.GetWidth() / SCROLL_BAR_UNIT_DEVIDER;
int nNewWidth = m_rcRegion.GetWidth() - nScrollUnit * ( (int)m_dwMaxRange - 1 );
nNewWidth = max( nNewWidth, 0);
KRect rcRect = m_pThumbBtn->GetRect();
rcRect.right = rcRect.left + nNewWidth;
m_pThumbBtn->Resize(rcRect);
if( m_rcRegion.GetWidth() <= rcRect.GetWidth() )
{
m_pThumbBtn->SetShow( false);
return;
}
else
{
m_pThumbBtn->SetShow( true );
}
InvalidateWnd();
}
void KUIControlHScroll::_CalScrollBarRect(KRect* pInOutRect)
{
SetHScrollName();
KResSprite * pFrame = KSpriteManager::GetManager()->GetResSprite(m_sSprName.c_str(),
scroll_left_btn.c_str() , 0);
if(NULL == pFrame)
assert( false && "Cannot Find Res Frame");
// int nSizeX = pFrame->GetSizeX();
pInOutRect->left += /*nSizeX +*/ SCROLL_BTN_GAP;
pInOutRect->right -= /*nSizeX +*/ SCROLL_BTN_GAP;
InvalidateWnd();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// KUIControlVScroll Implement
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
namespace
{
KUIWnd* VScrollCreator()
{
return new KUIControlVScroll;
}
bool bVScrollRegister = KUIFactory::GetInstance()->RegisterCreator( VScrollCreator, "v_scroll");
}
void KUIControlVScroll::SetVScrollName()
{
//if( strcmp( m_sAniName.c_str(), SCROLL_VERTICAL_BACK.c_str() ) !=0 )
//{
// int aniLen = strlen(m_sAniName.c_str());
// int defaultLen = strlen(SCROLL_VERTICAL_BACK.c_str());
// if( aniLen <= defaultLen )
// return;
// const char *cStr = strstr(m_sAniName.c_str(), SCROLL_VERTICAL_BACK.c_str()) + defaultLen;
// scroll_down_btn = SCROLL_DOWN_BTN;
// scroll_down_btn += cStr;
// scroll_up_btn = SCROLL_UP_BTN;
// scroll_up_btn += cStr;
// scroll_thumb = SCROLL_THUMB;
// scroll_thumb += cStr;
//}
//else
//{
// scroll_down_btn = SCROLL_DOWN_BTN.c_str();
// scroll_up_btn = SCROLL_UP_BTN.c_str();
// scroll_thumb = SCROLL_THUMB.c_str();
//}
// 2010. 7. 19 marine
// nui의 ani에 이름이 여러개가 들어가게 변경
// 여러개 들어간 이름들을 파싱하는 부분
int iEnd,iStart,iCnt = 0;
std::string buf = m_buf;
while(1)
{
iStart = 0;
iEnd = buf.find("/");
if(iEnd == -1)
{
strAniName[iCnt] = buf;
break;
}
strAniName[iCnt] = buf.substr(iStart,iEnd);
iStart = iEnd++;
buf = buf.substr(iStart+1, buf.size());
iCnt++;
}
// 리스트에 저장되는 순서
if(strAniName[0].compare("") == 0) m_sAniName = "static_scrollbar_backgroundable";
else m_sAniName = strAniName[0];
if(strAniName[1].compare("") == 0) scroll_thumb = "button_scrollbar_bar";
else scroll_thumb = strAniName[1];
if(strAniName[2].compare("") == 0) scroll_up_btn = "button_scrollbar_up";
else scroll_up_btn = strAniName[2];
if(strAniName[3].compare("") == 0) scroll_down_btn = "button_scrollbar_down";
else scroll_down_btn = strAniName[3];
}
void KUIControlVScroll::_initControl()
{
if ( m_sAniName.empty() )
m_sAniName = SCROLL_VERTICAL_BACK;
m_buf = m_sAniName;
KUIControlScrollBase::_initControl();
SetVScrollName();
// Thumb생성
KUIWND_CREATE_ARG arg;
arg.lpszSprName = m_sSprName.c_str();
arg.lpszAniName = scroll_thumb;
arg.lpszClassName = "button";
arg.lpszID = "_thumb_btn";
arg.pParent = this;
arg.rcRect = m_rcRegion;
arg.rcRect.right = -1;
arg.rcRect.bottom = -1;
arg.dwStyle = KSTYLE_BUTTON_VERTICAL;
m_pThumbBtn = reinterpret_cast<KUIControlButton*>( m_pManager->CreateControl( arg ));
// Scroll Left Btn 생성
arg.lpszClassName = "simplebutton";
arg.lpszSprName = m_sSprName.c_str();
arg.lpszAniName = scroll_up_btn;
arg.lpszID = "scroll_btn_up";
arg.dwStyle = 0;
arg.pParent = this;
KResSprite * pFrame = KSpriteManager::GetManager()->GetResSprite(m_sSprName.c_str(),
scroll_up_btn.c_str() , 0);
if(NULL == pFrame)
assert( false && "Cannot Find Res Frame");
int nSizeY = pFrame->GetSizeY();
arg.rcRect = KRect(m_rcRegion.left, m_rcRegion.top - nSizeY - SCROLL_BTN_GAP, -1,-1);
m_pScrollBarBtn[SCROLL_BAR_UP] = reinterpret_cast<KUIControlSimpleButton*>( m_pManager->CreateControl( arg ) );
// Scroll Right Btn 생성
arg.lpszAniName = scroll_down_btn;
arg.lpszID = "scroll_btn_down";
pFrame = KSpriteManager::GetManager()->GetResSprite(m_sSprName.c_str(), scroll_down_btn.c_str(), 0);
if(NULL == pFrame)
assert( false && "Cannot Find Res Frame");
nSizeY = pFrame->GetSizeY();
arg.rcRect = KRect(m_rcRegion.left, m_rcRegion.bottom + SCROLL_BTN_GAP,-1,-1);
m_pScrollBarBtn[SCROLL_BAR_DOWN] = reinterpret_cast<KUIControlSimpleButton*>( m_pManager->CreateControl( arg ) );
// 세로로 세조각
_reArrangeRect( false );
// Thumb Btn 생성
_ResizeThumb();
// Thumb Setting
_EvalThumbRect();
}
void KUIControlVScroll::_EvalPosition(int x, int y)
{
KRect rcThumbRect = m_pThumbBtn->GetRect();
DWORD dwHeight = m_rcRegion.GetHeight() - ( (rcThumbRect.GetHeight() + 1) / 2);
// 젤 위에서부터 이동된 거리
int nHeightDiff = y - m_rcRegion.top;
if(nHeightDiff < 0)
nHeightDiff = 0;
// 비율
float fPosRatio = (float)nHeightDiff / (float)dwHeight;
if(fPosRatio > 1.0f)
fPosRatio = 1.0f;
m_nCurrentPos = (m_dwMaxRange - 1) * fPosRatio;
InvalidateWnd();
}
void KUIControlVScroll::_EvalPositionFromThumRect()
{
const KRect& rcThumbRect = m_pThumbBtn->GetRect();
DWORD dwHeightDiff = m_rcRegion.GetHeight() - rcThumbRect.GetHeight();
float fPosRatio = 0.f;
if( dwHeightDiff > 0)
fPosRatio = (float) (rcThumbRect.top - m_rcRegion.top) / (float)dwHeightDiff;
if( m_dwMaxRange > 1)
fPosRatio += 1 / (float)( m_dwMaxRange - 1) / 2.0f;
m_nCurrentPos = (m_dwMaxRange - 1) * fPosRatio;
InvalidateWnd();
}
void KUIControlVScroll::_EvalThumbRect()
{
KRect rcThumbRect = m_pThumbBtn->GetRect();
DWORD dwHeight = m_rcRegion.GetHeight();
DWORD dwThumbHeight = rcThumbRect.GetHeight();
float fPosRatio = 0.0f;
if(m_dwMaxRange > 1)
fPosRatio = (float)m_nCurrentPos / (float)(m_dwMaxRange - 1);
DWORD dwAddHeight = (dwHeight - dwThumbHeight) * fPosRatio;
m_pThumbBtn->MovePos(m_rcRegion.left, m_rcRegion.top + dwAddHeight);
InvalidateWnd();
}
void KUIControlVScroll::_SetThumbRect(int x, int y)
{
int nMaxPosY = m_rcRegion.bottom - m_pThumbBtn->GetRect().GetHeight();
y -= m_ptMovingOffset.y;
y = max(y,m_rcRegion.top);
y = min(y,nMaxPosY );
m_pThumbBtn->MovePos(m_rcRegion.left, y);
InvalidateWnd();
}
void KUIControlVScroll::_ResizeThumb()
{
int nScrollUnit = (float)m_rcRegion.GetHeight() / SCROLL_BAR_UNIT_DEVIDER;
int nNewHeight = m_rcRegion.GetHeight() - nScrollUnit * ( (int)m_dwMaxRange - 1 );
nNewHeight = max( nNewHeight, 0);
KRect rcRect = m_pThumbBtn->GetRect();
rcRect.bottom = rcRect.top + nNewHeight;
m_pThumbBtn->Resize(rcRect);
if( m_rcRegion.GetHeight() <= rcRect.GetHeight() )
{
m_pThumbBtn->SetShow( false);
return;
}
else
{
m_pThumbBtn->SetShow( true );
}
InvalidateWnd();
}
void KUIControlVScroll::_CalScrollBarRect(KRect* pInOutRect)
{
SetVScrollName();
KResSprite * pFrame = KSpriteManager::GetManager()->GetResSprite(m_sSprName.c_str(),
scroll_up_btn.c_str() , 0);
if(NULL == pFrame)
assert( false && "Cannot Find Res Frame");
// int nSizeY = pFrame->GetSizeY();
pInOutRect->top += /*nSizeY +*/ SCROLL_BTN_GAP;
pInOutRect->bottom -= /*nSizeY +*/ SCROLL_BTN_GAP;
InvalidateWnd();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// KUIControlVScrollEx Implement
//
// 기존의 스크롤에 Home, End 기능 추가. bintitle. 2010.05.04.
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
namespace
{
KUIWnd* VScrollExCreator()
{
return new KUIControlVScrollEx;
}
bool bVScrollExRegister = KUIFactory::GetInstance()->RegisterCreator( VScrollExCreator, "v_scrollEx");
}
KUIControlVScrollEx::KUIControlVScrollEx()
{
scroll_home_btn = "common_scroll_default_titanium_home_medium";
scroll_end_btn = "common_scroll_default_titanium_end_medium";
scroll_down_btn = "common_scroll_default_titanium_down_medium";
scroll_up_btn = "common_scroll_default_titanium_up_medium";
scroll_thumb = "common_scroll_default_titanium_bar_medium";
scroll_back = "common_scroll_default_titanium_bg_medium_02";
m_nThumbTop = 0;
m_nThumbBottom = 0;
}
void KUIControlVScrollEx::SetVScrollName()
{
// 2010. 7. 15 marine
// 아래에 만들어진 부분 때문에 주석처리. else 부분은 원래 주석되 있었음
/* if( strcmp( m_sAniName.c_str(), scroll_back.c_str() ) !=0 )
{
int aniLen = strlen(m_sAniName.c_str());
int defaultLen = strlen(scroll_back.c_str());
if( aniLen <= defaultLen )
return;
const char *cStr = strstr(m_sAniName.c_str(), scroll_back.c_str()) + defaultLen;
scroll_down_btn += cStr;
scroll_up_btn += cStr;
scroll_thumb += cStr;
}*/
/*else
{
scroll_down_btn = SCROLL_DOWN_BTN.c_str();
scroll_up_btn = SCROLL_UP_BTN.c_str();
scroll_thumb = SCROLL_THUMB.c_str();
}*/
// 2010. 7. 15 marine
// nui의 ani에 이름이 여러개가 들어가게 변경
// 여러개 들어간 이름들을 파싱하는 부분
/*std::string strAniName[6];*/
int iEnd,iStart,iCnt = 0;
std::string buf = m_sAniName.c_str();
while(1)
{
iStart = 0;
iEnd = buf.find("/");
if(iEnd == -1)
{
strAniName[iCnt] = buf;
break;
}
strAniName[iCnt] = buf.substr(iStart,iEnd);
iStart = iEnd++;
buf = buf.substr(iStart+1, buf.size());
iCnt++;
}
// 벡터에 저장되는 순서
if(strAniName[0].compare("") == 0 ) scroll_back = "common_scroll_default_titanium_bg_medium_02";
else scroll_back = strAniName[0];
if(strAniName[1].compare("") == 0 ) scroll_thumb = "common_scroll_default_titanium_bar_medium";
else scroll_thumb = strAniName[1];
if(strAniName[2].compare("") == 0 ) scroll_home_btn = "common_scroll_default_titanium_home_medium";
else scroll_home_btn = strAniName[2];
if(strAniName[3].compare("") == 0 ) scroll_up_btn = "common_scroll_default_titanium_up_medium";
else scroll_up_btn = strAniName[3];
if(strAniName[4].compare("") == 0 ) scroll_end_btn = "common_scroll_default_titanium_end_medium";
else scroll_end_btn = strAniName[4];
if(strAniName[5].compare("") == 0 ) scroll_down_btn = "common_scroll_default_titanium_down_medium";
else scroll_down_btn = strAniName[5];
}
extern HWND g_hWnd;
void KUIControlVScrollEx::_initControl()
{
if ( m_sAniName.empty() )
m_sAniName = scroll_back;
KUIControlScrollBase::_initControl();
//SetVScrollName();
// 애니메이션 네임 등록 ㅠ
m_sAniName = scroll_back;
// Thumb생성
KUIWND_CREATE_ARG arg;
arg.lpszSprName = m_sSprName.c_str();
arg.lpszAniName = scroll_thumb;
arg.lpszClassName = "button";
arg.lpszID = "_thumb_btn";
arg.pParent = this;
arg.rcRect = m_rcRegion;
arg.rcRect.right = -1;
arg.rcRect.bottom = -1;
arg.dwStyle = KSTYLE_BUTTON_VERTICAL;
m_pThumbBtn = reinterpret_cast<KUIControlButton*>( m_pManager->CreateControl( arg ));
int nTop = 0; // 버튼들의 위치지정용.
//KUITextureManager::GetManager()->GetSprAni( arg.lpszSprName.c_str(), m_sAniName.c_str() );
//KSpriteManager::GetManager()->GetSpriteSet( arg.lpszSprName.c_str() );
//UpdateBack();
// Scroll HOME Btn 생성
arg.lpszClassName = "simplebutton";
arg.lpszSprName = m_sSprName.c_str();
arg.lpszAniName = scroll_home_btn;
arg.lpszID = "scroll_btn_home";
arg.dwStyle = 0;
arg.pParent = this;
KResSprite *pFrame = KSpriteManager::GetManager()->GetResSprite(m_sSprName.c_str(), scroll_home_btn.c_str(), 0);
if(NULL == pFrame)
assert( false && "Cannot Find Res Frame");
int nSizeY = pFrame->GetSizeY();
nTop = m_rcRegion.top;
arg.rcRect = KRect(m_rcRegion.left, nTop, -1,-1);
m_pScrollBarBtn[ SCROLL_BAR_HOME ] = reinterpret_cast<KUIControlSimpleButton*>( m_pManager->CreateControl( arg ) );
m_nThumbTop += nSizeY;
// Scroll Left Btn 생성
arg.lpszAniName = scroll_up_btn;
arg.lpszID = "scroll_btn_up";
pFrame = KSpriteManager::GetManager()->GetResSprite(m_sSprName.c_str(),
scroll_up_btn.c_str() , 0);
if(NULL == pFrame)
assert( false && "Cannot Find Res Frame");
nTop = nTop + nSizeY + SCROLL_BTN_GAP;
nSizeY = pFrame->GetSizeY();
arg.rcRect = KRect(m_rcRegion.left, nTop, -1,-1);
m_pScrollBarBtn[SCROLL_BAR_UP] = reinterpret_cast<KUIControlSimpleButton*>( m_pManager->CreateControl( arg ) );
m_nThumbTop += nSizeY;
//m_nThumbTop = nTop + nSizeY + SCROLL_BTN_GAP - m_rcRegion.top; // Thumb Top
// Scroll END Btn 생성
arg.lpszAniName = scroll_end_btn;
arg.lpszID = "scroll_btn_end";
pFrame = KSpriteManager::GetManager()->GetResSprite(m_sSprName.c_str(), scroll_end_btn.c_str(), 0);
if(NULL == pFrame)
assert( false && "Cannot Find Res Frame");
nSizeY = pFrame->GetSizeY();
nTop = m_rcRegion.bottom - nSizeY;
arg.rcRect = KRect(m_rcRegion.left, nTop,-1,-1);
m_pScrollBarBtn[ SCROLL_BAR_END ] = reinterpret_cast<KUIControlSimpleButton*>( m_pManager->CreateControl( arg ) );
// Scroll Right Btn 생성
arg.lpszAniName = scroll_down_btn;
arg.lpszID = "scroll_btn_down";
pFrame = KSpriteManager::GetManager()->GetResSprite(m_sSprName.c_str(), scroll_down_btn.c_str(), 0);
if(NULL == pFrame)
assert( false && "Cannot Find Res Frame");
nSizeY = pFrame->GetSizeY();
nTop -= nSizeY;
arg.rcRect = KRect(m_rcRegion.left, nTop,-1,-1);
m_pScrollBarBtn[SCROLL_BAR_DOWN] = reinterpret_cast<KUIControlSimpleButton*>( m_pManager->CreateControl( arg ) );
m_nThumbBottom = m_rcRegion.bottom - (nTop - nSizeY - SCROLL_BTN_GAP); // Thumb Bottom
m_rcRegion.top += m_nThumbTop;
m_rcRegion.bottom -= m_nThumbTop;
// 세로로 세조각
_reArrangeRect( false );
// Thumb Btn 생성
_ResizeThumb();
// Thumb Setting
_EvalThumbRect();
//char str[512] = {NULL, };
//sprintf( str, "RC_Top:%d, Thumb_Top:%d", m_rcRegion.top, m_pThumbBtn->GetRect().top );
//::MessageBox( g_hWnd, str, "", MB_OK );
}
void KUIControlVScrollEx::_EvalPosition(int x, int y)
{
KRect rcThumbRect = m_pThumbBtn->GetRect();
DWORD dwHeight = m_rcRegion.GetHeight() - ( (rcThumbRect.GetHeight() + 1) / 2);
// 젤 위에서부터 이동된 거리
int nHeightDiff = y - m_rcRegion.top;
if(nHeightDiff < 0)
nHeightDiff = 0;
// 비율
float fPosRatio = (float)nHeightDiff / (float)dwHeight;
if(fPosRatio > 1.0f)
fPosRatio = 1.0f;
m_nCurrentPos = (m_dwMaxRange - 1) * fPosRatio;
InvalidateWnd();
}
void KUIControlVScrollEx::_EvalPositionFromThumRect()
{
const KRect& rcThumbRect = m_pThumbBtn->GetRect();
DWORD dwHeightDiff = m_rcRegion.GetHeight() - rcThumbRect.GetHeight();
float fPosRatio = 0.f;
if( dwHeightDiff > 0)
fPosRatio = (float) (rcThumbRect.top - m_rcRegion.top) / (float)dwHeightDiff;
if( m_dwMaxRange > 1)
fPosRatio += 1 / (float)( m_dwMaxRange - 1) / 2.0f;
m_nCurrentPos = (m_dwMaxRange - 1) * fPosRatio;
InvalidateWnd();
}
void KUIControlVScrollEx::_EvalThumbRect()
{
KRect rcThumbRect = m_pThumbBtn->GetRect();
DWORD dwHeight = m_rcRegion.GetHeight();
DWORD dwThumbHeight = rcThumbRect.GetHeight();
float fPosRatio = 0.0f;
if(m_dwMaxRange > 1)
fPosRatio = (float)m_nCurrentPos / (float)(m_dwMaxRange - 1);
DWORD dwAddHeight = (dwHeight - dwThumbHeight) * fPosRatio;
m_pThumbBtn->MovePos(m_rcRegion.left, m_rcRegion.top + dwAddHeight);
InvalidateWnd();
}
void KUIControlVScrollEx::_SetThumbRect(int x, int y)
{
int nMaxPosY = m_rcRegion.bottom - m_pThumbBtn->GetRect().GetHeight();
y -= m_ptMovingOffset.y;
y = max(y,m_rcRegion.top);
y = min(y,nMaxPosY);
m_pThumbBtn->MovePos(m_rcRegion.left, y);
InvalidateWnd();
}
void KUIControlVScrollEx::_ResizeThumb()
{
int nScrollUnit = (float)m_rcRegion.GetHeight() / SCROLL_BAR_UNIT_DEVIDER;
int nNewHeight = m_rcRegion.GetHeight() - nScrollUnit * ( (int)m_dwMaxRange - 1 );
nNewHeight = max( nNewHeight, 0);
KRect rcRect = m_pThumbBtn->GetRect();
rcRect.bottom = rcRect.top + nNewHeight;
m_pThumbBtn->Resize(rcRect);
if( m_rcRegion.GetHeight() <= rcRect.GetHeight() )
{
m_pThumbBtn->SetShow( false);
return;
}
else
{
m_pThumbBtn->SetShow( true );
}
InvalidateWnd();
//int nScrollUnit = (float)m_rcRegion.GetHeight() / SCROLL_BAR_UNIT_DEVIDER;
//int nNewHeight = m_rcRegion.GetHeight() - nScrollUnit * ( (int)m_dwMaxRange - 1 );
//nNewHeight = max( nNewHeight, 0);
//KRect rcRect = m_pThumbBtn->GetRect();
//
//rcRect.top += m_nThumbTop;
//
//rcRect.bottom = rcRect.top + nNewHeight - m_nThumbBottom;
//m_pThumbBtn->Resize(rcRect);
//if( m_rcRegion.GetHeight() <= rcRect.GetHeight() )
//{
// m_pThumbBtn->SetShow( false);
// return;
//}
//else
//{
// m_pThumbBtn->SetShow( true );
//}
//InvalidateWnd();
}
void KUIControlVScrollEx::_CalScrollBarRect(KRect* pInOutRect)
{
SetVScrollName();
KResSprite * pFrame = KSpriteManager::GetManager()->GetResSprite(m_sSprName.c_str(),
scroll_home_btn.c_str() , 0);
if(NULL == pFrame)
assert( false && "Cannot Find Res Frame");
// int nSizeY = pFrame->GetSizeY();
pInOutRect->top += /*nSizeY +*/ SCROLL_BTN_GAP;
pInOutRect->bottom -= /*nSizeY +*/ SCROLL_BTN_GAP;
//pInOutRect->left =
//pInOutRect->right = pInOutRect->left + pFrame->GetSizeX();
InvalidateWnd();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// KUIControlVScrollSmallEx Implement
//
// Home, End Key 를 제외하곤 위의 스크롤과 동일한 기능.
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
namespace
{
KUIWnd* VScrollSmallExCreator()
{
return new KUIControlVScrollSmallEx;
}
bool bVScrollSmallExRegister = KUIFactory::GetInstance()->RegisterCreator( VScrollSmallExCreator, "v_scrollSmallEx");
}
KUIControlVScrollSmallEx::KUIControlVScrollSmallEx()
{
scroll_down_btn = "common_scroll_trim_titanium_down_mini";
scroll_up_btn = "common_scroll_trim_titanium_up_mini";
scroll_thumb = "common_scroll_trim_titanium_bar_mini";
scroll_back = "common_scroll_trim_titanium_bg_mini_04";
m_nThumbTop = 0;
m_nThumbBottom = 0;
}
void KUIControlVScrollSmallEx::SetVScrollName()
{
/* if( strcmp( m_sAniName.c_str(), scroll_back.c_str() ) !=0 )
{
int aniLen = strlen(m_sAniName.c_str());
int defaultLen = strlen(scroll_back.c_str());
if( aniLen <= defaultLen )
return;
const char *cStr = strstr(m_sAniName.c_str(), scroll_back.c_str()) + defaultLen;
scroll_down_btn += cStr;
scroll_up_btn += cStr;
scroll_thumb += cStr;
} */
// 2010. 7. 20 marine
// nui의 ani에 이름이 여러개가 들어가게 변경
// 여러개 들어간 이름들을 파싱하는 부분
int iEnd,iStart,iCnt = 0;
std::string buf = m_buf;
while(1)
{
iStart = 0;
iEnd = buf.find("/");
if(iEnd == -1)
{
strAniName[iCnt] = buf;
break;
}
strAniName[iCnt] = buf.substr(iStart,iEnd);
iStart = iEnd++;
buf = buf.substr(iStart+1, buf.size());
iCnt++;
}
// 리스트에 저장되는 순서
if(strAniName[0].compare("") == 0) m_sAniName = "common_scroll_trim_titanium_bg_mini_04";
else m_sAniName = strAniName[0];
if(strAniName[1].compare("") == 0) scroll_thumb = "common_scroll_trim_titanium_bar_mini";
else scroll_thumb = strAniName[1];
if(strAniName[2].compare("") == 0) scroll_up_btn = "common_scroll_trim_titanium_up_mini";
else scroll_up_btn = strAniName[2];
if(strAniName[3].compare("") == 0) scroll_down_btn = "common_scroll_trim_titanium_down_mini";
else scroll_down_btn = strAniName[3];
}
extern HWND g_hWnd;
void KUIControlVScrollSmallEx::_initControl()
{
if ( m_sAniName.empty() )
m_sAniName = scroll_back;
m_buf = m_sAniName;
KUIControlScrollBase::_initControl();
SetVScrollName();
// Thumb생성
KUIWND_CREATE_ARG arg;
arg.lpszSprName = m_sSprName.c_str();
arg.lpszAniName = scroll_thumb;
arg.lpszClassName = "button";
arg.lpszID = "_thumb_btn";
arg.pParent = this;
arg.rcRect = m_rcRegion;
arg.rcRect.right = -1;
arg.rcRect.bottom = -1;
arg.dwStyle = KSTYLE_BUTTON_VERTICAL;
m_pThumbBtn = reinterpret_cast<KUIControlButton*>( m_pManager->CreateControl( arg ));
int nTop = 0; // 버튼들의 위치지정용.
// Scroll UP Btn 생성
arg.lpszClassName = "simplebutton";
arg.lpszSprName = m_sSprName.c_str();
arg.lpszAniName = scroll_up_btn;
arg.lpszID = "scroll_btn_up";
arg.dwStyle = 0;
arg.pParent = this;
KResSprite * pFrame = KSpriteManager::GetManager()->GetResSprite(m_sSprName.c_str(), scroll_up_btn.c_str(), 0);
if(NULL == pFrame)
assert( false && "Cannot Find Res Frame");
int nSizeY = pFrame->GetSizeY();
nTop = m_rcRegion.top;
arg.rcRect = KRect(m_rcRegion.left, nTop, -1,-1);
m_pScrollBarBtn[ SCROLL_BAR_UP ] = reinterpret_cast<KUIControlSimpleButton*>( m_pManager->CreateControl( arg ) );
m_nThumbTop += nSizeY;
// Scroll DOWN Btn 생성
arg.lpszAniName = scroll_down_btn;
arg.lpszID = "scroll_btn_down";
pFrame = KSpriteManager::GetManager()->GetResSprite(m_sSprName.c_str(), scroll_down_btn.c_str(), 0);
if(NULL == pFrame)
assert( false && "Cannot Find Res Frame");
nSizeY = pFrame->GetSizeY();
nTop = m_rcRegion.bottom - nSizeY;
arg.rcRect = KRect(m_rcRegion.left, nTop,-1,-1);
m_pScrollBarBtn[SCROLL_BAR_DOWN] = reinterpret_cast<KUIControlSimpleButton*>( m_pManager->CreateControl( arg ) );
m_nThumbBottom = m_rcRegion.bottom - (nTop - nSizeY - SCROLL_BTN_GAP); // Thumb Bottom
m_rcRegion.top += m_nThumbTop;
m_rcRegion.bottom -= m_nThumbTop;
// 세로로 세조각
_reArrangeRect( false );
// Thumb Btn 생성
_ResizeThumb();
// Thumb Setting
_EvalThumbRect();
}
void KUIControlVScrollSmallEx::_EvalPosition(int x, int y)
{
KRect rcThumbRect = m_pThumbBtn->GetRect();
DWORD dwHeight = m_rcRegion.GetHeight() - ( (rcThumbRect.GetHeight() + 1) / 2);
// 젤 위에서부터 이동된 거리
int nHeightDiff = y - m_rcRegion.top;
if(nHeightDiff < 0)
nHeightDiff = 0;
// 비율
float fPosRatio = (float)nHeightDiff / (float)dwHeight;
if(fPosRatio > 1.0f)
fPosRatio = 1.0f;
m_nCurrentPos = (m_dwMaxRange - 1) * fPosRatio;
InvalidateWnd();
}
void KUIControlVScrollSmallEx::_EvalPositionFromThumRect()
{
const KRect& rcThumbRect = m_pThumbBtn->GetRect();
DWORD dwHeightDiff = m_rcRegion.GetHeight() - rcThumbRect.GetHeight();
float fPosRatio = 0.f;
if( dwHeightDiff > 0)
fPosRatio = (float) (rcThumbRect.top - m_rcRegion.top) / (float)dwHeightDiff;
if( m_dwMaxRange > 1)
fPosRatio += 1 / (float)( m_dwMaxRange - 1) / 2.0f;
m_nCurrentPos = (m_dwMaxRange - 1) * fPosRatio;
InvalidateWnd();
}
void KUIControlVScrollSmallEx::_EvalThumbRect()
{
KRect rcThumbRect = m_pThumbBtn->GetRect();
DWORD dwHeight = m_rcRegion.GetHeight();
DWORD dwThumbHeight = rcThumbRect.GetHeight();
float fPosRatio = 0.0f;
if(m_dwMaxRange > 1)
fPosRatio = (float)m_nCurrentPos / (float)(m_dwMaxRange - 1);
DWORD dwAddHeight = (dwHeight - dwThumbHeight) * fPosRatio;
m_pThumbBtn->MovePos(m_rcRegion.left, m_rcRegion.top + dwAddHeight);
InvalidateWnd();
}
void KUIControlVScrollSmallEx::_SetThumbRect(int x, int y)
{
int nMaxPosY = m_rcRegion.bottom - m_pThumbBtn->GetRect().GetHeight();
y -= m_ptMovingOffset.y;
y = max(y,m_rcRegion.top);
y = min(y,nMaxPosY);
m_pThumbBtn->MovePos(m_rcRegion.left, y);
InvalidateWnd();
}
void KUIControlVScrollSmallEx::_ResizeThumb()
{
int nScrollUnit = (float)m_rcRegion.GetHeight() / SCROLL_BAR_UNIT_DEVIDER;
int nNewHeight = m_rcRegion.GetHeight() - nScrollUnit * ( (int)m_dwMaxRange - 1 );
nNewHeight = max( nNewHeight, 0);
KRect rcRect = m_pThumbBtn->GetRect();
rcRect.bottom = rcRect.top + nNewHeight;
m_pThumbBtn->Resize(rcRect);
if( m_rcRegion.GetHeight() <= rcRect.GetHeight() )
{
m_pThumbBtn->SetShow( false);
return;
}
else
{
m_pThumbBtn->SetShow( true );
}
InvalidateWnd();
}
void KUIControlVScrollSmallEx::_CalScrollBarRect(KRect* pInOutRect)
{
SetVScrollName();
KResSprite * pFrame = KSpriteManager::GetManager()->GetResSprite(m_sSprName.c_str(),
scroll_up_btn.c_str() , 0);
if(NULL == pFrame)
assert( false && "Cannot Find Res Frame");
// int nSizeY = pFrame->GetSizeY();
pInOutRect->top += /*nSizeY +*/ SCROLL_BTN_GAP;
pInOutRect->bottom -= /*nSizeY +*/ SCROLL_BTN_GAP;
//pInOutRect->left =
//pInOutRect->right = pInOutRect->left + pFrame->GetSizeX();
InvalidateWnd();
}