DragonNest/Client/EtViewer/AniListPaneView.cpp
2024-12-19 09:48:26 +08:00

348 lines
8.7 KiB
C++

// AniListPaneView.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "EtViewer.h"
#include "AniListPaneView.h"
#include "UserMessage.h"
#include "ObjectBase.h"
// CAniListPaneView
IMPLEMENT_DYNCREATE(CAniListPaneView, CFormView)
CAniListPaneView::CAniListPaneView()
: CFormView(CAniListPaneView::IDD)
, m_nEditFPS((int)CObjectSkin::s_fFramePerSec)
{
m_bActivate = false;
m_pObject = NULL;
}
CAniListPaneView::~CAniListPaneView()
{
}
void CAniListPaneView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
DDX_Control(pDX, IDC_BUTTON1, m_Rewind);
DDX_Control(pDX, IDC_BUTTON2, m_Prev);
DDX_Control(pDX, IDC_BUTTON3, m_Play);
DDX_Control(pDX, IDC_BUTTON4, m_Next);
DDX_Control(pDX, IDC_BUTTON5, m_Forward);
DDX_Control(pDX, IDC_BUTTON6, m_Loop);
DDX_Control(pDX, IDC_BUTTON7, m_NoLoop);
DDX_Control(pDX, IDC_BUTTON8, m_Pause);
DDX_Control(pDX, IDC_STATIC_PROGRESS, m_StaticFrame);
DDX_Control(pDX, IDC_EDIT1, m_EditFps);
DDX_Control(pDX, IDC_SLIDER1, m_Slider);
DDX_Text(pDX, IDC_EDIT1, m_nEditFPS);
}
BEGIN_MESSAGE_MAP(CAniListPaneView, CFormView)
ON_MESSAGE( UM_ANICONTROL_REFRESH, OnRefresh )
ON_MESSAGE( UM_ANICONTROL_UPDATE_FRAME, OnUpdateFrame )
ON_MESSAGE( UM_ANICONTROL_ACCEL_KEY, OnAccelKey )
ON_BN_CLICKED(IDC_BUTTON1, &CAniListPaneView::OnBnClickedButtonRewind)
ON_BN_CLICKED(IDC_BUTTON2, &CAniListPaneView::OnBnClickedButtonPrev)
ON_BN_CLICKED(IDC_BUTTON3, &CAniListPaneView::OnBnClickedButtonPlay)
ON_BN_CLICKED(IDC_BUTTON4, &CAniListPaneView::OnBnClickedButtonNext)
ON_BN_CLICKED(IDC_BUTTON5, &CAniListPaneView::OnBnClickedButtonForward)
ON_BN_CLICKED(IDC_BUTTON6, &CAniListPaneView::OnBnClickedButtonLoop)
ON_BN_CLICKED(IDC_BUTTON7, &CAniListPaneView::OnBnClickedButtonNoLoop)
ON_BN_CLICKED(IDC_BUTTON8, &CAniListPaneView::OnBnClickedButtonPause)
ON_WM_HSCROLL()
ON_EN_CHANGE(IDC_EDIT1, &CAniListPaneView::OnEnChangeEdit1)
END_MESSAGE_MAP()
// CAniListPaneView 진단입니다.
#ifdef _DEBUG
void CAniListPaneView::AssertValid() const
{
CFormView::AssertValid();
}
#ifndef _WIN32_WCE
void CAniListPaneView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif
#endif //_DEBUG
// CAniListPaneView 메시지 처리기입니다.
float fround( float Value, int n = 1 );
float fround( float Value, int n )
{
Value = Value * pow(10.f,n);
if( Value >= 0 ) {
if( Value - (int)Value >= 0.5 ) Value++;
}
if( Value < 0 ) {
if( Value - (int)Value < -0.5 ) Value--;
}
Value = (int)Value/pow(10.f,n);
return Value;
}
void CAniListPaneView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
if( m_bActivate == true ) return;
m_bActivate = true;
CBitmap bitmap;
bitmap.LoadBitmap( IDB_PLAY );
CImageList ImageList;
ImageList.Create( 16, 16, ILC_COLOR24|ILC_MASK, 7, 1 );
ImageList.Add( &bitmap, RGB(0,255,0) );
m_Rewind.SetIcon( CSize( 16, 16 ), ImageList.ExtractIcon(0) );
m_Prev.SetIcon( CSize( 16, 16 ), ImageList.ExtractIcon(1) );
m_Play.SetIcon( CSize( 16, 16 ), ImageList.ExtractIcon(2) );
m_Next.SetIcon( CSize( 16, 16 ), ImageList.ExtractIcon(3) );
m_Forward.SetIcon( CSize( 16, 16 ), ImageList.ExtractIcon(4) );
m_Pause.SetIcon( CSize( 16, 16 ), ImageList.ExtractIcon(5) );
m_NoLoop.SetIcon( CSize( 16, 16 ), ImageList.ExtractIcon(6) );
m_Loop.SetIcon( CSize( 16, 16 ), ImageList.ExtractIcon(7) );
m_Pause.ShowWindow( SW_HIDE );
m_Loop.ShowWindow( SW_HIDE );
EnableControl( false );
}
LRESULT CAniListPaneView::OnRefresh( WPARAM wParam, LPARAM lParam )
{
if( m_pObject ) {
m_pObject->Stop();
m_pObject->LinkAniInfo( false );
}
m_pObject = (CObjectAnimation*)wParam;
if( m_pObject == NULL ) {
EnableControl( FALSE );
return S_OK;
}
// 애니 클릭할때 자동재생하는 기능 삭제.
//m_pObject->Stop();
//m_pObject->Resume();
//m_pObject->Play( m_pObject->GetCurAniIndex() );
m_pObject->LinkAniInfo( true );
EnableControl( TRUE );
m_Loop.ShowWindow( SW_SHOW );
m_NoLoop.ShowWindow( SW_HIDE );
m_Pause.ShowWindow( SW_SHOW );
m_Play.ShowWindow( SW_HIDE );
CString szStr;
szStr.Format( "%3d/%3d", (int)fround( m_pObject->GetCurFrame() ), m_pObject->GetTotalFrame() - 1 );
m_StaticFrame.SetWindowText( szStr );
m_StaticFrame.UpdateData( TRUE );
m_Slider.SetRange( 0, m_pObject->GetTotalFrame() - 1, TRUE );
m_Slider.SetPos( m_pObject->GetCurFrame() );
return S_OK;
}
void CAniListPaneView::EnableControl( bool bEnable )
{
m_Rewind.EnableWindow( bEnable );
m_Prev.EnableWindow( bEnable );
m_Play.EnableWindow( bEnable );
m_Pause.EnableWindow( bEnable );
m_Next.EnableWindow( bEnable );
m_Forward.EnableWindow( bEnable );
m_Loop.EnableWindow( bEnable );
m_NoLoop.EnableWindow( bEnable );
m_StaticFrame.EnableWindow( bEnable );
m_EditFps.EnableWindow( bEnable );
m_Slider.EnableWindow( bEnable );
}
void CAniListPaneView::OnBnClickedButtonRewind()
{
if( !m_pObject ) return;
int nCurAni = m_pObject->GetCurAniIndex() - 1;
if( nCurAni <= 0 ) nCurAni = 0;
m_pObject->Play( nCurAni, GetLoopCount() );
OnRefresh( (WPARAM)m_pObject, 0 );
}
void CAniListPaneView::OnBnClickedButtonPrev()
{
if( !m_pObject ) return;
float fCurFrame = m_pObject->GetCurFrame() - 1.f;
if( fCurFrame <= 0 ) fCurFrame = 0.f;
m_pObject->SetCurFrame( fCurFrame );
}
void CAniListPaneView::OnBnClickedButtonPlay()
{
m_Play.ShowWindow( SW_HIDE );
m_Pause.ShowWindow( SW_SHOW );
if( !m_pObject ) return;
if( m_pObject->IsPause() ) {
m_pObject->Resume();
}
else {
m_pObject->Play( m_pObject->GetCurAniIndex(), GetLoopCount() );
}
}
void CAniListPaneView::OnBnClickedButtonPause()
{
m_Play.ShowWindow( SW_SHOW );
m_Pause.ShowWindow( SW_HIDE );
if( !m_pObject ) return;
m_pObject->Pause();
}
void CAniListPaneView::OnBnClickedButtonNext()
{
if( !m_pObject ) return;
float fCurFrame = m_pObject->GetCurFrame() + 1.f;
if( fCurFrame >= (float)m_pObject->GetTotalFrame() - 1 ) fCurFrame = (float)m_pObject->GetTotalFrame() - 1;
m_pObject->SetCurFrame( fCurFrame );
}
void CAniListPaneView::OnBnClickedButtonForward()
{
if( !m_pObject ) return;
int nCurAni = m_pObject->GetCurAniIndex() + 1;
if( nCurAni >= m_pObject->GetTotalAniIndex() - 1 ) nCurAni = m_pObject->GetTotalAniIndex() - 1;
m_pObject->Play( nCurAni, GetLoopCount() );
OnRefresh( (WPARAM)m_pObject, 0 );
}
void CAniListPaneView::OnBnClickedButtonLoop()
{
m_Loop.ShowWindow( SW_HIDE );
m_NoLoop.ShowWindow( SW_SHOW );
if( !m_pObject ) return;
if( m_pObject->IsPlay() || m_pObject->IsPause() )
m_pObject->SetLoopCount( 1000000 );
}
void CAniListPaneView::OnBnClickedButtonNoLoop()
{
m_NoLoop.ShowWindow( SW_HIDE );
m_Loop.ShowWindow( SW_SHOW );
if( !m_pObject ) return;
if( m_pObject->IsPlay() || m_pObject->IsPause() )
m_pObject->SetLoopCount( 1 );
}
LRESULT CAniListPaneView::OnUpdateFrame( WPARAM wParam, LPARAM lParam )
{
CString szStr, szTemp;
szStr.Format( "%3d/%3d", (int)fround( m_pObject->GetCurFrame() ), m_pObject->GetTotalFrame() - 1 );
m_StaticFrame.GetWindowText( szTemp );
if( strcmp( szStr, szTemp ) != NULL ) {
m_StaticFrame.SetWindowText( szStr );
m_StaticFrame.UpdateData( TRUE );
m_Slider.SetPos( (int)m_pObject->GetCurFrame() );
}
if( m_pObject->IsPlay() && !m_pObject->IsPause() ) {
m_Play.ShowWindow( SW_HIDE );
m_Pause.ShowWindow( SW_SHOW );
}
else {
m_Play.ShowWindow( SW_SHOW );
m_Pause.ShowWindow( SW_HIDE );
}
return S_OK;
}
int CAniListPaneView::GetLoopCount()
{
int nLoopCount = 1;
if( m_NoLoop.IsWindowVisible() == TRUE ) nLoopCount = 10000000;
return nLoopCount;
}
void CAniListPaneView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
CFormView::OnHScroll(nSBCode, nPos, pScrollBar);
if( pScrollBar->m_hWnd == m_Slider.m_hWnd ) {
if( !m_pObject ) return;
m_pObject->Pause();
m_pObject->SetCurFrame( (float)m_Slider.GetPos() );
CString szStr;
szStr.Format( "%3d/%3d", (int)fround( m_pObject->GetCurFrame() ), m_pObject->GetTotalFrame() - 1 );
m_StaticFrame.SetWindowText( szStr );
m_StaticFrame.UpdateData( TRUE );
}
}
void CAniListPaneView::OnEnChangeEdit1()
{
// m_EditFps.UpdateData( FALSE );
if( m_EditFps ) {
UpdateData();
CObjectSkin::s_fFramePerSec = (float)m_nEditFPS;
}
}
LRESULT CAniListPaneView::OnAccelKey( WPARAM wParam, LPARAM lParam )
{
if( m_pObject == NULL ) return S_OK;
switch( (int)wParam ) {
case 0:
if( m_pObject->IsPlay() && !m_pObject->IsPause() ) OnBnClickedButtonPause();
else OnBnClickedButtonPlay();
break;
case 1:
OnBnClickedButtonRewind();
break;
case 2:
OnBnClickedButtonForward();
break;
case 3:
if( !m_pObject->IsPause() )
OnBnClickedButtonPause();
OnBnClickedButtonPrev();
break;
case 4:
if( !m_pObject->IsPause() )
OnBnClickedButtonPause();
OnBnClickedButtonNext();
break;
}
return S_OK;
}