123
This commit is contained in:
202
Editor/TrackViewTimeBar.cpp
Normal file
202
Editor/TrackViewTimeBar.cpp
Normal file
@@ -0,0 +1,202 @@
|
||||
// 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;
|
||||
}
|
||||
Reference in New Issue
Block a user