diff options
author | Casimir666 <casimir666@users.sourceforge.net> | 2006-06-25 01:37:43 +0400 |
---|---|---|
committer | Casimir666 <casimir666@users.sourceforge.net> | 2006-06-25 01:37:43 +0400 |
commit | 0868305e78da2b0742c2ce349efa041d5622ae21 (patch) | |
tree | 663fd93132c7927910ba7c13188d6332b2e3e5b2 /src/apps/mplayerc/PlayerSeekBar.cpp | |
parent | 43c8656956a0460fc4551e3ea7a39b9f3094a3e3 (diff) |
git-svn-id: https://mpc-hc.svn.sourceforge.net/svnroot/mpc-hc/trunk@14 10f7b99b-c216-0410-bff0-8a66a9350fd8
Diffstat (limited to 'src/apps/mplayerc/PlayerSeekBar.cpp')
-rw-r--r-- | src/apps/mplayerc/PlayerSeekBar.cpp | 304 |
1 files changed, 304 insertions, 0 deletions
diff --git a/src/apps/mplayerc/PlayerSeekBar.cpp b/src/apps/mplayerc/PlayerSeekBar.cpp new file mode 100644 index 000000000..b8efe5e44 --- /dev/null +++ b/src/apps/mplayerc/PlayerSeekBar.cpp @@ -0,0 +1,304 @@ +/*
+ * Copyright (C) 2003-2006 Gabest
+ * http://www.gabest.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Make; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+// PlayerSeekBar.cpp : implementation file
+//
+
+#include "stdafx.h"
+#include "mplayerc.h"
+#include "PlayerSeekBar.h"
+
+// CPlayerSeekBar
+
+IMPLEMENT_DYNAMIC(CPlayerSeekBar, CDialogBar)
+
+CPlayerSeekBar::CPlayerSeekBar() :
+ m_start(0), m_stop(100), m_pos(0), m_posreal(0),
+ m_fEnabled(false)
+{
+}
+
+CPlayerSeekBar::~CPlayerSeekBar()
+{
+}
+
+BOOL CPlayerSeekBar::Create(CWnd* pParentWnd)
+{
+ if(!CDialogBar::Create(pParentWnd, IDD_PLAYERSEEKBAR, WS_CHILD|WS_VISIBLE|CBRS_ALIGN_BOTTOM, IDD_PLAYERSEEKBAR))
+ return FALSE;
+
+ return TRUE;
+}
+
+BOOL CPlayerSeekBar::PreCreateWindow(CREATESTRUCT& cs)
+{
+ if(!CDialogBar::PreCreateWindow(cs))
+ return FALSE;
+
+ m_dwStyle &= ~CBRS_BORDER_TOP;
+ m_dwStyle &= ~CBRS_BORDER_BOTTOM;
+ m_dwStyle |= CBRS_SIZE_FIXED;
+
+ return TRUE;
+}
+
+void CPlayerSeekBar::Enable(bool fEnable)
+{
+ m_fEnabled = fEnable;
+ Invalidate();
+}
+
+void CPlayerSeekBar::GetRange(__int64& start, __int64& stop)
+{
+ start = m_start;
+ stop = m_stop;
+}
+
+void CPlayerSeekBar::SetRange(__int64 start, __int64 stop)
+{
+ if(start > stop) start ^= stop, stop ^= start, start ^= stop;
+ m_start = start;
+ m_stop = stop;
+ if(m_pos < m_start || m_pos >= m_stop) SetPos(m_start);
+}
+
+__int64 CPlayerSeekBar::GetPos()
+{
+ return(m_pos);
+}
+
+__int64 CPlayerSeekBar::GetPosReal()
+{
+ return(m_posreal);
+}
+
+void CPlayerSeekBar::SetPos(__int64 pos)
+{
+ CWnd* w = GetCapture();
+ if(w && w->m_hWnd == m_hWnd) return;
+
+ SetPosInternal(pos);
+}
+
+void CPlayerSeekBar::SetPosInternal(__int64 pos)
+{
+ if(m_pos == pos) return;
+
+ CRect before = GetThumbRect();
+ m_pos = min(max(pos, m_start), m_stop);
+ m_posreal = pos;
+ CRect after = GetThumbRect();
+
+ if(before != after) InvalidateRect(before | after);
+}
+
+CRect CPlayerSeekBar::GetChannelRect()
+{
+ CRect r;
+ GetClientRect(&r);
+ r.DeflateRect(8, 9, 9, 0);
+ r.bottom = r.top + 5;
+ return(r);
+}
+
+CRect CPlayerSeekBar::GetThumbRect()
+{
+// bool fEnabled = m_fEnabled || m_start >= m_stop;
+
+ CRect r = GetChannelRect();
+
+ int x = r.left + (int)((m_start < m_stop /*&& fEnabled*/) ? (__int64)r.Width() * (m_pos - m_start) / (m_stop - m_start) : 0);
+ int y = r.CenterPoint().y;
+
+ r.SetRect(x, y, x, y);
+ r.InflateRect(6, 7, 7, 8);
+
+ return(r);
+}
+
+CRect CPlayerSeekBar::GetInnerThumbRect()
+{
+ CRect r = GetThumbRect();
+
+ bool fEnabled = m_fEnabled && m_start < m_stop;
+ r.DeflateRect(3, fEnabled ? 5 : 4, 3, fEnabled ? 5 : 4);
+
+ return(r);
+}
+
+void CPlayerSeekBar::MoveThumb(CPoint point)
+{
+ CRect r = GetChannelRect();
+
+ if(r.left >= r.right) return;
+
+ if(point.x < r.left) SetPos(m_start);
+ else if(point.x >= r.right) SetPos(m_stop);
+ else
+ {
+ __int64 w = r.right - r.left;
+ if(m_start < m_stop)
+ SetPosInternal(m_start + ((m_stop - m_start) * (point.x - r.left) + (w/2)) / w);
+ }
+}
+
+BEGIN_MESSAGE_MAP(CPlayerSeekBar, CDialogBar)
+ //{{AFX_MSG_MAP(CPlayerSeekBar)
+ ON_WM_PAINT()
+ ON_WM_SIZE()
+ ON_WM_LBUTTONDOWN()
+ ON_WM_LBUTTONUP()
+ ON_WM_MOUSEMOVE()
+ ON_WM_ERASEBKGND()
+ //}}AFX_MSG_MAP
+ ON_COMMAND_EX(ID_PLAY_STOP, OnPlayStop)
+END_MESSAGE_MAP()
+
+
+// CPlayerSeekBar message handlers
+
+void CPlayerSeekBar::OnPaint()
+{
+ CPaintDC dc(this); // device context for painting
+
+ bool fEnabled = m_fEnabled && m_start < m_stop;
+
+ COLORREF
+ white = GetSysColor(COLOR_WINDOW),
+ shadow = GetSysColor(COLOR_3DSHADOW),
+ light = GetSysColor(COLOR_3DHILIGHT),
+ bkg = GetSysColor(COLOR_BTNFACE);
+
+ // thumb
+ {
+ CRect r = GetThumbRect(), r2 = GetInnerThumbRect();
+ CRect rt = r, rit = r2;
+
+ dc.Draw3dRect(&r, light, 0);
+ r.DeflateRect(0, 0, 1, 1);
+ dc.Draw3dRect(&r, light, shadow);
+ r.DeflateRect(1, 1, 1, 1);
+
+ CBrush b(bkg);
+
+ dc.FrameRect(&r, &b);
+ r.DeflateRect(0, 1, 0, 1);
+ dc.FrameRect(&r, &b);
+
+ r.DeflateRect(1, 1, 0, 0);
+ dc.Draw3dRect(&r, shadow, bkg);
+
+ if(fEnabled)
+ {
+ r.DeflateRect(1, 1, 1, 2);
+ CPen white(PS_INSIDEFRAME, 1, white);
+ CPen* old = dc.SelectObject(&white);
+ dc.MoveTo(r.left, r.top);
+ dc.LineTo(r.right, r.top);
+ dc.MoveTo(r.left, r.bottom);
+ dc.LineTo(r.right, r.bottom);
+ dc.SelectObject(old);
+ dc.SetPixel(r.CenterPoint().x, r.top, 0);
+ dc.SetPixel(r.CenterPoint().x, r.bottom, 0);
+ }
+
+ dc.SetPixel(r.CenterPoint().x+5, r.top-4, bkg);
+
+ {
+ CRgn rgn1, rgn2;
+ rgn1.CreateRectRgnIndirect(&rt);
+ rgn2.CreateRectRgnIndirect(&rit);
+ ExtSelectClipRgn(dc, rgn1, RGN_DIFF);
+ ExtSelectClipRgn(dc, rgn2, RGN_OR);
+ }
+ }
+
+ // channel
+ {
+ CRect r = GetChannelRect();
+
+ dc.FillSolidRect(&r, fEnabled ? white : bkg);
+ r.InflateRect(1, 1);
+ dc.Draw3dRect(&r, shadow, light);
+ dc.ExcludeClipRect(&r);
+ }
+
+ // background
+ {
+ CRect r;
+ GetClientRect(&r);
+ CBrush b(bkg);
+ dc.FillRect(&r, &b);
+ }
+
+
+ // Do not call CDialogBar::OnPaint() for painting messages
+}
+
+
+void CPlayerSeekBar::OnSize(UINT nType, int cx, int cy)
+{
+ CDialogBar::OnSize(nType, cx, cy);
+
+ Invalidate();
+}
+
+void CPlayerSeekBar::OnLButtonDown(UINT nFlags, CPoint point)
+{
+ if(m_fEnabled && (GetChannelRect() | GetThumbRect()).PtInRect(point))
+ {
+ SetCapture();
+ MoveThumb(point);
+ GetParent()->PostMessage(WM_HSCROLL, MAKEWPARAM((short)m_pos, SB_THUMBPOSITION), (LPARAM)m_hWnd);
+ }
+
+ CDialogBar::OnLButtonDown(nFlags, point);
+}
+
+void CPlayerSeekBar::OnLButtonUp(UINT nFlags, CPoint point)
+{
+ ReleaseCapture();
+
+ CDialogBar::OnLButtonUp(nFlags, point);
+}
+
+void CPlayerSeekBar::OnMouseMove(UINT nFlags, CPoint point)
+{
+ CWnd* w = GetCapture();
+ if(w && w->m_hWnd == m_hWnd && (nFlags & MK_LBUTTON))
+ {
+ MoveThumb(point);
+ GetParent()->PostMessage(WM_HSCROLL, MAKEWPARAM((short)m_pos, SB_THUMBTRACK), (LPARAM)m_hWnd);
+ }
+
+ CDialogBar::OnMouseMove(nFlags, point);
+}
+
+BOOL CPlayerSeekBar::OnEraseBkgnd(CDC* pDC)
+{
+ return TRUE;
+}
+
+BOOL CPlayerSeekBar::OnPlayStop(UINT nID)
+{
+ SetPos(0);
+ return FALSE;
+}
|