#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 }