348 lines
18 KiB
C++
348 lines
18 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;
|
||
}
|