PlayerStatusBar.cpp
上传用户:tangyu_668
上传日期:2014-02-27
资源大小:678k
文件大小:8k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2006 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. // PlayerStatusBar.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include "mplayerc.h"
  25. #include "PlayerStatusBar.h"
  26. #include "MainFrm.h"
  27. #include "....DSUtilDSUtil.h"
  28. // CPlayerStatusBar
  29. IMPLEMENT_DYNAMIC(CPlayerStatusBar, CDialogBar)
  30. CPlayerStatusBar::CPlayerStatusBar() 
  31. : m_status(false, false)
  32. , m_time(true, false)
  33. , m_bmid(0)
  34. , m_hIcon(0)
  35. {
  36. }
  37. CPlayerStatusBar::~CPlayerStatusBar()
  38. {
  39. if(m_hIcon) DestroyIcon(m_hIcon);
  40. }
  41. BOOL CPlayerStatusBar::Create(CWnd* pParentWnd)
  42. {
  43. return CDialogBar::Create(pParentWnd, IDD_PLAYERSTATUSBAR, WS_CHILD|WS_VISIBLE|CBRS_ALIGN_BOTTOM, IDD_PLAYERSTATUSBAR);
  44. }
  45. BOOL CPlayerStatusBar::PreCreateWindow(CREATESTRUCT& cs)
  46. {
  47. if(!CDialogBar::PreCreateWindow(cs))
  48. return FALSE;
  49. m_dwStyle &= ~CBRS_BORDER_TOP;
  50. m_dwStyle &= ~CBRS_BORDER_BOTTOM;
  51. return TRUE;
  52. }
  53. int CPlayerStatusBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
  54. {
  55. if(CDialogBar::OnCreate(lpCreateStruct) == -1)
  56. return -1;
  57. CRect r;
  58. r.SetRectEmpty();
  59. m_type.Create(_T(""), WS_CHILD|WS_VISIBLE|SS_ICON, 
  60. r, this, IDC_STATIC1);
  61. m_status.Create(_T(""), WS_CHILD|WS_VISIBLE|SS_OWNERDRAW, 
  62. r, this, IDC_PLAYERSTATUS);
  63. m_time.Create(_T(""), WS_CHILD|WS_VISIBLE|SS_OWNERDRAW, 
  64. r, this, IDC_PLAYERTIME);
  65. m_status.SetWindowPos(&m_time, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
  66. Relayout();
  67. return 0;
  68. }
  69. void CPlayerStatusBar::Relayout()
  70. {
  71. BITMAP bm;
  72. memset(&bm, 0, sizeof(bm));
  73. if(m_bm.m_hObject) m_bm.GetBitmap(&bm);
  74. CRect r, r2;
  75. GetClientRect(r);
  76. r.DeflateRect(27, 5, bm.bmWidth + 8, 4);
  77. int div = r.right - (m_time.IsWindowVisible() ? 140 : 0);
  78. CString str;
  79. m_time.GetWindowText(str);
  80. if(CDC* pDC = m_time.GetDC())
  81. {
  82. CFont* pOld = pDC->SelectObject(&m_time.GetFont());
  83. div = r.right - pDC->GetTextExtent(str).cx;
  84. pDC->SelectObject(pOld);
  85. m_time.ReleaseDC(pDC);
  86. }
  87. r2 = r;
  88. r2.right = div - 2;
  89. m_status.MoveWindow(&r2);
  90. r2 = r;
  91. r2.left = div;
  92. m_time.MoveWindow(&r2);
  93. GetClientRect(r);
  94. r.SetRect(6, r.top+4, 22, r.bottom-4);
  95. m_type.MoveWindow(r);
  96. Invalidate();
  97. }
  98. void CPlayerStatusBar::Clear()
  99. {
  100. m_status.SetWindowText(_T(""));
  101. m_time.SetWindowText(_T(""));
  102. SetStatusBitmap(0);
  103. SetStatusTypeIcon(0);
  104. Relayout();
  105. }
  106. void CPlayerStatusBar::SetStatusBitmap(UINT id)
  107. {
  108. if(m_bmid == id) return;
  109. if(m_bm.m_hObject) m_bm.DeleteObject();
  110. if(id) m_bm.LoadBitmap(id);
  111. m_bmid = id;
  112. Relayout();
  113. }
  114. void CPlayerStatusBar::SetStatusTypeIcon(HICON hIcon)
  115. {
  116. if(m_hIcon == hIcon) return;
  117. if(m_hIcon) DestroyIcon(m_hIcon);
  118. m_type.SetIcon(m_hIcon = hIcon);
  119. Relayout();
  120. }
  121. void CPlayerStatusBar::SetStatusMessage(CString str)
  122. {
  123. str.Trim();
  124. m_status.SetWindowText(str);
  125. }
  126. void CPlayerStatusBar::SetStatusTimer(CString str)
  127. {
  128. CString tmp;
  129. m_time.GetWindowText(tmp);
  130. if(tmp == str) return;
  131. str.Trim();
  132. m_time.SetWindowText(str);
  133. Relayout();
  134. }
  135. void CPlayerStatusBar::SetStatusTimer(REFERENCE_TIME rtNow, REFERENCE_TIME rtDur, bool fHighPrecision, const GUID* pTimeFormat)
  136. {
  137. ASSERT(pTimeFormat);
  138. CString str;
  139. CString posstr, durstr;
  140. if(*pTimeFormat == TIME_FORMAT_MEDIA_TIME)
  141. {
  142. DVD_HMSF_TIMECODE tcNow = RT2HMSF(rtNow);
  143. DVD_HMSF_TIMECODE tcDur = RT2HMSF(rtDur);
  144. if(tcDur.bHours > 0 || (rtNow >= rtDur && tcNow.bHours > 0)) 
  145. posstr.Format(_T("%02d:%02d:%02d"), tcNow.bHours, tcNow.bMinutes, tcNow.bSeconds);
  146. else 
  147. posstr.Format(_T("%02d:%02d"), tcNow.bMinutes, tcNow.bSeconds);
  148. if(tcDur.bHours > 0)
  149. durstr.Format(_T("%02d:%02d:%02d"), tcDur.bHours, tcDur.bMinutes, tcDur.bSeconds);
  150. else
  151. durstr.Format(_T("%02d:%02d"), tcDur.bMinutes, tcDur.bSeconds);
  152. if(fHighPrecision)
  153. {
  154. str.Format(_T("%s.%03d"), posstr, (rtNow/10000)%1000);
  155. posstr = str;
  156. str.Format(_T("%s.%03d"), durstr, (rtDur/10000)%1000);
  157. durstr = str;
  158. str.Empty();
  159. }
  160. }
  161. else if(*pTimeFormat == TIME_FORMAT_FRAME)
  162. {
  163. posstr.Format(_T("%I64d"), rtNow);
  164. durstr.Format(_T("%I64d"), rtDur);
  165. }
  166. str = (/*start <= 0 &&*/ rtDur <= 0) ? posstr : posstr + _T(" / ") + durstr;
  167. SetStatusTimer(str);
  168. }
  169. void CPlayerStatusBar::ShowTimer(bool fShow)
  170. {
  171. m_time.ShowWindow(fShow ? SW_SHOW : SW_HIDE);
  172. Relayout();
  173. }
  174. BEGIN_MESSAGE_MAP(CPlayerStatusBar, CDialogBar)
  175. ON_WM_ERASEBKGND()
  176. ON_WM_PAINT()
  177. ON_WM_SIZE()
  178. ON_WM_CREATE()
  179. ON_WM_LBUTTONDOWN()
  180. ON_WM_SETCURSOR()
  181. ON_WM_CTLCOLOR()
  182. END_MESSAGE_MAP()
  183. // CPlayerStatusBar message handlers
  184. BOOL CPlayerStatusBar::OnEraseBkgnd(CDC* pDC)
  185. {
  186. for(CWnd* pChild = GetWindow(GW_CHILD); pChild; pChild = pChild->GetNextWindow())
  187. {
  188. if(!pChild->IsWindowVisible()) continue;
  189. CRect r;
  190. pChild->GetClientRect(&r);
  191. pChild->MapWindowPoints(this, &r);
  192. pDC->ExcludeClipRect(&r);
  193. }
  194. CRect r;
  195. GetClientRect(&r);
  196. CMainFrame* pFrame = ((CMainFrame*)GetParentFrame());
  197. if(pFrame->m_pLastBar != this || pFrame->m_fFullScreen)
  198. r.InflateRect(0, 0, 0, 1);
  199. if(pFrame->m_fFullScreen) 
  200. r.InflateRect(1, 0, 1, 0);
  201. pDC->Draw3dRect(&r, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DHILIGHT)); 
  202. r.DeflateRect(1, 1);
  203. pDC->FillSolidRect(&r, 0);
  204. return TRUE;
  205. }
  206. void CPlayerStatusBar::OnPaint()
  207. {
  208. CPaintDC dc(this); // device context for painting
  209. CRect r;
  210. if(m_bm.m_hObject)
  211. {
  212. BITMAP bm;
  213. m_bm.GetBitmap(&bm);
  214. CDC memdc;
  215. memdc.CreateCompatibleDC(&dc);
  216. memdc.SelectObject(&m_bm);
  217. GetClientRect(&r);
  218. dc.BitBlt(r.right-bm.bmWidth-1, (r.Height() - bm.bmHeight)/2, bm.bmWidth, bm.bmHeight, &memdc, 0, 0, SRCCOPY);
  219. //
  220. }
  221. /*
  222. if(m_hIcon)
  223. {
  224. GetClientRect(&r);
  225. r.SetRect(6, r.top+4, 22-1, r.bottom-4-1);
  226. DrawIconEx(dc, r.left, r.top, m_hIcon, r.Width(), r.Height(), 0, NULL, DI_NORMAL|DI_COMPAT);
  227. }
  228. */
  229. // Do not call CDialogBar::OnPaint() for painting messages
  230. }
  231. void CPlayerStatusBar::OnSize(UINT nType, int cx, int cy)
  232. {
  233. CDialogBar::OnSize(nType, cx, cy);
  234. Relayout();
  235. }
  236. void CPlayerStatusBar::OnLButtonDown(UINT nFlags, CPoint point)
  237. {
  238. CMainFrame* pFrame = ((CMainFrame*)GetParentFrame());
  239. WINDOWPLACEMENT wp;
  240. wp.length = sizeof(wp);
  241. pFrame->GetWindowPlacement(&wp);
  242. if(!pFrame->m_fFullScreen && wp.showCmd != SW_SHOWMAXIMIZED)
  243. {
  244. CRect r;
  245. GetClientRect(r);
  246. CPoint p = point;
  247. MapWindowPoints(pFrame, &point, 1);
  248. pFrame->PostMessage(WM_NCLBUTTONDOWN, 
  249. // (p.x+p.y >= r.Width()) ? HTBOTTOMRIGHT : HTCAPTION, 
  250. (p.x >= r.Width()-r.Height()) ? HTBOTTOMRIGHT :
  251. HTCAPTION,
  252. MAKELPARAM(point.x, point.y));
  253. }
  254. }
  255. BOOL CPlayerStatusBar::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
  256. {
  257. CMainFrame* pFrame = ((CMainFrame*)GetParentFrame());
  258. WINDOWPLACEMENT wp;
  259. wp.length = sizeof(wp);
  260. pFrame->GetWindowPlacement(&wp);
  261. if(!pFrame->m_fFullScreen && wp.showCmd != SW_SHOWMAXIMIZED)
  262. {
  263. CRect r;
  264. GetClientRect(r);
  265. CPoint p;
  266. GetCursorPos(&p);
  267. ScreenToClient(&p);
  268. // if(p.x+p.y >= r.Width())
  269. if(p.x >= r.Width()-r.Height())
  270. {
  271. SetCursor(LoadCursor(NULL, IDC_SIZENWSE));
  272. return TRUE;
  273. }
  274. }
  275. return CDialogBar::OnSetCursor(pWnd, nHitTest, message);
  276. }
  277. HBRUSH CPlayerStatusBar::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  278. {
  279. HBRUSH hbr = CDialogBar::OnCtlColor(pDC, pWnd, nCtlColor);
  280. if(*pWnd == m_type)
  281. {
  282. hbr = GetStockBrush(BLACK_BRUSH);
  283. }
  284. // TODO:  Return a different brush if the default is not desired
  285. return hbr;
  286. }