HISTOG~1.CPP
上传用户:lianyisd
上传日期:2019-11-03
资源大小:5188k
文件大小:4k
源码类别:

midi

开发平台:

Visual C++

  1. // HistogramCtrl.cpp : implementation file
  2. //
  3. // stdafx.cpp : source file that includes just the standard includes
  4. // CPanel.pch will be the pre-compiled header
  5. // stdafx.obj will contain the pre-compiled type information
  6. #include "stdafx.h"
  7. #include "HistogramCtrl.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CHistogramCtrl
  15. CHistogramCtrl::CHistogramCtrl()
  16. {
  17. m_nPos      = 0;
  18. m_nLower    = 0;
  19. m_nUpper    = 100;
  20. }
  21. CHistogramCtrl::~CHistogramCtrl()
  22. {
  23. }
  24. BEGIN_MESSAGE_MAP(CHistogramCtrl, CWnd)
  25. //{{AFX_MSG_MAP(CHistogramCtrl)
  26. ON_WM_PAINT()
  27. //}}AFX_MSG_MAP
  28. END_MESSAGE_MAP()
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CSpikeCtrl message handlers
  31. BOOL CHistogramCtrl::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
  32. {
  33. // TODO: Add your specialized code here and/or call the base class
  34. static CString className = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);
  35. return  CWnd::CreateEx(WS_EX_CLIENTEDGE | WS_EX_STATICEDGE, 
  36. className, NULL, dwStyle, 
  37. rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top,
  38. pParentWnd->GetSafeHwnd(), (HMENU) nID);
  39. }
  40. void CHistogramCtrl::SetRange(UINT nLower, UINT nUpper)
  41. {
  42. ASSERT(nLower >= 0 && nLower < 0xffff);
  43. ASSERT(nUpper > nLower && nUpper < 0xffff);
  44. m_nLower = nLower;
  45. m_nUpper = nUpper;
  46. InvalidateCtrl();
  47. }
  48. void CHistogramCtrl::InvalidateCtrl()
  49. {
  50. // Small optimization that just invalidates the client area
  51. // (The borders don't usually need updating)
  52. CClientDC dc(this);
  53. CRect rcClient;
  54. GetClientRect(rcClient);
  55. if (m_MemDC.GetSafeHdc() == NULL)
  56. {
  57. m_MemDC.CreateCompatibleDC(&dc);
  58. m_Bitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
  59. m_MemDC.SelectObject(m_Bitmap);
  60. // draw scale
  61. m_MemDC.SetBkColor(RGB(0,0,0));
  62. CBrush bkBrush(HS_HORIZONTAL,RGB(0,128,0));
  63. m_MemDC.FillRect(rcClient,&bkBrush);
  64. }
  65. InvalidateRect(rcClient);
  66. }
  67. UINT CHistogramCtrl::SetPos(UINT nPos)
  68. {
  69. if (nPos > m_nUpper)
  70. nPos = m_nUpper;
  71. if (nPos < m_nLower)
  72. nPos = m_nLower;
  73. UINT nOld = m_nPos;
  74. m_nPos = nPos;
  75. DrawSpike();
  76. Invalidate();
  77. return nOld;
  78. }
  79. void CHistogramCtrl::OnPaint() 
  80. {
  81. CPaintDC dc(this); // device context for painting
  82. // TODO: Add your message handler code here
  83. // Do not call CWnd::OnPaint() for painting messages
  84. // draw scale
  85. CRect rcClient;
  86. GetClientRect(rcClient);
  87. // draw scale
  88. if (m_MemDC.GetSafeHdc() != NULL)
  89. {
  90. dc.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &m_MemDC, 0, 0, SRCCOPY);
  91. }
  92. }
  93. void CHistogramCtrl::DrawSpike()
  94. {
  95. // CClientDC dc(this);
  96. UINT  nRange = m_nUpper - m_nLower;
  97. CRect rcClient;
  98. GetClientRect(rcClient);
  99. if (m_MemDC.GetSafeHdc() != NULL)
  100. {
  101. m_MemDC.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &m_MemDC, 4, 0, SRCCOPY);
  102. CRect rcTop(rcClient.right - 4, 0, rcClient.right - 2, rcClient.bottom);
  103. rcTop.top  = (long) (((float) (m_nPos - m_nLower) / nRange) * rcClient.Height());
  104. rcTop.top  = rcClient.bottom - rcTop.top;
  105. // draw scale
  106. CRect rcRight = rcClient;
  107. rcRight.left = rcRight.right - 4;
  108. m_MemDC.SetBkColor(RGB(0,0,0));
  109. CBrush bkBrush(HS_HORIZONTAL,RGB(0,128,0));  
  110. m_MemDC.FillRect(rcRight,&bkBrush);
  111. // draw current spike
  112. CBrush brush(RGB(0,255,0));
  113. m_MemDC.FillRect(rcTop, &brush);
  114. }
  115. }