Files
2026-06-01 12:46:52 +02:00

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() ) );
}
}