HistogramDlg.cpp
上传用户:wjfckcom
上传日期:2014-06-28
资源大小:1989k
文件大小:3k
源码类别:

OpenCV

开发平台:

Visual C++

  1. // HistogramDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "dd.h"
  5. #include "HistogramDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CHistogramDlg dialog
  13. CHistogramDlg::CHistogramDlg(CWnd* pParent /*=NULL*/)
  14. : CDialog(CHistogramDlg::IDD, pParent)
  15. {
  16. //{{AFX_DATA_INIT(CHistogramDlg)
  17. // NOTE: the ClassWizard will add member initialization here
  18. //}}AFX_DATA_INIT
  19. }
  20. void CHistogramDlg::DoDataExchange(CDataExchange* pDX)
  21. {
  22. CDialog::DoDataExchange(pDX);
  23. //{{AFX_DATA_MAP(CHistogramDlg)
  24. // NOTE: the ClassWizard will add DDX and DDV calls here
  25. //}}AFX_DATA_MAP
  26. }
  27. BEGIN_MESSAGE_MAP(CHistogramDlg, CDialog)
  28. //{{AFX_MSG_MAP(CHistogramDlg)
  29. ON_WM_PAINT()
  30. //}}AFX_MSG_MAP
  31. END_MESSAGE_MAP()
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CHistogramDlg message handlers
  34. void CHistogramDlg::OnPaint() 
  35. {
  36. // 字符串
  37. CString str;
  38. // 循环变量
  39. int i;
  40. // 最大计数
  41. float fMaxIntensity = 0;
  42. // 设备上下文
  43. CPaintDC dc(this);
  44. // 获取绘制坐标的静态框
  45. CWnd* pWnd = GetDlgItem(IDC_COORD);
  46. // 指针
  47. CDC* pDC = pWnd->GetDC();
  48. pWnd->Invalidate();
  49. pWnd->UpdateWindow();
  50. pDC->Rectangle(0,0,330,300);
  51. // 创建画笔对象
  52. CPen* pPenRed = new CPen;
  53. // 红色画笔
  54. pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0));
  55. // 创建画笔对象
  56. CPen* pPenBlue = new CPen;
  57. // 蓝色画笔
  58. pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0, 255));
  59. // 选中当前红色画笔,并保存以前的画笔
  60. CGdiObject* pOldPen = pDC->SelectObject(pPenRed);
  61. // 绘制坐标轴
  62. pDC->MoveTo(10,10);
  63. // 垂直轴
  64. pDC->LineTo(10,280);
  65. // 水平轴
  66. pDC->LineTo(320,280);
  67. // 绘制X轴箭头
  68. pDC->MoveTo(315,275);
  69. pDC->LineTo(320,280);
  70. pDC->LineTo(315,285);
  71. // 绘制Y轴箭头
  72. pDC->MoveTo(10,10);
  73. pDC->LineTo(5,15);
  74. pDC->MoveTo(10,10);
  75. pDC->LineTo(15,15);
  76. // 写x轴刻度值
  77. str.Format("0");
  78. pDC->TextOut(10, 280, str);
  79. str.Format("50");
  80. pDC->TextOut(60, 280, str);
  81. str.Format("100");
  82. pDC->TextOut(110, 280, str);
  83. str.Format("150");
  84. pDC->TextOut(160, 280, str);
  85. str.Format("200");
  86. pDC->TextOut(210, 280, str);
  87. str.Format("255");
  88. pDC->TextOut(265, 280, str);
  89. // 绘制X轴刻度
  90. for (i = 0; i < 256; i += 5)
  91. {
  92. if ((i & 1) == 0)
  93. {
  94. // 10的倍数
  95. pDC->MoveTo(i + 10, 280);
  96. pDC->LineTo(i + 10, 284);
  97. }
  98. else
  99. {
  100. // 10的倍数
  101. pDC->MoveTo(i + 10, 280);
  102. pDC->LineTo(i + 10, 282);
  103. }
  104. }
  105. // 计算最大计数值
  106. for (i = 0; i < 256; i ++)
  107. {
  108. // 判断是否大于当前最大值
  109. if (m_fIntensity[i] > fMaxIntensity)
  110. {
  111. // 更新最大值
  112. fMaxIntensity = m_fIntensity[i];
  113. }
  114. }
  115. // 输出最大计数值
  116.   pDC->MoveTo(10, 25);
  117. pDC->LineTo(14, 25);
  118. str.Format("%f", fMaxIntensity);
  119. pDC->TextOut(11, 26, str); 
  120. // 更改成蓝色画笔
  121. pDC->SelectObject(pPenBlue);
  122. pDC->MoveTo(10, 143);
  123. // 判断是否有计数
  124. if (fMaxIntensity > 0)
  125. {
  126. // 绘制直方图
  127. for (i = 0; i < 256; i ++)
  128. {
  129. pDC->LineTo(i + 10, 144 - (int) (m_fIntensity[i] * 128 / fMaxIntensity));
  130. }
  131. }
  132. // 恢复以前的画笔
  133. pDC->SelectObject(pOldPen);
  134. // 删除新的画笔
  135. delete pPenRed;
  136. delete pPenBlue;
  137. // Do not call CDialog::OnPaint() for painting messages
  138. }