VolumeCtrl.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // VolumeCtrl.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "StoneU_HC_CARDOCX.h"
  5. #include "VolumeCtrl.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CVolumeCtrl
  13. CVolumeCtrl::CVolumeCtrl() : m_brush(GetSysColor(COLOR_3DFACE)),
  14. m_LightPen(PS_SOLID,1,RGB(255,255,255)),
  15. m_ShadowPen(PS_SOLID,1,RGB(128,128,128))
  16. {
  17. }
  18. CVolumeCtrl::~CVolumeCtrl()
  19. {
  20. }
  21. BEGIN_MESSAGE_MAP(CVolumeCtrl, CSliderCtrl)
  22. //{{AFX_MSG_MAP(CVolumeCtrl)
  23. ON_WM_PAINT()
  24. ON_WM_ERASEBKGND()
  25. //}}AFX_MSG_MAP
  26. END_MESSAGE_MAP()
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CVolumeCtrl message handlers
  29. void CVolumeCtrl::OnPaint()
  30. {
  31. // 调用默认的窗口过程Default()画出控件的标准形状
  32. Default();
  33. // 抹掉除滑动块的其它东西
  34. CWindowDC dc(this);
  35. CRect rcThumb, rcClient;
  36. GetThumbRect(&rcThumb);
  37. dc.ExcludeClipRect(&rcThumb);
  38. GetClientRect(&rcClient);
  39. dc.FillRect(&rcClient, &m_brush);
  40. // 画三角型
  41. int half = rcThumb.Width() >> 1;
  42. rcClient.left += 12 + half;
  43. rcClient.right -= 12 + half;
  44. rcClient.top += 3;
  45. rcClient.bottom -= 3;
  46. DrawTriangle(&dc, &rcClient);
  47. // Do not call CSliderCtrl::OnPaint() for painting messages
  48. }
  49. void CVolumeCtrl::DrawTriangle(CDC *pDC, CRect *prcDraw)
  50. {
  51. // 笔移动左下
  52. pDC->MoveTo(prcDraw->left, prcDraw->bottom);
  53. // 选择高亮画笔,并保存原来的画笔
  54. CPen *pOldPen = pDC->SelectObject(&m_LightPen);
  55. // 画下边
  56. pDC->LineTo(prcDraw->BottomRight());
  57. // 画右边
  58. pDC->LineTo(prcDraw->right, prcDraw->top);
  59. // 选择阴影画笔
  60. pDC->SelectObject(&m_ShadowPen);
  61. // 画斜边
  62. pDC->LineTo(prcDraw->left, prcDraw->bottom);
  63. // 恢复原来的画笔
  64. pDC->SelectObject(pOldPen);
  65. }
  66. BOOL CVolumeCtrl::OnEraseBkgnd(CDC* pDC)
  67. {
  68. // 直接返回, 因为OnPaint里我们有一个FillRect操作, 可以理解为擦除背景
  69. // 没有必要擦除两次
  70. return TRUE; // CSliderCtrl::OnEraseBkgnd(pDC);
  71. }
  72. BOOL CVolumeCtrl::PreTranslateMessage(MSG* pMsg)
  73. {
  74. // TODO: Add your specialized code here and/or call the base class
  75. CRect m_SliderRect;
  76. GetWindowRect(m_SliderRect);
  77. if(pMsg->message == WM_LBUTTONDOWN)
  78. {
  79. m_MousePt.x = pMsg->pt.x;
  80. }
  81. if(pMsg->message == WM_LBUTTONUP)
  82. {
  83. if(m_MousePt.x == pMsg->pt.x)
  84. {
  85. int max, min;
  86. this->GetRange(min, max);
  87. this->SetPos( min + (m_MousePt.x-m_SliderRect.left)*(max-min)/(m_SliderRect.right - m_SliderRect.left) );
  88. Invalidate();
  89. }
  90. }
  91. return CSliderCtrl::PreTranslateMessage(pMsg);
  92. }