#include "stdafx.h" #include "KUIControlScroll.h" #include "KUIWndManager.h" #include "KUIControlButton.h" #include "KUITextureManager.h" #include "KResourceManager.h" //#include //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 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( 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( 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( 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( 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( 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( 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( 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( 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( 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( 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( 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( 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( 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( 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(); }