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

多媒体编程

开发平台:

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. // PlayerInfoBar.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include "mplayerc.h"
  25. #include "PlayerInfoBar.h"
  26. #include "MainFrm.h"
  27. // CPlayerInfoBar
  28. IMPLEMENT_DYNAMIC(CPlayerInfoBar, CDialogBar)
  29. CPlayerInfoBar::CPlayerInfoBar(int nFirstColWidth) : m_nFirstColWidth(nFirstColWidth)
  30. {
  31. }
  32. CPlayerInfoBar::~CPlayerInfoBar()
  33. {
  34. }
  35. void CPlayerInfoBar::SetLine(CString label, CString info)
  36. {
  37. if(info.IsEmpty()) 
  38. {
  39. RemoveLine(label);
  40. return;
  41. }
  42. for(size_t idx = 0; idx < m_label.GetCount(); idx++)
  43. {
  44. CString tmp;
  45. m_label[idx]->GetWindowText(tmp);
  46. if(label == tmp)
  47. {
  48. m_info[idx]->GetWindowText(tmp);
  49. if(info != tmp) m_info[idx]->SetWindowText(info);
  50. return;
  51. }
  52. }
  53. CAutoPtr<CStatusLabel> l(new CStatusLabel(true, false));
  54. l->Create(label, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|SS_OWNERDRAW, CRect(0,0,0,0), this);
  55. m_label.Add(l);
  56. CAutoPtr<CStatusLabel> i(new CStatusLabel(false, true));
  57. i->Create(info, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|SS_OWNERDRAW, CRect(0,0,0,0), this);
  58. m_info.Add(i);
  59. Relayout();
  60. }
  61. void CPlayerInfoBar::GetLine(CString label, CString& info)
  62. {
  63. info.Empty();
  64. for(size_t idx = 0; idx < m_label.GetCount(); idx++)
  65. {
  66. CString tmp;
  67. m_label[idx]->GetWindowText(tmp);
  68. if(label == tmp)
  69. {
  70. m_info[idx]->GetWindowText(tmp);
  71. info = tmp;
  72. return;
  73. }
  74. }
  75. }
  76. void CPlayerInfoBar::RemoveLine(CString label)
  77. {
  78. for(size_t i = 0; i < m_label.GetCount(); i++)
  79. {
  80. CString tmp;
  81. m_label[i]->GetWindowText(tmp);
  82. if(label == tmp)
  83. {
  84. m_label.RemoveAt(i);
  85. m_info.RemoveAt(i);
  86. break;
  87. }
  88. }
  89. Relayout();
  90. }
  91. void CPlayerInfoBar::RemoveAllLines()
  92. {
  93. m_label.RemoveAll();
  94. m_info.RemoveAll();
  95. Relayout();
  96. }
  97. BOOL CPlayerInfoBar::Create(CWnd* pParentWnd)
  98. {
  99. return CDialogBar::Create(pParentWnd, IDD_PLAYERINFOBAR, WS_CHILD|WS_VISIBLE|CBRS_ALIGN_BOTTOM, IDD_PLAYERINFOBAR);
  100. }
  101. BOOL CPlayerInfoBar::PreCreateWindow(CREATESTRUCT& cs)
  102. {
  103. if(!CDialogBar::PreCreateWindow(cs))
  104. return FALSE;
  105. m_dwStyle &= ~CBRS_BORDER_TOP;
  106. m_dwStyle &= ~CBRS_BORDER_BOTTOM;
  107. return TRUE;
  108. }
  109. CSize CPlayerInfoBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
  110. {
  111. CRect r;
  112. GetParent()->GetClientRect(&r);
  113. r.bottom = r.top + m_label.GetCount() * 17 + (m_label.GetCount() ? 4 : 0);
  114. return r.Size();
  115. }
  116. void CPlayerInfoBar::Relayout()
  117. {
  118. CRect r;
  119. GetParent()->GetClientRect(&r);
  120. int w = m_nFirstColWidth, h = 17, y = 2;
  121. for(size_t i = 0; i < m_label.GetCount(); i++)
  122. {
  123. CDC* pDC = m_label[i]->GetDC();
  124. CString str;
  125. m_label[i]->GetWindowText(str);
  126. w = max(w, pDC->GetTextExtent(str).cx);
  127. m_label[i]->ReleaseDC(pDC);
  128. }
  129. for(size_t i = 0; i < m_label.GetCount(); i++, y += h)
  130. {
  131. m_label[i]->MoveWindow(1, y, w - 10, h);
  132. m_info[i]->MoveWindow(w + 10, y, r.Width()-(w+10)-1, h);
  133. }
  134. }
  135. BEGIN_MESSAGE_MAP(CPlayerInfoBar, CDialogBar)
  136. ON_WM_ERASEBKGND()
  137. ON_WM_SIZE()
  138. ON_WM_LBUTTONDOWN()
  139. END_MESSAGE_MAP()
  140. // CPlayerInfoBar message handlers
  141. BOOL CPlayerInfoBar::OnEraseBkgnd(CDC* pDC)
  142. {
  143. for(CWnd* pChild = GetWindow(GW_CHILD); pChild; pChild = pChild->GetNextWindow())
  144. {
  145. CRect r;
  146. pChild->GetClientRect(&r);
  147. pChild->MapWindowPoints(this, &r);
  148. pDC->ExcludeClipRect(&r);
  149. }
  150. CRect r;
  151. GetClientRect(&r);
  152. CMainFrame* pFrame = ((CMainFrame*)GetParentFrame());
  153. if(pFrame->m_pLastBar != this || pFrame->m_fFullScreen)
  154. r.InflateRect(0, 0, 0, 1);
  155. if(pFrame->m_fFullScreen) 
  156. r.InflateRect(1, 0, 1, 0);
  157. pDC->Draw3dRect(&r, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DHILIGHT)); 
  158. r.DeflateRect(1, 1);
  159. pDC->FillSolidRect(&r, 0);
  160. return TRUE;
  161. }
  162. void CPlayerInfoBar::OnSize(UINT nType, int cx, int cy)
  163. {
  164. CDialogBar::OnSize(nType, cx, cy);
  165. Relayout();
  166. Invalidate();
  167. }
  168. void CPlayerInfoBar::OnLButtonDown(UINT nFlags, CPoint point)
  169. {
  170. CMainFrame* pFrame = ((CMainFrame*)GetParentFrame());
  171. if(!pFrame->m_fFullScreen)
  172. {
  173. MapWindowPoints(pFrame, &point, 1);
  174. pFrame->PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
  175. }
  176. }