PlayerSeekBar.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:7k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. // PlayerSeekBar.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include "mplayerc.h"
  25. #include "PlayerSeekBar.h"
  26. // CPlayerSeekBar
  27. IMPLEMENT_DYNAMIC(CPlayerSeekBar, CDialogBar)
  28. CPlayerSeekBar::CPlayerSeekBar() : 
  29. m_start(0), m_stop(100), m_pos(0), m_posreal(0), 
  30. m_fEnabled(false)
  31. {
  32. }
  33. CPlayerSeekBar::~CPlayerSeekBar()
  34. {
  35. }
  36. BOOL CPlayerSeekBar::Create(CWnd* pParentWnd)
  37. {
  38. if(!CDialogBar::Create(pParentWnd, IDD_PLAYERSEEKBAR, WS_CHILD|WS_VISIBLE|CBRS_ALIGN_BOTTOM, IDD_PLAYERSEEKBAR))
  39. return FALSE;
  40. return TRUE;
  41. }
  42. BOOL CPlayerSeekBar::PreCreateWindow(CREATESTRUCT& cs)
  43. {
  44. if(!CDialogBar::PreCreateWindow(cs))
  45. return FALSE;
  46. m_dwStyle &= ~CBRS_BORDER_TOP;
  47. m_dwStyle &= ~CBRS_BORDER_BOTTOM;
  48. m_dwStyle |= CBRS_SIZE_FIXED;
  49. return TRUE;
  50. }
  51. void CPlayerSeekBar::Enable(bool fEnable)
  52. {
  53. m_fEnabled = fEnable;
  54. Invalidate();
  55. }
  56. void CPlayerSeekBar::GetRange(__int64& start, __int64& stop)
  57. {
  58. start = m_start;
  59. stop = m_stop;
  60. }
  61. void CPlayerSeekBar::SetRange(__int64 start, __int64 stop) 
  62. {
  63. if(start > stop) start ^= stop, stop ^= start, start ^= stop;
  64. m_start = start;
  65. m_stop = stop;
  66. if(m_pos < m_start || m_pos >= m_stop) SetPos(m_start);
  67. }
  68. __int64 CPlayerSeekBar::GetPos()
  69. {
  70. return(m_pos);
  71. }
  72. __int64 CPlayerSeekBar::GetPosReal()
  73. {
  74. return(m_posreal);
  75. }
  76. void CPlayerSeekBar::SetPos(__int64 pos)
  77. {
  78. CWnd* w = GetCapture();
  79. if(w && w->m_hWnd == m_hWnd) return;
  80. SetPosInternal(pos);
  81. }
  82. void CPlayerSeekBar::SetPosInternal(__int64 pos)
  83. {
  84. if(m_pos == pos) return;
  85. CRect before = GetThumbRect();
  86. m_pos = min(max(pos, m_start), m_stop);
  87. m_posreal = pos;
  88. CRect after = GetThumbRect();
  89. if(before != after) InvalidateRect(before | after);
  90. }
  91. CRect CPlayerSeekBar::GetChannelRect()
  92. {
  93. CRect r;
  94. GetClientRect(&r);
  95. r.DeflateRect(8, 9, 9, 0);
  96. r.bottom = r.top + 5;
  97. return(r);
  98. }
  99. CRect CPlayerSeekBar::GetThumbRect()
  100. {
  101. // bool fEnabled = m_fEnabled || m_start >= m_stop;
  102. CRect r = GetChannelRect();
  103. int x = r.left + (int)((m_start < m_stop /*&& fEnabled*/) ? (__int64)r.Width() * (m_pos - m_start) / (m_stop - m_start) : 0);
  104. int y = r.CenterPoint().y;
  105. r.SetRect(x, y, x, y);
  106. r.InflateRect(6, 7, 7, 8);
  107. return(r);
  108. }
  109. CRect CPlayerSeekBar::GetInnerThumbRect()
  110. {
  111. CRect r = GetThumbRect();
  112. bool fEnabled = m_fEnabled && m_start < m_stop;
  113. r.DeflateRect(3, fEnabled ? 5 : 4, 3, fEnabled ? 5 : 4);
  114. return(r);
  115. }
  116. void CPlayerSeekBar::MoveThumb(CPoint point)
  117. {
  118. CRect r = GetChannelRect();
  119. if(r.left >= r.right) return;
  120. if(point.x < r.left) SetPos(m_start);
  121. else if(point.x >= r.right) SetPos(m_stop);
  122. else
  123. {
  124. __int64 w = r.right - r.left;
  125. if(m_start < m_stop)
  126. SetPosInternal(m_start + ((m_stop - m_start) * (point.x - r.left) + (w/2)) / w);
  127. }
  128. }
  129. BEGIN_MESSAGE_MAP(CPlayerSeekBar, CDialogBar)
  130. //{{AFX_MSG_MAP(CPlayerSeekBar)
  131. ON_WM_PAINT()
  132. ON_WM_SIZE()
  133. ON_WM_LBUTTONDOWN()
  134. ON_WM_LBUTTONUP()
  135. ON_WM_MOUSEMOVE()
  136. ON_WM_ERASEBKGND()
  137. //}}AFX_MSG_MAP
  138. ON_COMMAND_EX(ID_PLAY_STOP, OnPlayStop)
  139. END_MESSAGE_MAP()
  140. // CPlayerSeekBar message handlers
  141. void CPlayerSeekBar::OnPaint()
  142. {
  143. CPaintDC dc(this); // device context for painting
  144. bool fEnabled = m_fEnabled && m_start < m_stop;
  145. COLORREF 
  146. white = GetSysColor(COLOR_WINDOW),
  147. shadow = GetSysColor(COLOR_3DSHADOW), 
  148. light = GetSysColor(COLOR_3DHILIGHT), 
  149. bkg = GetSysColor(COLOR_BTNFACE);
  150. // thumb
  151. {
  152. CRect r = GetThumbRect(), r2 = GetInnerThumbRect();
  153. CRect rt = r, rit = r2;
  154. dc.Draw3dRect(&r, light, 0);
  155. r.DeflateRect(0, 0, 1, 1);
  156. dc.Draw3dRect(&r, light, shadow);
  157. r.DeflateRect(1, 1, 1, 1);
  158. CBrush b(bkg);
  159. dc.FrameRect(&r, &b);
  160. r.DeflateRect(0, 1, 0, 1);
  161. dc.FrameRect(&r, &b);
  162. r.DeflateRect(1, 1, 0, 0);
  163. dc.Draw3dRect(&r, shadow, bkg);
  164. if(fEnabled)
  165. {
  166. r.DeflateRect(1, 1, 1, 2);
  167. CPen white(PS_INSIDEFRAME, 1, white);
  168. CPen* old = dc.SelectObject(&white);
  169. dc.MoveTo(r.left, r.top);
  170. dc.LineTo(r.right, r.top);
  171. dc.MoveTo(r.left, r.bottom);
  172. dc.LineTo(r.right, r.bottom);
  173. dc.SelectObject(old);
  174. dc.SetPixel(r.CenterPoint().x, r.top, 0);
  175. dc.SetPixel(r.CenterPoint().x, r.bottom, 0);
  176. }
  177. dc.SetPixel(r.CenterPoint().x+5, r.top-4, bkg);
  178. {
  179. CRgn rgn1, rgn2;
  180. rgn1.CreateRectRgnIndirect(&rt);
  181. rgn2.CreateRectRgnIndirect(&rit);
  182. ExtSelectClipRgn(dc, rgn1, RGN_DIFF);
  183. ExtSelectClipRgn(dc, rgn2, RGN_OR);
  184. }
  185. }
  186. // channel
  187. {
  188. CRect r = GetChannelRect();
  189. dc.FillSolidRect(&r, fEnabled ? white : bkg);
  190. r.InflateRect(1, 1);
  191. dc.Draw3dRect(&r, shadow, light);
  192. dc.ExcludeClipRect(&r);
  193. }
  194. // background
  195. {
  196. CRect r;
  197. GetClientRect(&r);
  198. CBrush b(bkg);
  199. dc.FillRect(&r, &b);
  200. }
  201. // Do not call CDialogBar::OnPaint() for painting messages
  202. }
  203. void CPlayerSeekBar::OnSize(UINT nType, int cx, int cy)
  204. {
  205. CDialogBar::OnSize(nType, cx, cy);
  206. Invalidate();
  207. }
  208. void CPlayerSeekBar::OnLButtonDown(UINT nFlags, CPoint point)
  209. {
  210. if(m_fEnabled && (GetChannelRect() | GetThumbRect()).PtInRect(point))
  211. {
  212. SetCapture();
  213. MoveThumb(point);
  214. GetParent()->PostMessage(WM_HSCROLL, MAKEWPARAM((short)m_pos, SB_THUMBPOSITION), (LPARAM)m_hWnd);
  215. }
  216. CDialogBar::OnLButtonDown(nFlags, point);
  217. }
  218. void CPlayerSeekBar::OnLButtonUp(UINT nFlags, CPoint point)
  219. {
  220. ReleaseCapture();
  221. CDialogBar::OnLButtonUp(nFlags, point);
  222. }
  223. void CPlayerSeekBar::OnMouseMove(UINT nFlags, CPoint point)
  224. {
  225. CWnd* w = GetCapture();
  226. if(w && w->m_hWnd == m_hWnd && (nFlags & MK_LBUTTON))
  227. {
  228. MoveThumb(point);
  229. GetParent()->PostMessage(WM_HSCROLL, MAKEWPARAM((short)m_pos, SB_THUMBTRACK), (LPARAM)m_hWnd);
  230. }
  231. CDialogBar::OnMouseMove(nFlags, point);
  232. }
  233. BOOL CPlayerSeekBar::OnEraseBkgnd(CDC* pDC)
  234. {
  235. return TRUE;
  236. }
  237. BOOL CPlayerSeekBar::OnPlayStop(UINT nID)
  238. {
  239. SetPos(0);
  240. return FALSE;
  241. }