VolumeCtrl.cpp

00001 /* 
00002  *      Copyright (C) 2003-2005 Gabest
00003  *      http://www.gabest.org
00004  *
00005  *  This Program is free software; you can redistribute it and/or modify
00006  *  it under the terms of the GNU General Public License as published by
00007  *  the Free Software Foundation; either version 2, or (at your option)
00008  *  any later version.
00009  *   
00010  *  This Program is distributed in the hope that it will be useful,
00011  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00013  *  GNU General Public License for more details.
00014  *   
00015  *  You should have received a copy of the GNU General Public License
00016  *  along with GNU Make; see the file COPYING.  If not, write to
00017  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
00018  *  http://www.gnu.org/copyleft/gpl.html
00019  *
00020  */
00021 
00022 // VolumeCtrl.cpp : implementation file
00023 //
00024 
00025 #include "stdafx.h"
00026 #include "mplayerc.h"
00027 #include "VolumeCtrl.h"
00028 
00029 
00030 // CVolumeCtrl
00031 
00032 IMPLEMENT_DYNAMIC(CVolumeCtrl, CSliderCtrl)
00033 CVolumeCtrl::CVolumeCtrl(bool fSelfDrawn) : m_fSelfDrawn(fSelfDrawn)
00034 {
00035 }
00036 
00037 CVolumeCtrl::~CVolumeCtrl()
00038 {
00039 }
00040 
00041 bool CVolumeCtrl::Create(CWnd* pParentWnd)
00042 {
00043         if(!CSliderCtrl::Create(WS_CHILD|WS_VISIBLE|TBS_NOTICKS|TBS_HORZ, CRect(0,0,0,0), pParentWnd, IDC_VOLUMESLIDER))
00044                 return(false);
00045 
00046         SetRange(1, 100);
00047         SetPosInternal(AfxGetAppSettings().nVolume);
00048         SetPageSize(8);
00049         SetLineSize(0);
00050 
00051         return(true);
00052 }
00053 
00054 void CVolumeCtrl::SetPosInternal(int pos)
00055 {
00056         SetPos(pos);
00057         GetParent()->PostMessage(WM_HSCROLL, MAKEWPARAM((short)pos, SB_THUMBPOSITION), (LPARAM)m_hWnd); // this will be reflected back on us
00058 }
00059 
00060 void CVolumeCtrl::IncreaseVolume()
00061 {
00062         SetPosInternal(GetPos() + GetPageSize());
00063 }
00064 
00065 void CVolumeCtrl::DecreaseVolume()
00066 {
00067         SetPosInternal(GetPos() - GetPageSize());
00068 }
00069 
00070 BEGIN_MESSAGE_MAP(CVolumeCtrl, CSliderCtrl)
00071         ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw)
00072         ON_WM_LBUTTONDOWN()
00073         ON_WM_SETFOCUS()
00074         ON_WM_HSCROLL_REFLECT()
00075 END_MESSAGE_MAP()
00076 
00077 // CVolumeCtrl message handlers
00078 
00079 
00080 void CVolumeCtrl::OnNMCustomdraw(NMHDR* pNMHDR, LRESULT* pResult)
00081 {
00082         LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
00083 
00084         LRESULT lr = CDRF_DODEFAULT;
00085 
00086         if(m_fSelfDrawn)
00087         switch(pNMCD->dwDrawStage)
00088         {
00089         case CDDS_PREPAINT:
00090                 lr = CDRF_NOTIFYITEMDRAW;
00091                 break;
00092 
00093         case CDDS_ITEMPREPAINT:
00094                 if(pNMCD->dwItemSpec == TBCD_CHANNEL)
00095                 {
00096                         CDC dc;
00097                         dc.Attach(pNMCD->hdc);
00098 
00099                                 CRect r;
00100                                 GetClientRect(r);
00101                                 r.DeflateRect(8, 4, 10, 6);
00102                                 CopyRect(&pNMCD->rc, &r);
00103                                 CPen shadow(PS_SOLID, 1, GetSysColor(COLOR_3DSHADOW));
00104                                 CPen light(PS_SOLID, 1, GetSysColor(COLOR_3DHILIGHT));
00105                                 CPen* old = dc.SelectObject(&light);
00106                                 dc.MoveTo(pNMCD->rc.right, pNMCD->rc.top);
00107                                 dc.LineTo(pNMCD->rc.right, pNMCD->rc.bottom);
00108                                 dc.LineTo(pNMCD->rc.left, pNMCD->rc.bottom);
00109                                 dc.SelectObject(&shadow);
00110                                 dc.LineTo(pNMCD->rc.right, pNMCD->rc.top);
00111                                 dc.SelectObject(old);
00112 
00113                         dc.Detach();
00114                         lr = CDRF_SKIPDEFAULT;
00115                 }
00116                 else if(pNMCD->dwItemSpec == TBCD_THUMB)
00117                 {
00118                         CDC dc;
00119                         dc.Attach(pNMCD->hdc);
00120                         pNMCD->rc.bottom--;
00121                         CRect r(pNMCD->rc);
00122                         r.DeflateRect(0, 0, 1, 0);
00123                 
00124                                 COLORREF shadow = GetSysColor(COLOR_3DSHADOW);
00125                                 COLORREF light = GetSysColor(COLOR_3DHILIGHT);
00126                                 dc.Draw3dRect(&r, light, 0);
00127                                 r.DeflateRect(0, 0, 1, 1);
00128                                 dc.Draw3dRect(&r, light, shadow);
00129                                 r.DeflateRect(1, 1, 1, 1);
00130                                 dc.FillSolidRect(&r, GetSysColor(COLOR_BTNFACE));
00131                                 dc.SetPixel(r.left+7, r.top-1, GetSysColor(COLOR_BTNFACE));
00132                 
00133                         dc.Detach();
00134                         lr = CDRF_SKIPDEFAULT;
00135                 }
00136 
00137                 break;
00138         };
00139 
00140         pNMCD->uItemState &= ~CDIS_FOCUS;
00141 
00142         *pResult = lr;
00143 }
00144 
00145 void CVolumeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
00146 {
00147         CRect r;
00148         GetChannelRect(&r);
00149         
00150         if(r.left >= r.right) return;
00151 
00152         int start, stop;
00153         GetRange(start, stop);
00154 
00155         int pos = GetPos();
00156 
00157         r.left += 3;
00158         r.right -= 4;
00159 
00160         if(point.x < r.left) SetPos(start);
00161         else if(point.x >= r.right) SetPos(stop);
00162         else
00163         {
00164                 int w = r.right - r.left;
00165                 if(start < stop)
00166                         SetPosInternal(start + ((stop - start) * (point.x - r.left) + (w/2)) / w);
00167         }
00168 
00169         CSliderCtrl::OnLButtonDown(nFlags, point);
00170 }
00171 
00172 void CVolumeCtrl::OnSetFocus(CWnd* pOldWnd)
00173 {
00174         CSliderCtrl::OnSetFocus(pOldWnd);
00175 
00176         AfxGetMainWnd()->SetFocus(); // don't focus on us, parents will take care of our positioning
00177 }
00178 
00179 void CVolumeCtrl::HScroll(UINT nSBCode, UINT nPos)
00180 {
00181         AfxGetAppSettings().nVolume = GetPos();
00182 
00183         CFrameWnd* pFrame = GetParentFrame();
00184         if(pFrame && pFrame != GetParent())
00185                 pFrame->PostMessage(WM_HSCROLL, MAKEWPARAM((short)nPos, nSBCode), (LPARAM)m_hWnd);
00186 }

Generated on Tue Dec 13 14:47:04 2005 for guliverkli by  doxygen 1.4.5