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

487 lines
14 KiB
C++
Raw Blame History

// KeyControlPaneView.cpp : implementation file
//
#include "stdafx.h"
#include "EtEffect2Tool.h"
#include "EtEffectDataContainer.h"
#include "KeyControlPaneView.h"
#include "GlobalValue.h"
#include "AxisRenderObject.h"
#include "PropertyPaneView.h"
// CKeyControlPaneView
IMPLEMENT_DYNCREATE(CKeyControlPaneView, CScrollView)
CKeyControlPaneView::CKeyControlPaneView()
//: CScrollView(CKeyControlPaneView::IDD)
{
m_pSliderCtrl = NULL;
m_dwGridWidth = 10;
m_dwGridHeight = 16;
m_dwGridHeightCount = 1;
m_dwScrollHeight = 25;
m_pMemDC = NULL;
m_pdcBitmap = NULL;
m_bActivate = false;
m_overIndex = -1;
}
CKeyControlPaneView::~CKeyControlPaneView()
{
SAFE_DELETE( m_pSliderCtrl );
DeleteMemDC();
}
void CKeyControlPaneView::DoDataExchange(CDataExchange* pDX)
{
CScrollView::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CKeyControlPaneView, CScrollView)
ON_WM_PAINT()
ON_WM_SIZE()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDBLCLK()
ON_WM_LBUTTONDOWN()
ON_WM_RBUTTONDBLCLK()
END_MESSAGE_MAP()
// CKeyControlPaneView diagnostics
#ifdef _DEBUG
void CKeyControlPaneView::AssertValid() const
{
CScrollView::AssertValid();
}
#ifndef _WIN32_WCE
void CKeyControlPaneView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
#endif
#endif //_DEBUG
void CKeyControlPaneView::Reset()
{
m_overIndex = -1;
}
void CKeyControlPaneView::CreateSlider()
{
SAFE_DELETE( m_pSliderCtrl );
// Create Slider Ctrl
DWORD dwStyle = TBS_FIXEDLENGTH | TBS_HORZ | TBS_AUTOTICKS | TBS_BOTTOM | WS_CHILD | WS_VISIBLE;
m_pSliderCtrl = new CSliderCtrl;
m_pSliderCtrl->Create( dwStyle, CRect( 0, 0, 500, 30 ), this, 10000 );
m_pSliderCtrl->SetRange( 0, 2 );
}
void CKeyControlPaneView::SetRangeMax( int nMax )
{
m_pSliderCtrl->SetRange(0, nMax);
RefreshScroll();
RefreshSlider();
}
void CKeyControlPaneView::RefreshSlider()
{
// CPoint ScrollPos( GetScrollPos( SB_HORZ ), GetScrollPos( SB_VERT ) );
int nScrollPos = GetScrollPos( SB_HORZ );
if(!m_pSliderCtrl) {
return;
}
CRect rcRect, rcResize;
//DWORD dwPrevRight = 0;
GetClientRect( &rcRect );
rcRect.bottom = m_dwScrollHeight;
// if( pCtrl->GetRangeMin() == 0 && pCtrl->GetRangeMax() == 0 ) continue;
rcResize = rcRect;
rcResize.bottom = m_dwScrollHeight;
rcResize.left = 0;
rcResize.right = rcResize.left + ( m_dwGridWidth *m_pSliderCtrl->GetRangeMax() ) + 29;
//dwPrevRight = rcResize.right + 5;
rcResize.left -= nScrollPos;
rcResize.right -= nScrollPos;
m_pSliderCtrl->MoveWindow( rcResize );
//m_dwLastSliderRight = dwPrevRight - 5;
}
void CKeyControlPaneView::RefreshScroll()
{
DWORD dwTotalWidth = 0;
CRect rcRect;
if( m_pSliderCtrl ) {
dwTotalWidth += ( m_dwGridWidth * m_pSliderCtrl->GetRangeMax() ) + 5 + 29;
}
// Scroll Resize
CSize TotalSize;
TotalSize.cx = dwTotalWidth;
TotalSize.cy = m_dwScrollHeight + ( m_dwGridHeightCount * m_dwGridHeight ) + 1;
SetScrollSizes( MM_TEXT, TotalSize );
}
void CKeyControlPaneView::OnInitialUpdate()
{
if(m_bActivate) {
return;
}
m_bActivate = true;
CScrollView::OnInitialUpdate();
CGlobalValue::GetInstance().SetKeyControlView( this );
CreateSlider();
RefreshScroll();
RefreshSlider();
CGlobalValue::GetInstance().InitAxisRender();
}
void CKeyControlPaneView::CreateMemDC()
{
//if( m_pdcBitmap || m_pMemDC ) return;
DeleteMemDC();
m_pMemDC = new CDC;
m_pdcBitmap = new CBitmap;
CRect rcRect;
GetClientRect( &rcRect );
CDC *pDC = GetDC();
m_pMemDC->CreateCompatibleDC( pDC );
m_pdcBitmap->CreateCompatibleBitmap( pDC, rcRect.Width(), rcRect.Height() );
ReleaseDC( pDC );
}
void CKeyControlPaneView::DeleteMemDC()
{
if( m_pdcBitmap ) {
m_pdcBitmap->DeleteObject();
SAFE_DELETE( m_pdcBitmap );
}
if( m_pMemDC ) {
m_pMemDC->DeleteDC();
SAFE_DELETE( m_pMemDC );
}
}
void CKeyControlPaneView::DrawGrid()
{
CRect rcSliderRect;
CPoint Point[2];
m_pSliderCtrl->GetWindowRect( &rcSliderRect );
ScreenToClient( &rcSliderRect );
if( m_pSliderCtrl->GetRangeMin() == 0 && m_pSliderCtrl->GetRangeMax() == 0 ) return;
COLORREF Col;
Col = RGB( 64, 64, 64 );
CPen Pen( PS_DOT, 1, Col );
CPen PenBold( PS_SOLID, 2, RGB( GetRValue(Col) * 0.8f, GetGValue(Col) * 0.8f, GetBValue(Col) * 0.8f ) );
CPen PenTick( PS_SOLID, 2, Col );
CPen PenCurPos( PS_SOLID, 2, Col );
//CPoint ScrollPos( GetScrollPos( SB_HORZ ), GetScrollPos( SB_VERT ) );
//rcSliderRect.left -= GetScrollPos( SB_HORZ );
//rcSliderRect.right -= GetScrollPos( SB_HORZ );
rcSliderRect.top -= GetScrollPos( SB_VERT );
rcSliderRect.bottom -= GetScrollPos( SB_VERT );
// <20><><EFBFBD>μ<EFBFBD> <20>׷<EFBFBD><D7B7>ֱ<EFBFBD>~
int nCount = m_pSliderCtrl->GetRangeMax() - m_pSliderCtrl->GetRangeMin();
int nFrameCount = nCount;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׷<EFBFBD><D7B7>ֱ<EFBFBD>..
int nCurPos = m_pSliderCtrl->GetPos();
int m_dwTickCount = 10;
for( int i=-1; i<nCount; i++ ) {
if( i == -1 ) {
Point[0] = CPoint( rcSliderRect.left + 13, rcSliderRect.top );
Point[1] = CPoint( rcSliderRect.left + 13, rcSliderRect.top + ( (m_dwGridHeightCount) * m_dwGridHeight ) );
m_pMemDC->SelectObject( &PenBold );
}
else if( i == nCount - 1 ) {
Point[0] = CPoint( rcSliderRect.right - 14, rcSliderRect.top );
Point[1] = CPoint( rcSliderRect.right - 14, rcSliderRect.top + ( (m_dwGridHeightCount) * m_dwGridHeight ) );
m_pMemDC->SelectObject( &PenBold );
}
else {
Point[0] = CPoint( rcSliderRect.left + m_pSliderCtrl->GetTicPos(i), rcSliderRect.top );
Point[1] = CPoint( rcSliderRect.left + m_pSliderCtrl->GetTicPos(i), rcSliderRect.top + ( (m_dwGridHeightCount) * m_dwGridHeight ) );
if( i != 0 && (i+1) % m_dwTickCount == 0 )
m_pMemDC->SelectObject( &PenTick );
else m_pMemDC->SelectObject( &Pen );
}
if( nCurPos - 1 == i ) {
//m_pMemDC->SelectObject( &PenCurPos );
}
// Point[0] -= ScrollPos;
// Point[1] -= ScrollPos;
m_pMemDC->Polyline( Point, 2 );
}
// <20><><EFBFBD>μ<EFBFBD> <20>׷<EFBFBD><D7B7>ֱ<EFBFBD>~
nCount = (m_dwGridHeightCount);
for( int i=0; i<nCount+1; i++ ) {
if( i == 0 || i == nCount ) m_pMemDC->SelectObject( &PenBold );
else m_pMemDC->SelectObject( &Pen );
Point[0] = CPoint( rcSliderRect.left + 13, rcSliderRect.top + ( i * m_dwGridHeight ) );
Point[1] = CPoint( rcSliderRect.right - 14, rcSliderRect.top + ( i * m_dwGridHeight ) );
// Point[0] -= ScrollPos;
// Point[1] -= ScrollPos;
m_pMemDC->Polyline( Point, 2 );
}
}
void CKeyControlPaneView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CScrollView::OnPaint() for painting messages
CreateMemDC();
CRect rcRect;
CBitmap *pOldBitmap;
GetClientRect( &rcRect );
pOldBitmap = m_pMemDC->SelectObject( m_pdcBitmap );
m_pMemDC->FillSolidRect( &rcRect, RGB(255,255,255) );
// Draw memDC
DrawGrid();
DrawItems();
ReleaseDC( m_pMemDC );
dc.BitBlt(rcRect.left, rcRect.top + m_dwScrollHeight, rcRect.Width(), rcRect.Height() ,
m_pMemDC, rcRect.left, rcRect.top, SRCCOPY);
m_pMemDC->SelectObject(pOldBitmap);
//TRACE("OnPaint()\n");
}
void CKeyControlPaneView::OnDraw(CDC* /*pDC*/)
{
// TODO: Add your specialized code here and/or call the base class
}
void CKeyControlPaneView::OnSize(UINT nType, int cx, int cy)
{
CScrollView::OnSize(nType, cx, cy);
RefreshScroll();
RefreshSlider();
//DeleteMemDC();
//CreateMemDC();
// TODO: Add your message handler code here
}
void CKeyControlPaneView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_mousePoint = point;
Invalidate(false);
CScrollView::OnMouseMove(nFlags, point);
}
void CKeyControlPaneView::OnFXSelected( CString str )
{
SetRangeMax( CGlobalValue::GetInstance().FindItem( str )->dwEndFrame -
CGlobalValue::GetInstance().FindItem( str )->dwStartFrame );
m_ppTable = CGlobalValue::GetInstance().GetFXData( str );
Invalidate();
}
RECT CKeyControlPaneView::GetKeyframeRect( int index )
{
RECT rcSliderRect;
m_pSliderCtrl->GetWindowRect( &rcSliderRect );
ScreenToClient( &rcSliderRect );
rcSliderRect.top -= GetScrollPos( SB_VERT );
rcSliderRect.bottom -= GetScrollPos( SB_VERT );
RECT rcSelect;
int p1 = (index == 0) ? rcSliderRect.left + 13 : rcSliderRect.left + m_pSliderCtrl->GetTicPos(index-1);
rcSelect.left = p1;
rcSelect.top = rcSliderRect.top;
rcSelect.right = rcSelect.left + m_dwGridWidth;
rcSelect.bottom = rcSelect.top + m_dwGridHeight;
return rcSelect;
}
void CKeyControlPaneView::DrawItems()
{
if( CGlobalValue::GetInstance().GetPosOrRot() == 0 ) {
CEtEffectDataContainer *pTable = m_ppTable[ERT_POSITION_TABLE];
for( DWORD i = 0; i < pTable->GetDataCount(); i++) {
CEtEffectPositionDataValue *pPosTable = (CEtEffectPositionDataValue*)pTable->GetValueFromIndex(i);
RECT rcSelect = GetKeyframeRect( (int)pPosTable->GetKey() );
m_pMemDC->FillSolidRect( &rcSelect, m_overIndex == pPosTable->GetKey() ?
RGB( 255, 64, 64) : RGB( 128, 128, 255) );
m_pMemDC->DrawText( "P", &rcSelect, DT_SINGLELINE | DT_CENTER | DT_VCENTER );
}
}
else if( CGlobalValue::GetInstance().GetPosOrRot() == 1 ) {
CEtEffectDataContainer *pTable = m_ppTable[ERT_ROTATE_TABLE];
for( DWORD i = 0; i < pTable->GetDataCount(); i++) {
CEtEffectRotationDataValue *pRotTable = (CEtEffectRotationDataValue*)pTable->GetValueFromIndex(i);
RECT rcSelect = GetKeyframeRect( (int)pRotTable->GetKey() );
m_pMemDC->FillSolidRect( &rcSelect, m_overIndex == pRotTable->GetKey() ?
RGB( 255, 64, 64) : RGB(128, 255, 128) );
m_pMemDC->DrawText( "R", &rcSelect, DT_SINGLELINE | DT_CENTER | DT_VCENTER );
}
}
}
int CKeyControlPaneView::GetMouseOverIndex()
{
RECT rcSliderRect;
m_pSliderCtrl->GetWindowRect( &rcSliderRect );
ScreenToClient( &rcSliderRect );
rcSliderRect.top -= GetScrollPos( SB_VERT );
rcSliderRect.bottom -= GetScrollPos( SB_VERT );
int nFrameCount = m_pSliderCtrl->GetRangeMax() - m_pSliderCtrl->GetRangeMin();
int selectIndex = -1;
if( m_mousePoint.y > 25 && m_mousePoint.y <= 25 + (int)m_dwGridHeight &&
m_mousePoint.x > rcSliderRect.left + 13 &&
m_mousePoint.x < rcSliderRect.right - 14 ) {
for( int i = 0; i < nFrameCount; i++) {
int p1 = (i == 0) ? rcSliderRect.left + 13 : rcSliderRect.left + m_pSliderCtrl->GetTicPos(i-1);
int p2 = (i == nFrameCount-1) ? rcSliderRect.right - 14 : rcSliderRect.left + m_pSliderCtrl->GetTicPos(i);
if( m_mousePoint.x >= p1 && m_mousePoint.x < p2 ) {
selectIndex = i;
break;
}
}
}
return selectIndex;
}
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ŵ, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD>
void CKeyControlPaneView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_overIndex = GetMouseOverIndex();
if( m_overIndex == -1) {
CGlobalValue::GetInstance().SetPositionPtr( NULL );
CGlobalValue::GetInstance().SetRotationPtr( NULL );
}
if( m_overIndex != -1 ) {
if( CGlobalValue::GetInstance().GetPosOrRot() == 0 ) {
CEtEffectDataContainer *pTable = m_ppTable[ERT_POSITION_TABLE];
DWORD i;
for( i = 0; i < pTable->GetDataCount(); i++) {
if( pTable->GetValueFromIndex(i)->GetKey() == m_overIndex ) {
break;
}
}
if( i == pTable->GetDataCount() ) {
CEtEffectPositionDataValue *pPosTableValue = new CEtEffectPositionDataValue;
pPosTableValue->SetKey( (float)m_overIndex );
pPosTableValue->SetPosition( CGlobalValue::GetInstance().GetAxisRenderObject()->GetPosition() );
CGlobalValue::GetInstance().SetPositionPtr( pPosTableValue->GetPosition() );
pTable->AddData( pPosTableValue, true );
}
}
else if ( CGlobalValue::GetInstance().GetPosOrRot() == 1 ) {
CEtEffectDataContainer *pTable = m_ppTable[ERT_ROTATE_TABLE];
DWORD i;
for( i = 0; i < pTable->GetDataCount(); i++) {
if( pTable->GetValueFromIndex(i)->GetKey() == m_overIndex ) {
break;
}
}
if( i == pTable->GetDataCount() ) {
CEtEffectRotationDataValue *pRotTableValue = new CEtEffectRotationDataValue;
pRotTableValue->SetKey( (float)m_overIndex );
pRotTableValue->SetRotation( CGlobalValue::GetInstance().GetAxisRenderObject()->GetRotation() );
pTable->AddData( pRotTableValue, true );
}
}
}
CScrollView::OnLButtonDblClk(nFlags, point);
Invalidate(FALSE);
}
void CKeyControlPaneView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_overIndex = GetMouseOverIndex();
if( m_overIndex == -1) {
CGlobalValue::GetInstance().SetPositionPtr( NULL );
CGlobalValue::GetInstance().SetRotationPtr( NULL );
}
if( CGlobalValue::GetInstance().GetPosOrRot() == 0 ) {
CEtEffectDataContainer *pTable = m_ppTable[ERT_POSITION_TABLE];
for( DWORD i = 0; i < pTable->GetDataCount(); i++) {
CEtEffectPositionDataValue *pPosTable = (CEtEffectPositionDataValue*)pTable->GetValueFromIndex(i);
if( (int)pPosTable->GetKey() == m_overIndex ) {
CGlobalValue::GetInstance().GetAxisRenderObject()->SetPosition( *pPosTable->GetPosition() );
CGlobalValue::GetInstance().SetPositionPtr( pPosTable->GetPosition() );
CGlobalValue::GetInstance().GetPropertyPaneView()->OnPositionSelected( *pPosTable->GetPosition() );
break;
}
}
}
else if( CGlobalValue::GetInstance().GetPosOrRot() == 1 ) {
CEtEffectDataContainer *pTable = m_ppTable[ERT_ROTATE_TABLE];
for( DWORD i = 0; i < pTable->GetDataCount(); i++) {
CEtEffectRotationDataValue *pRotTable = (CEtEffectRotationDataValue*)pTable->GetValueFromIndex(i);
if( (int)pRotTable->GetKey() == m_overIndex ) {
CGlobalValue::GetInstance().GetAxisRenderObject()->SetRotation( *pRotTable->GetRotation() );
CGlobalValue::GetInstance().SetRotationPtr( pRotTable->GetRotation() );
CGlobalValue::GetInstance().GetPropertyPaneView()->OnRotationSelected( *pRotTable->GetRotation() );
break;
}
}
}
Invalidate();
CScrollView::OnLButtonDown(nFlags, point);
}
// Ű<><C5B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
void CKeyControlPaneView::OnRButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
int selectIndex = GetMouseOverIndex();
if( selectIndex != -1 ) {
if( CGlobalValue::GetInstance().GetPosOrRot() == 0 ) {
CEtEffectDataContainer *pTable = m_ppTable[ERT_POSITION_TABLE];
DWORD i;
for( i = 0; i < pTable->GetDataCount(); i++) {
if( pTable->GetValueFromIndex( i )->GetKey() == selectIndex ) {
pTable->RemoveData( i );
break;
}
}
}
else if ( CGlobalValue::GetInstance().GetPosOrRot() == 1 ) {
CEtEffectDataContainer *pTable = m_ppTable[ERT_ROTATE_TABLE];
DWORD i;
for( i = 0; i < pTable->GetDataCount(); i++) {
if( pTable->GetValueFromIndex( i )->GetKey() == selectIndex ) {
pTable->RemoveData( i );
break;
}
}
}
}
Invalidate(FALSE);
CScrollView::OnRButtonDblClk(nFlags, point);
}