Files
Leviathan/Client/Game/engine/Ui/Controls/KUIControlStatic.cpp
T
2026-06-01 12:46:52 +02:00

581 lines
13 KiB
C++

#include "stdafx.h"
#include "KUIControlStatic.h"
#include "KResourceManager.h"
#include "KUIWndManager.h"
#include "SLog.h"
using namespace KUI_MESSAGE;
#ifdef _COUNTRY_ME_
#define TEXT_PHRASE KTextLayout2
#else
#define TEXT_PHRASE KTextPhrase
#endif
std::string StrFormat( const char* szString, ... )
{
char szBuf[1024];
va_list va;
va_start( va, szString );
_vsnprintf( szBuf, _countof(szBuf), szString, va );
va_end( va );
return std::string( szBuf );
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// KUIControlStatic Implement
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
namespace
{
KUIWnd* Creator()
{
return new KUIControlStatic;
}
bool bRegister = KUIFactory::GetInstance()->RegisterCreator( Creator, "static");
}
KUIControlStatic::KUIControlStatic()
: m_bEnableOption(false)
{
}
KUIControlStatic::~KUIControlStatic()
{
}
void KUIControlStatic::Create(KUIWND_CREATE_ARG& CREATE_ARG)
{
m_bUseHorizonPiece = !(CREATE_ARG.dwStyle & KSTYLE_STRETCH_VERTICAL);
KUIControl::Create( CREATE_ARG);
// 스태틱은 무조건 NO_GET
m_dwFlag |= KFLAG_NO_GET_MESSAGE;
}
void KUIControlStatic::Render(KViewportObject * pViewport, bool isFront)
{
KUIControl::Render(pViewport, isFront);
}
void KUIControlStatic::OnChangeCaptionNotify()
{
if( !IsDisable() && m_bEnableOption )
{
size_t cpos = 0;
while( ( cpos = m_sCaption.find( "<#" ) ) != m_sCaption.npos )
{
m_sCaption.erase( cpos, 9 );
}
std::string strNewCaption = m_strEnableColor.c_str();
strNewCaption += m_sCaption;
m_sCaption = strNewCaption;
}
KUIControl::OnChangeCaptionNotify();
}
// 2011.09.30 : servantes : 플래그 설정을 바꾸어 메세지를 받는다
// 기본은 마우스 메세지를 받지 못하지만 특정 컨트롤들만 받을 수 있게끔 하기 위해서 함수 추가
void KUIControlStatic::SetEnableMouseClickMessage(bool bEnable)
{
if(bEnable == true)
{
m_dwFlag = 0;
}
else
{
m_dwFlag |= KFLAG_NO_GET_MESSAGE;
}
}
// 2011.09.30 : servantes : 스태틱 컨트롤에 왼,오른 클릭 메세지 받게 함수 추가
DWORD KUIControlStatic::OnMouseMessage(DWORD dwMessage, int x, int y)
{
DWORD dwRet = KUIControl::OnMouseMessage(dwMessage,x,y);
if(KMR_NO_GET & dwRet)
return dwRet;
if(IsInRect(x,y))
{
switch(dwMessage)
{
case KLBUTTON_DOWN:
PumpUpMessage(GetID(), KICON_CLICK, x, y);
break;
case KRBUTTON_DOWN:
PumpUpMessage(GetID(), KICON_RCLICK, x, y);
break;
default:
break;
}
}
else
{
if ( dwMessage == KLBUTTON_UP )
{
m_pManager->ReleaseCapture( this );
}
}
return dwRet;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// KUIControlIconStatic Implement
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
namespace
{
KUIWnd* IconStaticCreator()
{
return new KUIControlIconStatic;
}
bool bIconStaticRegister = KUIFactory::GetInstance()->RegisterCreator( IconStaticCreator, "iconstatic");
}
KUIControlIconStatic::KUIControlIconStatic()
: m_bReSizeRes(true)
{
SetButtonState( KICONBUTTON_NORMAL );
m_bLeftButton = false;
_registerSprite(&m_prIcon);
}
KUIControlIconStatic::~KUIControlIconStatic()
{
}
void KUIControlIconStatic::SetButtonState( DWORD State )
{
m_dwButtonState = State;
InvalidateWnd();
}
void KUIControlIconStatic::SetIcon( const char* pSprName/* = NULL*/, const char* pAniName /* = NULL */ )
{
if( NULL != pAniName )
{
//같으면서, 리소스가 설정 되어 있으면 재설정 하지 않는다.
if( !_stricmp( m_sAniName.c_str(), pAniName ) && m_prIcon.IsUse() )
return;
m_sAniName = pAniName;
}
else
{
m_sAniName = "";
}
if( m_sAniName.empty() )
{
m_rcCaptionArea = m_rcRegion;
SetShow( false );
return;
}
SetBack(pSprName, pAniName);
InvalidateWnd();
}
void KUIControlIconStatic::SetIconColor( const KColor& color )
{
if( m_prIcon.IsUse() )
{
m_prIcon.SetColor( color );
}
}
DWORD KUIControlIconStatic::OnMouseMessage(DWORD dwMessage, int x, int y)
{
DWORD dwRet = KUIControl::OnMouseMessage(dwMessage,x,y);
if(KMR_NO_GET & dwRet)
return dwRet;
if( m_dwButtonState == KICONBUTTON_DISABLE )
return dwRet;
if(IsInRect(x,y))
{
switch(dwMessage)
{
case KMOUSE_MOVE:
if( m_dwButtonState != KICONBUTTON_DOWN )
{
if ( m_bLeftButton )
SetButtonState( KICONBUTTON_DOWN );
else SetButtonState( KICONBUTTON_ACTIVATE );
}
break;
case KLBUTTON_DOWN:
m_bLeftButton = true;
if( (m_dwFlag & KFLAG_CAN_DRAG) )
{
PumpUpMessage(GetID(), KICON_PRESSING, 0,0);
}
else
{
if( !(GetFlag() & KFLAG_GET_PASS_MESSAGE) )
m_pManager->SetCapture( this );
}
SetButtonState( KICONBUTTON_DOWN );
break;
case KLBUTTON_UP:
m_bLeftButton = false;
if ( !(m_dwFlag & KFLAG_CAN_DRAG) )
m_pManager->ReleaseCapture( this );
if( m_dwButtonState == KICONBUTTON_DOWN )
PumpUpMessage(GetID(), KICON_CLICK, 0,0);
SetButtonState( KICONBUTTON_ACTIVATE );
break;
case KLBUTTON_DBLCLK:
m_bLeftButton = false;
PumpUpMessage(GetID(), KICON_DBLCLK, 0,0);
SetButtonState( KICONBUTTON_ACTIVATE );
break;
case KRBUTTON_DOWN: //servnates 2011.02.23
m_bLeftButton = false;
PumpUpMessage(GetID(), KICON_RCLICK, x, y);
SetButtonState( KICONBUTTON_ACTIVATE );
break;
default:
break;
}
}
else
{
if ( dwMessage == KLBUTTON_UP )
{
m_bLeftButton = false;
m_pManager->ReleaseCapture( this );
}
// 마우스 범위를 벗어나면 Normal로 돌린다.
if(m_dwButtonState == KICONBUTTON_ACTIVATE || m_dwButtonState == KICONBUTTON_DOWN)
SetButtonState( KICONBUTTON_NORMAL );
}
return dwRet;
}
void KUIControlIconStatic::OnChagneBackNotify()
{
KResSprite* pFrame = _getSpriteSet()->GetSpriteRes(m_sAniName.c_str(),m_nFrameIndex);
if( !pFrame )
{
SDEBUGLOG( "[Function = %s]", __FUNCTION__);
SDEBUGLOG( "Cannot find sprite : %s / frame index : %d" ,m_sAniName.c_str(),m_nFrameIndex);
// assert( false && "Cannot find Sprite Res Frame" );
return;
}
if( m_bReSizeRes )
{
m_rcRegion.right = m_rcRegion.left + pFrame->GetSizeX();
m_rcRegion.bottom = m_rcRegion.top + pFrame->GetSizeY();
}
m_prIcon.SetRes( pFrame );
m_prIcon.SetPosition( m_rcRegion.left, m_rcRegion.top, m_fZPos );
if( !m_bReSizeRes )
m_prIcon.SetTargetSize( m_rcRegion.GetWidth(), m_rcRegion.GetHeight() );
m_rcCaptionArea = m_rcRegion;
#ifdef _KUI_INVALIDATION
//인벨리데이트로 추가된부분 주의요망
KUIControl::OnChagneBackNotify();
#endif
}
void KUIControlIconStatic::_initControl()
{
SetIcon( m_sSprName.c_str(), m_sAniName.c_str() );
}
// bintitle. 2010.04.29
void KUIControlIconStatic::SetResSprite( KResSprite * pRes )
{
m_prIcon.SetRes( pRes );
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// KUIControlRankIconStatic Implement
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
namespace
{
KUIWnd* RankIconStaticCreator()
{
return new KUIControlRankIconStatic;
}
bool bRankIconStaticRegister = KUIFactory::GetInstance()->RegisterCreator( RankIconStaticCreator, "rankiconstatic");
}
KUIControlRankIconStatic::KUIControlRankIconStatic()
{
}
KUIControlRankIconStatic::~KUIControlRankIconStatic()
{
}
void KUIControlRankIconStatic::SetSubIcon( int nCnt, const char* pSprName/* = NULL*/, const char* pAniName/* = NULL*/ )
{
}
void KUIControlRankIconStatic::SetSubIconAniName( int nIndex, const char* pAniName/* = NULL*/ )
{
}
void KUIControlRankIconStatic::_initControl()
{
SetIcon( m_sSprName.c_str(), m_sAniName.c_str() );
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// KUIControlMultiIcon Implement
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
namespace
{
KUIWnd* MultiIconCreator()
{
return new KUIControlMultiIcon;
}
bool bMultiIconRegister = KUIFactory::GetInstance()->RegisterCreator( MultiIconCreator, "multi_icon");
}
KUIControlMultiIcon::KUIControlMultiIcon()
{
SetButtonState( KICONBUTTON_NORMAL );
m_bLeftButton = false;
// 기본적으로 Layer 하나는 존재.
m_vtPrIcon.push_back( new KSpritePrimitive);
m_vtIconInfo.push_back( ICON_INFO() );
_registerSprite(m_vtPrIcon[0]);
}
KUIControlMultiIcon::~KUIControlMultiIcon()
{
SAFE_DELETE_VECTOR(m_vtPrIcon);
m_vtIconInfo.clear();
}
void KUIControlMultiIcon::SetButtonState( DWORD State )
{
m_dwButtonState = State;
InvalidateWnd();
}
void KUIControlMultiIcon::SetIconLayer(int nCount)
{
/// 현재 구조상 SetIconLayer는 한번만 호출되어야 되는데, 여러번 호출 가능하도록 되어 있다.
/// 이럴경우에 데이타가 꼬여서 이상동작 하는 경우가 생김(ex 윈도우 이동 같은 경우)
/// 내부 구조를 정확하게 몰라서 예외 처리만 해둠 - prodongi
if (1 != m_vtPrIcon.size())
{
return ;
}
for(int i = 1 ; i < nCount; ++i)
{
m_vtPrIcon.push_back(new KSpritePrimitive);
_registerSprite(m_vtPrIcon[i]);
}
m_vtIconInfo.resize( nCount );
}
int KUIControlMultiIcon::GetIconLayerCount() const // sonador #2.1.2.4.3
{
return m_vtPrIcon.size();
}
void KUIControlMultiIcon::SetIcon(int nLayer, const char* pSprName, LPCSTR lpszAniName)
{
if(nLayer >= m_vtPrIcon.size() || nLayer < 0)
{
assert(false && "Index Error");
return;
}
m_sAniName = (NULL != lpszAniName) ? lpszAniName : "";
m_vtIconInfo[nLayer].sSprName = (NULL != pSprName) ? pSprName : "";
m_vtIconInfo[nLayer].sAniName = m_sAniName;
KSpritePrimitive* pPrimitive = m_vtPrIcon[nLayer];
if( m_sAniName.empty() )
{
std::string strOutput;
XStringUtil::Format(strOutput, "[SetIcon debug] m_sAniName is empty; layer: %d; pSprName: %s; lpszAniName: %s\n", nLayer, pSprName, lpszAniName);
_oprint(strOutput.c_str());
pPrimitive->SetRenderEnable( false);
return;
}
if( NULL == pSprName )
{
// assert(false && "Spr NULL");
return;
}
SPRITE_SET * pSprSet = KSpriteManager::GetManager()->GetSpriteSet( pSprName );
if( pSprSet == NULL )
{
std::string strOutput;
XStringUtil::Format(strOutput, "[SetIcon debug] pSprSet is NULL; layer: %d; pSprName: %s; lpszAniName: %s\n", nLayer, pSprName, lpszAniName);
_oprint(strOutput.c_str());
pPrimitive->SetRenderEnable( false);
return;
}
KResSprite* pFrame = pSprSet->GetSpriteRes(m_sAniName.c_str(),0);
if( !pFrame )
{
std::string strOutput;
XStringUtil::Format(strOutput, "[SetIcon debug] Cannot find Sprite Res Frame; layer: %d; pSprName: %s; lpszAniName: %s\n", nLayer, pSprName, lpszAniName);
_oprint(strOutput.c_str());
return;
}
m_rcRegion.right = m_rcRegion.left + pFrame->GetSizeX();
m_rcRegion.bottom = m_rcRegion.top + pFrame->GetSizeY();
m_rcCaptionArea = m_rcRegion;
pPrimitive->SetRes( pFrame );
pPrimitive->SetPosition( m_rcRegion.left, m_rcRegion.top, m_fZPos );
pPrimitive->SetRenderEnable( true);
InvalidateWnd();
}
void KUIControlMultiIcon::_initControl()
{
SetIcon( m_nFrameIndex,m_sSprName.c_str(), m_sAniName.c_str() );
}
const KUIControlMultiIcon::ICON_INFO& KUIControlMultiIcon::GetIconInfoByLayer(int nLayer) const
{
if(nLayer >= m_vtIconInfo.size() || nLayer < 0)
{
assert(false && "Index Error");
}
return m_vtIconInfo[nLayer];
}
DWORD KUIControlMultiIcon::OnMouseMessage(DWORD dwMessage, int x, int y)
{
DWORD dwRet = KUIControl::OnMouseMessage(dwMessage,x,y);
if(KMR_NO_GET & dwRet)
return dwRet;
if( m_dwButtonState == KICONBUTTON_DISABLE )
return dwRet;
if(IsInRect(x,y))
{
switch(dwMessage)
{
case KMOUSE_MOVE:
if( m_dwButtonState != KICONBUTTON_DOWN )
{
if ( m_bLeftButton )
SetButtonState( KICONBUTTON_DOWN );
else SetButtonState( KICONBUTTON_ACTIVATE );
}
break;
case KLBUTTON_DOWN:
m_bLeftButton = true;
if( (m_dwFlag & KFLAG_CAN_DRAG) )
PumpUpMessage(GetID(), KICON_PRESSING, 0,0);
else
{
if( !(GetFlag() & KFLAG_GET_PASS_MESSAGE) )
m_pManager->SetCapture( this );
}
SetButtonState( KICONBUTTON_DOWN );
break;
case KLBUTTON_UP:
m_bLeftButton = false;
if ( !(m_dwFlag & KFLAG_CAN_DRAG) )
m_pManager->ReleaseCapture( this );
if( m_dwButtonState == KICONBUTTON_DOWN )
PumpUpMessage(GetID(), KICON_CLICK, 0,0);
SetButtonState( KICONBUTTON_ACTIVATE );
break;
case KLBUTTON_DBLCLK:
m_bLeftButton = false;
PumpUpMessage(GetID(), KICON_DBLCLK, 0,0);
SetButtonState( KICONBUTTON_ACTIVATE );
break;
case KRBUTTON_DOWN:
m_bLeftButton = false;
PumpUpMessage(GetID(), KICON_RCLICK, x,y);
SetButtonState( KICONBUTTON_ACTIVATE );
break;
default:
break;
}
}
else
{
if ( dwMessage == KLBUTTON_UP )
{
m_bLeftButton = false;
m_pManager->ReleaseCapture( this );
}
// 마우스 범위를 벗어나면 Normal로 돌린다.
if(m_dwButtonState == KICONBUTTON_ACTIVATE || m_dwButtonState == KICONBUTTON_DOWN)
SetButtonState( KICONBUTTON_NORMAL );
}
return dwRet;
}
void KUIControlMultiIcon::OnChagneBackNotify()
{
SetIcon(m_nFrameIndex, 0, m_sAniName.c_str());
#ifdef _KUI_INVALIDATION
//인벨리데이트로 추가된부분 주의요망
KUIControl::OnChagneBackNotify();
#endif
}