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

多媒体编程

开发平台:

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. // VolumeCtrl.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include "mplayerc.h"
  25. #include "VolumeCtrl.h"
  26. // CVolumeCtrl
  27. IMPLEMENT_DYNAMIC(CVolumeCtrl, CSliderCtrl)
  28. CVolumeCtrl::CVolumeCtrl(bool fSelfDrawn) : m_fSelfDrawn(fSelfDrawn)
  29. {
  30. }
  31. CVolumeCtrl::~CVolumeCtrl()
  32. {
  33. }
  34. bool CVolumeCtrl::Create(CWnd* pParentWnd)
  35. {
  36. if(!CSliderCtrl::Create(WS_CHILD|WS_VISIBLE|TBS_NOTICKS|TBS_HORZ, CRect(0,0,0,0), pParentWnd, IDC_SLIDER1))
  37. return(false);
  38. SetRange(1, 100);
  39. SetPosInternal(AfxGetAppSettings().nVolume);
  40. SetPageSize(8);
  41. SetLineSize(0);
  42. return(true);
  43. }
  44. void CVolumeCtrl::SetPosInternal(int pos)
  45. {
  46. SetPos(pos);
  47. GetParent()->PostMessage(WM_HSCROLL, MAKEWPARAM((short)pos, SB_THUMBPOSITION), (LPARAM)m_hWnd); // this will be reflected back on us
  48. }
  49. void CVolumeCtrl::IncreaseVolume()
  50. {
  51. SetPosInternal(GetPos() + GetPageSize());
  52. }
  53. void CVolumeCtrl::DecreaseVolume()
  54. {
  55. SetPosInternal(GetPos() - GetPageSize());
  56. }
  57. BEGIN_MESSAGE_MAP(CVolumeCtrl, CSliderCtrl)
  58. ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw)
  59. ON_WM_LBUTTONDOWN()
  60. ON_WM_SETFOCUS()
  61. ON_WM_HSCROLL_REFLECT()
  62. END_MESSAGE_MAP()
  63. // CVolumeCtrl message handlers
  64. void CVolumeCtrl::OnNMCustomdraw(NMHDR* pNMHDR, LRESULT* pResult)
  65. {
  66. LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
  67. LRESULT lr = CDRF_DODEFAULT;
  68. if(m_fSelfDrawn)
  69. switch(pNMCD->dwDrawStage)
  70. {
  71. case CDDS_PREPAINT:
  72. lr = CDRF_NOTIFYITEMDRAW;
  73. break;
  74. case CDDS_ITEMPREPAINT:
  75. if(pNMCD->dwItemSpec == TBCD_CHANNEL)
  76. {
  77. CDC dc;
  78. dc.Attach(pNMCD->hdc);
  79. CRect r;
  80. GetClientRect(r);
  81. r.DeflateRect(8, 4, 10, 6);
  82. CopyRect(&pNMCD->rc, &r);
  83. CPen shadow(PS_SOLID, 1, GetSysColor(COLOR_3DSHADOW));
  84. CPen light(PS_SOLID, 1, GetSysColor(COLOR_3DHILIGHT));
  85. CPen* old = dc.SelectObject(&light);
  86. dc.MoveTo(pNMCD->rc.right, pNMCD->rc.top);
  87. dc.LineTo(pNMCD->rc.right, pNMCD->rc.bottom);
  88. dc.LineTo(pNMCD->rc.left, pNMCD->rc.bottom);
  89. dc.SelectObject(&shadow);
  90. dc.LineTo(pNMCD->rc.right, pNMCD->rc.top);
  91. dc.SelectObject(old);
  92. dc.Detach();
  93. lr = CDRF_SKIPDEFAULT;
  94. }
  95. else if(pNMCD->dwItemSpec == TBCD_THUMB)
  96. {
  97. CDC dc;
  98. dc.Attach(pNMCD->hdc);
  99. pNMCD->rc.bottom--;
  100. CRect r(pNMCD->rc);
  101. r.DeflateRect(0, 0, 1, 0);
  102. COLORREF shadow = GetSysColor(COLOR_3DSHADOW);
  103. COLORREF light = GetSysColor(COLOR_3DHILIGHT);
  104. dc.Draw3dRect(&r, light, 0);
  105. r.DeflateRect(0, 0, 1, 1);
  106. dc.Draw3dRect(&r, light, shadow);
  107. r.DeflateRect(1, 1, 1, 1);
  108. dc.FillSolidRect(&r, GetSysColor(COLOR_BTNFACE));
  109. dc.SetPixel(r.left+7, r.top-1, GetSysColor(COLOR_BTNFACE));
  110. dc.Detach();
  111. lr = CDRF_SKIPDEFAULT;
  112. }
  113. break;
  114. };
  115. pNMCD->uItemState &= ~CDIS_FOCUS;
  116. *pResult = lr;
  117. }
  118. void CVolumeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
  119. {
  120. CRect r;
  121. GetChannelRect(&r);
  122. if(r.left >= r.right) return;
  123. int start, stop;
  124. GetRange(start, stop);
  125. int pos = GetPos();
  126. r.left += 3;
  127. r.right -= 4;
  128. if(point.x < r.left) SetPos(start);
  129. else if(point.x >= r.right) SetPos(stop);
  130. else
  131. {
  132. int w = r.right - r.left;
  133. if(start < stop)
  134. SetPosInternal(start + ((stop - start) * (point.x - r.left) + (w/2)) / w);
  135. }
  136. CSliderCtrl::OnLButtonDown(nFlags, point);
  137. }
  138. void CVolumeCtrl::OnSetFocus(CWnd* pOldWnd)
  139. {
  140. CSliderCtrl::OnSetFocus(pOldWnd);
  141. AfxGetMainWnd()->SetFocus(); // don't focus on us, parents will take care of our positioning
  142. }
  143. void CVolumeCtrl::HScroll(UINT nSBCode, UINT nPos)
  144. {
  145. AfxGetAppSettings().nVolume = GetPos();
  146. CFrameWnd* pFrame = GetParentFrame();
  147. if(pFrame && pFrame != GetParent())
  148. pFrame->PostMessage(WM_HSCROLL, MAKEWPARAM((short)nPos, nSBCode), (LPARAM)m_hWnd);
  149. }