DlgIntensity.cpp
上传用户:sgmlaoniu
上传日期:2013-03-16
资源大小:403k
文件大小:5k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // DlgIntensity.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "PlateLocate.h"
  5. #include "DlgIntensity.h"
  6. #include "DIBAPI.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CDlgIntensity dialog
  14. CDlgIntensity::CDlgIntensity(CWnd* pParent /*=NULL*/)
  15. : CDialog(CDlgIntensity::IDD, pParent)
  16. {
  17. //{{AFX_DATA_INIT(CDlgIntensity)
  18. // NOTE: the ClassWizard will add member initialization here
  19. m_iLowGray = 0;
  20. m_iUpGray = 0;
  21. //}}AFX_DATA_INIT
  22. }
  23. void CDlgIntensity::DoDataExchange(CDataExchange* pDX)
  24. {
  25. CDialog::DoDataExchange(pDX);
  26. //{{AFX_DATA_MAP(CDlgIntensity)
  27. // NOTE: the ClassWizard will add DDX and DDV calls here
  28. //}}AFX_DATA_MAP
  29. }
  30. BEGIN_MESSAGE_MAP(CDlgIntensity, CDialog)
  31. //{{AFX_MSG_MAP(CDlgIntensity)
  32. ON_WM_PAINT()
  33. ON_BN_CLICKED(ID_BUTTON_OK, OnOK)
  34. //}}AFX_MSG_MAP
  35. END_MESSAGE_MAP()
  36. /////////////////////////////////////////////////////////////////////////////
  37. // CDlgIntensity message handlers
  38. void CDlgIntensity::OnOK() 
  39. {
  40.     CDialog::OnOK();
  41. }
  42. BOOL CDlgIntensity::OnInitDialog() 
  43. {
  44. // 指向源图像象素的指针
  45. unsigned char * lpSrc;
  46. // 循环变量
  47. LONG i;
  48. LONG j;
  49. // 调用默认OnInitDialog函数
  50. CDialog::OnInitDialog();
  51. // 获取绘制直方图的标签
  52. CWnd* pWnd = GetDlgItem(IDC_GREY);
  53. // 计算接受鼠标事件的有效区域
  54. pWnd->GetClientRect(m_MouseRect);
  55. pWnd->ClientToScreen(&m_MouseRect);
  56. CRect rect;
  57. GetClientRect(rect);
  58. ClientToScreen(&rect);
  59. m_MouseRect.top -= rect.top;
  60. m_MouseRect.left -= rect.left;
  61. // 设置接受鼠标事件的有效区域
  62. m_MouseRect.top += 25;
  63. m_MouseRect.left += 10;
  64. m_MouseRect.bottom = m_MouseRect.top + 255;
  65. m_MouseRect.right = m_MouseRect.left + 256;
  66. // 重置计数为0
  67. for (i = 0; i < 256; i ++)
  68. {
  69. // 清零
  70. m_lCount[i] = 0;
  71. }
  72. // 图像每行的字节数
  73. LONG lLineBytes;
  74. // 计算图像每行的字节数
  75. lLineBytes = WIDTHBYTES(m_lWidth * 8);
  76. // 计算各个灰度值的计数
  77. for (i = 0; i < m_lHeight; i ++)
  78. {
  79. for (j = 0; j < m_lWidth; j ++)
  80. {
  81. lpSrc = (unsigned char *)m_lpDIBBits + lLineBytes * i + j;
  82. // 计数加1
  83. m_lCount[*(lpSrc)]++;
  84. }
  85. }
  86. // 初始化拖动状态
  87. m_iIsDraging = 0;
  88. // 返回TRUE
  89. return TRUE;
  90. }
  91. void CDlgIntensity::OnPaint() 
  92. {
  93. // 字符串
  94. CString str;
  95. // 循环变量
  96. LONG i;
  97. // 最大计数
  98. LONG lMaxCount = 0;
  99. // 设备上下文
  100. CPaintDC dc(this);
  101. // 获取绘制坐标的文本框
  102. CWnd* pWnd = GetDlgItem(IDC_GREY);
  103. // 指针
  104. CDC* pDC = pWnd->GetDC();
  105. pWnd->Invalidate();
  106. pWnd->UpdateWindow();
  107. pDC->Rectangle(0,0,330,300);
  108. // 创建画笔对象
  109. CPen* pPenRed = new CPen;
  110. // 红色画笔
  111. pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0));
  112. // 创建画笔对象
  113. CPen* pPenBlue = new CPen;
  114. // 蓝色画笔
  115. pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0, 255));
  116. // 创建画笔对象
  117. CPen* pPenGreen = new CPen;
  118. // 绿色画笔
  119. pPenGreen->CreatePen(PS_DOT,1,RGB(0,255,0));
  120. // 选中当前红色画笔,并保存以前的画笔
  121. CGdiObject* pOldPen = pDC->SelectObject(pPenRed);
  122. // 绘制坐标轴
  123. pDC->MoveTo(10,10);
  124. // 垂直轴
  125. pDC->LineTo(10,280);
  126. // 水平轴
  127. pDC->LineTo(320,280);
  128. // 写X轴刻度值
  129. str.Format("0");
  130. pDC->TextOut(10, 283, str);
  131. str.Format("50");
  132. pDC->TextOut(60, 283, str);
  133. str.Format("100");
  134. pDC->TextOut(110, 283, str);
  135. str.Format("150");
  136. pDC->TextOut(160, 283, str);
  137. str.Format("200");
  138. pDC->TextOut(210, 283, str);
  139. str.Format("255");
  140. pDC->TextOut(265, 283, str);
  141. // 绘制X轴刻度
  142. for (i = 0; i < 256; i += 5)
  143. {
  144. if ((i & 1) == 0)
  145. {
  146. // 10的倍数
  147. pDC->MoveTo(i + 10, 280);
  148. pDC->LineTo(i + 10, 284);
  149. }
  150. else
  151. {
  152. // 10的倍数
  153. pDC->MoveTo(i + 10, 280);
  154. pDC->LineTo(i + 10, 282);
  155. }
  156. }
  157. // 绘制X轴箭头
  158. pDC->MoveTo(315,275);
  159. pDC->LineTo(320,280);
  160. pDC->LineTo(315,285);
  161. // 绘制X轴箭头
  162. pDC->MoveTo(10,10);
  163. pDC->LineTo(5,15);
  164. pDC->MoveTo(10,10);
  165. pDC->LineTo(15,15);
  166. // 计算最大计数值
  167. for (i = m_iLowGray; i <= m_iUpGray; i ++)
  168. {
  169. // 判断是否大于当前最大值
  170. if (m_lCount[i] > lMaxCount)
  171. {
  172. // 更新最大值
  173. lMaxCount = m_lCount[i];
  174. }
  175. }
  176. // 输出最大计数值
  177. pDC->MoveTo(10, 25);
  178. pDC->LineTo(14, 25);
  179. str.Format("%d", lMaxCount);
  180. pDC->TextOut(11, 26, str);
  181. // 更改成绿色画笔
  182. pDC->SelectObject(pPenGreen);
  183. // 绘制窗口上下限
  184. pDC->MoveTo(m_iLowGray + 10, 25);
  185. pDC->LineTo(m_iLowGray + 10, 280);
  186. pDC->MoveTo(m_iUpGray + 10, 25);
  187. pDC->LineTo(m_iUpGray + 10, 280);
  188. // 更改成蓝色画笔
  189. pDC->SelectObject(pPenBlue);
  190. // 判断是否有计数
  191. if (lMaxCount > 0)
  192. {
  193. // 绘制直方图
  194. for (i = m_iLowGray; i <= m_iUpGray; i ++)
  195. {
  196. pDC->MoveTo(i + 10, 280);
  197. pDC->LineTo(i + 10, 281 - (int) (m_lCount[i] * 256 / lMaxCount));
  198. }
  199. }
  200. // 恢复以前的画笔
  201. pDC->SelectObject(pOldPen);
  202. // 删除新的画笔
  203. delete pPenRed;
  204. delete pPenBlue;
  205. delete pPenGreen;
  206. }