132 lines
3.1 KiB
C++
132 lines
3.1 KiB
C++
#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<int>( log10( static_cast<float>( dwNumber ) ) ) + 1 : 1;
|
|
|
|
// 자리별 숫자
|
|
std::vector<DWORD> vtNumber;
|
|
vtNumber.resize( m_nPrimitiveCount );
|
|
|
|
for(int i = 0; i < m_nPrimitiveCount; ++i)
|
|
{
|
|
DWORD dwPow= static_cast<DWORD> ( 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() ) );
|
|
}
|
|
}
|