#include "stdafx.h" #include "KPrimitiveSprite.h" #include "KUIControlNumber.h" #include "KResourceManager.h" namespace { KUIWnd* NumberControlCreator() { return new KUIControlNumber; } bool bNumberControlRegister = KUIFactory::GetInstance()->RegisterCreator( NumberControlCreator, "number"); LPCSTR NUMBER_ANI_NAME = "damegefont"; } KUIControlNumber::KUIControlNumber() { m_nPrimitiveCount = 0; m_nGap = 0; m_dwNumber = 0; m_sAniName = NUMBER_ANI_NAME; } KUIControlNumber::~KUIControlNumber() { SAFE_DELETE_VECTOR( m_vtPrNumberAdoptor ); } void KUIControlNumber::SetGap(int nGap) { if( m_nGap != nGap ) { m_nGap = nGap; InvalidateWnd(); } } void KUIControlNumber::SetNumber(DWORD dwNumber) { if( m_dwNumber == dwNumber ) return; // 자릿수 카운트 m_nPrimitiveCount = (dwNumber > 0) ? static_cast( log10( static_cast( dwNumber ) ) ) + 1 : 1; // 자리별 숫자 std::vector vtNumber; vtNumber.resize( m_nPrimitiveCount ); for(int i = 0; i < m_nPrimitiveCount; ++i) { DWORD dwPow= static_cast ( pow( 10.f , i) ); DWORD dwRes = dwNumber / dwPow; vtNumber.at(i) = dwRes % 10; } int nNewCount = m_nPrimitiveCount - int(m_vtPrNumberAdoptor.size()); // 부족한 자리수 만큼 Primitive 생성 for(int i = 0;i < nNewCount; ++i) { KSpritePrimitive* pPr = new KSpritePrimitive; m_vtPrNumberAdoptor.push_back( pPr); _registerSprite( pPr); } // 1의 자리부터 생성 int nTotalLength = 0; for(int i = 0; i < m_nPrimitiveCount; ++i) { KResSprite* pFrame = _getSpriteSet()->GetSpriteRes( m_sAniName.c_str(), vtNumber.at( i ) ); if(NULL == pFrame) { // assert( false && "Invalid Sprite Frame"); _oprint( "KUIControlNumber::SetNumber - Invalid Sprite Frame\n" ); continue; } nTotalLength += pFrame->GetSizeX(); m_vtPrNumberAdoptor.at( i )->SetRes( pFrame ); } // Gap 만큼 더해주자 if( m_nPrimitiveCount > 0) nTotalLength += m_nGap * ( m_nPrimitiveCount - 1 ); int nXPos = m_rcRegion.left; if( m_dwStyle & KSTYLE_NUMBER_CENTER) nXPos = m_rcRegion.left + ( m_rcRegion.GetWidth() - nTotalLength ) / 2; else if(m_dwStyle & KSTYLE_NUMBER_RIGHT) nXPos = m_rcRegion.right - nTotalLength; // 맨 앞자리부터 배열 int nWidth = 0; for(int i = m_nPrimitiveCount - 1; i >= 0; --i) { if( m_vtPrNumberAdoptor.at( i )->GetRes() == NULL ) continue; int nFrameSizeX = m_vtPrNumberAdoptor.at( i )->GetRes()->GetSizeX(); m_vtPrNumberAdoptor.at( i )->SetPosition( nXPos, m_rcRegion.top, m_fZPos ); nXPos += nFrameSizeX + m_nGap; nWidth += nFrameSizeX + m_nGap; } nWidth = m_nPrimitiveCount > 0 ? (nWidth - m_nGap) : nWidth; m_rcRegion.right = m_rcRegion.left + nWidth; // Rendering State for(int i = 0; i < m_vtPrNumberAdoptor.size(); ++i) { m_vtPrNumberAdoptor.at( i )->SetRenderEnable( i < m_nPrimitiveCount ); } InvalidateWnd(); } void KUIControlNumber::UpdateBack() { //SAFE_DELETE_VECTOR( m_vtPrNumberAdoptor ); //m_vtPrNumberAdoptor.clear(); } void KUIControlNumber::_initControl() { // 쓸데없이 Back은 만들지 않는다. if( false == m_sCaption.empty()) { SetNumber( ::atoi( m_sCaption.c_str() ) ); } }