202 lines
5.1 KiB
C++
202 lines
5.1 KiB
C++
// TrackViewTimeBar.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "TrackViewTimeBar.h"
|
|
|
|
#include "TrackViewKeyList.h"
|
|
#include "AnimationContext.h"
|
|
|
|
// CTrackViewTimeBar
|
|
|
|
#define LEFT_OFFSET 30
|
|
|
|
IMPLEMENT_DYNAMIC(CTrackViewTimeBar, CWnd)
|
|
CTrackViewTimeBar::CTrackViewTimeBar()
|
|
{
|
|
m_ticksStep = 0.1f;
|
|
m_draggingTime = false;
|
|
}
|
|
|
|
CTrackViewTimeBar::~CTrackViewTimeBar()
|
|
{
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CTrackViewTimeBar, CWnd)
|
|
ON_WM_PAINT()
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_LBUTTONUP()
|
|
ON_WM_MOUSEMOVE()
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
BOOL CTrackViewTimeBar::Create( DWORD dwStyle,const RECT &rect,CWnd *pParentWnd,UINT nID )
|
|
{
|
|
m_bkgBrush.CreateSolidBrush(RGB(0xE0,0xE0,0xE0));
|
|
WNDCLASS wndcls;
|
|
ZeroStruct(wndcls);
|
|
//you can specify your own window procedure
|
|
wndcls.lpfnWndProc = ::DefWindowProc;
|
|
wndcls.hInstance = AfxGetInstanceHandle();
|
|
wndcls.hbrBackground = (HBRUSH)m_bkgBrush.GetSafeHandle();
|
|
// Specify your own class name for using FindWindow later
|
|
wndcls.lpszClassName = _T("TrackViewTimeline");
|
|
AfxRegisterClass(&wndcls);
|
|
|
|
return CWnd::Create( _T("TrackViewTimeline"),NULL,dwStyle,rect,pParentWnd,nID );
|
|
}
|
|
|
|
// CTrackViewTimeBar message handlers
|
|
void CTrackViewTimeBar::OnPaint()
|
|
{
|
|
CPaintDC dc(this); // device context for painting
|
|
// TODO: Add your message handler code here
|
|
// Do not call CWnd::OnPaint() for painting messages
|
|
|
|
//CBrush brush(GetSysColor(COLOR_3DFACE));
|
|
CRect rc;
|
|
GetClientRect(rc);
|
|
//::FillRect( dc,rc,(HBRUSH)GetStockObject(GRAY_BRUSH) );
|
|
dc.Draw3dRect( rc,GetSysColor(COLOR_3DHILIGHT),GetSysColor(COLOR_3DDKSHADOW) );
|
|
|
|
CPen *prevPen;
|
|
CPen ltgray(PS_SOLID,1,RGB(90,90,90));
|
|
CPen black(PS_SOLID,1,RGB(0,0,0));
|
|
CPen redpen(PS_SOLID,1,RGB(255,0,0));
|
|
prevPen = dc.SelectObject(<gray);
|
|
// Draw time ticks every tick step seconds.
|
|
Range timeRange = m_timeRange;
|
|
CString str;
|
|
|
|
dc.SelectObject(redpen);
|
|
int x = TimeToItem(m_currTime);
|
|
dc.SelectObject( GetStockObject(NULL_BRUSH) );
|
|
dc.Rectangle( x-3,rc.top,x+4,rc.bottom );
|
|
|
|
dc.SetTextColor( RGB(0,0,0) );
|
|
dc.SetBkMode( TRANSPARENT );
|
|
dc.SelectObject( GetStockObject(DEFAULT_GUI_FONT) );
|
|
|
|
int bigTickStep = 100*m_ticksStep;
|
|
for (float t = ceilf(timeRange.start); t <= timeRange.end; t += m_ticksStep)
|
|
{
|
|
int x = TimeToItem(t);
|
|
dc.MoveTo(x,rc.bottom-2);
|
|
int tm = 10*t;
|
|
if (tm%bigTickStep == 0)
|
|
{
|
|
dc.SelectObject(black);
|
|
dc.LineTo(x,rc.bottom-14);
|
|
str.Format( "%d",(int)t );
|
|
dc.TextOut( x+2,rc.top,str );
|
|
dc.SelectObject(ltgray);
|
|
}
|
|
else
|
|
dc.LineTo(x,rc.bottom-6);
|
|
}
|
|
|
|
dc.SelectObject(redpen);
|
|
dc.MoveTo( x,rc.top ); dc.LineTo( x,rc.bottom );
|
|
dc.SelectObject( GetStockObject(NULL_BRUSH) );
|
|
// dc.Rectangle( x-3,rc.top,x+4,rc.bottom );
|
|
|
|
dc.SelectObject(prevPen);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewTimeBar::SetTimeRange( float start,float end )
|
|
{
|
|
m_timeRange.Set( start,end );
|
|
Invalidate(TRUE);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewTimeBar::SetTimeScale( float timeScale )
|
|
{
|
|
m_timeScale = timeScale;
|
|
|
|
Invalidate(TRUE);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CTrackViewTimeBar::TimeToItem( float time )
|
|
{
|
|
if (time < m_timeRange.start || time > m_timeRange.end)
|
|
return -1;
|
|
|
|
int x = LEFT_OFFSET + time*m_timeScale;
|
|
/*
|
|
int left = LEFT_OFFSET+m_scrollOffset.x;
|
|
if (x < left || x > left+m_rcClient.Width())
|
|
x = -1;
|
|
*/
|
|
return x;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewTimeBar::SetCurrTime( float currTime )
|
|
{
|
|
m_currTime = currTime;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewTimeBar::ChangeTime( float time )
|
|
{
|
|
time = __max(time,m_timeRange.start);
|
|
time = __min(time,m_timeRange.end);
|
|
m_currTime = time;
|
|
Invalidate(TRUE);
|
|
NMHDR hdr;
|
|
hdr.code = TVN_CURRTIMECHANGE;
|
|
hdr.hwndFrom = GetSafeHwnd();
|
|
hdr.idFrom = GetDlgCtrlID();
|
|
GetParent()->SendMessage( WM_NOTIFY,(WPARAM)hdr.idFrom,(LPARAM)&hdr );
|
|
|
|
GetIEditor()->GetAnimation()->SetTime( m_currTime );
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewTimeBar::OnLButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
//int currX = TimeToItem(m_currTime);
|
|
//if (point.x > currX-3 && point.x < currX+3)
|
|
{
|
|
ChangeTime( TimeFromPoint(point) );
|
|
SetCapture();
|
|
m_draggingTime = true;
|
|
}
|
|
|
|
CWnd::OnLButtonDown(nFlags, point);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewTimeBar::OnLButtonUp(UINT nFlags, CPoint point)
|
|
{
|
|
m_draggingTime = false;
|
|
ReleaseCapture();
|
|
|
|
CWnd::OnLButtonUp(nFlags, point);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CTrackViewTimeBar::OnMouseMove(UINT nFlags, CPoint point)
|
|
{
|
|
if (m_draggingTime)
|
|
{
|
|
ChangeTime( TimeFromPoint(point) );
|
|
}
|
|
|
|
CWnd::OnMouseMove(nFlags, point);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
float CTrackViewTimeBar::TimeFromPoint( CPoint point )
|
|
{
|
|
int x = point.x - LEFT_OFFSET;
|
|
float time = (float)x / m_timeScale;
|
|
// Snap to 0.1s.
|
|
time = ceilf(time*10-0.5f)/10;
|
|
return time;
|
|
} |