1468 lines
37 KiB
C++
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();
|
|
} |