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

130 lines
3.4 KiB
C++

#include "stdafx.h"
#include "KPrimitiveSprite.h"
#include "KViewport.h"
#include "KUIControlTitleBar.h"
#include "KResourceManager.h"
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// KUIControlTitleBar Implement
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
namespace
{
KUIWnd* Creator()
{
return new KUIControlTitleBar;
}
bool bRegister = KUIFactory::GetInstance()->RegisterCreator( Creator, "titlebar");
}
KUIControlTitleBar::KUIControlTitleBar()
{
for(int i = 0 ; i < 3; ++i)
{
_registerSprite(&m_TitleSprite[i]);
}
_registerSprite(&m_prCaption);
}
KUIControlTitleBar::~KUIControlTitleBar()
{
}
void KUIControlTitleBar::_initControl()
{
SPRITE_SET* pSet = _getSpriteSet();
if( !pSet)
{
assert( false && "Cannot find Sprite Set");
return;
}
KResSprite* pFrameLeft = pSet->GetSpriteRes( m_sAniName.c_str(), 0 );
KResSprite* pFrameCenter = pSet->GetSpriteRes( m_sAniName.c_str(), 1 );
KResSprite* pFrameRight = pSet->GetSpriteRes( m_sAniName.c_str(), 2 );
if( !pFrameLeft || !pFrameRight )
{
assert( false && "Cannot find Sprite Res Frame" );
return;
}
m_rcRegion.bottom = m_rcRegion.top + pFrameLeft->GetSizeY();
m_rcRegion.right = m_rcRegion.left + pFrameLeft->GetSizeX() + pFrameLeft->GetSizeX()* .5f + pFrameRight->GetSizeX();
if( m_dwStyle & KSTYLE_SPR_CAPTION)
{
KResSprite* pFrameCaption = pSet->GetSpriteRes( m_sCaption.c_str(), 0 );
if( NULL != pFrameCaption)
{
m_prCaption.SetRes( pFrameCaption );
int nSizeX = pFrameCaption->GetSizeX(); int nSizeY = pFrameCaption->GetSizeY();
m_rcRegion.right += nSizeX;
m_prCaption.SetPosition( m_rcRegion.left + (m_rcRegion.GetWidth() - nSizeX) * .5f,
m_rcRegion.top + (m_rcRegion.GetHeight() - nSizeY) * .5f, m_fZPos);
}
}
else
{
DWORD dwCapwith = m_rcRegion.GetWidth();
if ( m_sCaption.size() > 0 )
dwCapwith = KTextPhrase::GetStringSize( m_sCaption.c_str(), dwCapwith).width;
else dwCapwith = 4;
m_rcRegion.right += dwCapwith;
}
for ( int j = 0 ; j<3 ; ++j )
{
KResSprite* pFrame = _getSpriteSet()->GetSpriteRes( m_sAniName.c_str(), j );
m_TitleSprite[j].SetRes( pFrame );
switch( j )
{
case 0: m_TitleSprite[j].SetPosition( m_rcRegion.left, m_rcRegion.top, m_fZPos ); break;
case 1:
m_TitleSprite[j].SetPosition( pFrameLeft->GetSizeX() + m_rcRegion.left, m_rcRegion.top, m_fZPos );
m_TitleSprite[j].SetTargetSize( m_rcRegion.GetWidth() - pFrameLeft->GetSizeX() - pFrameRight->GetSizeX(),
pFrameCenter->GetSizeY() );
break;
case 2:
m_TitleSprite[j].SetPosition( m_rcRegion.left + m_rcRegion.GetWidth() - pFrameRight->GetSizeX(),
m_rcRegion.top, m_fZPos );
break;
}
}
m_rcCaptionArea = m_rcRegion;
m_rcCaptionArea.left += pFrameLeft->GetSizeX();
SetCaptionAlign( KTextRender::KTALIGN_LEFT | KTextRender::KTALIGN_VCENTER );
UpdateCaption();
}
void KUIControlTitleBar::Render(KViewportObject * pViewport, bool isFront )
{
if ( m_bShowFlag )
{
pViewport->Register( &m_TitleSprite[0] );
pViewport->Register( &m_TitleSprite[1] );
pViewport->Register( &m_TitleSprite[2] );
if( m_dwStyle & KSTYLE_SPR_CAPTION)
pViewport->Register( &m_prCaption);
else
_renderCaption(pViewport);
// ToolTip Render
#ifndef _KUI_INVALIDATION
_renderToolTip(pViewport);
#endif
}
}
void KUIControlTitleBar::OnChangeCaptionNotify()
{
_initControl();
KUIControl::OnChangeCaptionNotify();
}