DlgIntensity.cpp
上传用户:xayxjz
上传日期:2022-08-07
资源大小:2188k
文件大小:12k
源码类别:

图形图象

开发平台:

Visual C++

  1. // DlgIntensity.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "CBIR.h"
  5. #include "DlgIntensity.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CDlgIntensity dialog
  13. CDlgIntensity::CDlgIntensity(CWnd* pParent /*=NULL*/)
  14. : CDialog(CDlgIntensity::IDD, pParent)
  15. {
  16. //{{AFX_DATA_INIT(CDlgIntensity)
  17. m_iLowGray = 0;
  18. m_iUpGray = 255;
  19. m_nCurrentGray = 0;
  20. m_nCurrentPiexsNum = 0;
  21. m_nHistogramType = 0;
  22. //}}AFX_DATA_INIT
  23. m_pnHistogram = NULL;
  24. m_nPenType = 0; //黑色画笔
  25. m_bIsInRect = FALSE;
  26. m_nGrayValue = 0;
  27. m_bRMouseDown = FALSE;
  28. m_bIsGray256 = FALSE;
  29. }
  30. void CDlgIntensity::DoDataExchange(CDataExchange* pDX)
  31. {
  32. CDialog::DoDataExchange(pDX);
  33. //{{AFX_DATA_MAP(CDlgIntensity)
  34. DDX_Control(pDX, IDC_IDC_EDIT_UPSPIN, m_ctrlUpGraySpin);
  35. DDX_Control(pDX, IDC_IDC_EDIT_LOWSPIN, m_ctrlLowGraySpin);
  36. DDX_Control(pDX, IDC_IDC_EDIT_CURSPIN, m_ctrlCurrentGraySpin);
  37. DDX_Text(pDX, IDC_EDIT_LowGray, m_iLowGray);
  38. DDV_MinMaxInt(pDX, m_iLowGray, 0, 255);
  39. DDX_Text(pDX, IDC_EDIT_UpGray, m_iUpGray);
  40. DDV_MinMaxInt(pDX, m_iUpGray, 0, 255);
  41. DDX_Text(pDX, IDC_EDIT_CUR_GRAY, m_nCurrentGray);
  42. DDV_MinMaxUInt(pDX, m_nCurrentGray, 0, 255);
  43. DDX_Text(pDX, IDC_EDIT_CUR_NUMBER, m_nCurrentPiexsNum);
  44. DDX_Radio(pDX, IDC_HISTOGRAMTYPE, m_nHistogramType);
  45. //}}AFX_DATA_MAP
  46. }
  47. BEGIN_MESSAGE_MAP(CDlgIntensity, CDialog)
  48. //{{AFX_MSG_MAP(CDlgIntensity)
  49. ON_WM_PAINT()
  50. ON_WM_MOUSEMOVE()
  51. ON_WM_LBUTTONDOWN()
  52. ON_WM_LBUTTONUP()
  53. ON_EN_CHANGE(IDC_EDIT_LowGray, OnChangeEDITLowGray)
  54. ON_EN_CHANGE(IDC_EDIT_UpGray, OnChangeEDITUpGray)
  55. ON_EN_CHANGE(IDC_EDIT_CUR_GRAY, OnChangeEditCurGray)
  56. ON_BN_CLICKED(IDC_HISTOGRAMTYPE, OnHistogramtype)
  57. ON_BN_CLICKED(IDC_GREEN_RADIO, OnGreenRadio)
  58. ON_BN_CLICKED(IDC_RED_RADIO, OnRedRadio)
  59. ON_BN_CLICKED(IDC_BLUE_RADIO, OnBlueRadio)
  60. ON_WM_RBUTTONDOWN()
  61. //}}AFX_MSG_MAP
  62. END_MESSAGE_MAP()
  63. /////////////////////////////////////////////////////////////////////////////
  64. // CDlgIntensity message handlers
  65. BOOL CDlgIntensity::OnInitDialog() 
  66. {
  67. // 调用默认OnInitDialog函数
  68. CDialog::OnInitDialog();
  69. // 获取绘制直方图的标签
  70. CWnd* pWnd = GetDlgItem(IDC_COORD);
  71. // 计算接受鼠标事件的有效区域
  72. pWnd->GetClientRect(m_MouseRect);
  73. pWnd->ClientToScreen(&m_MouseRect);
  74. CRect rect;
  75. GetClientRect(rect);
  76. ClientToScreen(&rect);
  77. m_MouseRect.top -= rect.top;
  78. m_MouseRect.left -= rect.left;
  79. // 设置接受鼠标事件的有效区域
  80. m_MouseRect.top += 25;
  81. m_MouseRect.left += 10;
  82. m_MouseRect.bottom = m_MouseRect.top + 255;
  83. m_MouseRect.right = m_MouseRect.left + 256;
  84. // 初始化拖动状态
  85. m_iIsDraging = 0;
  86. //设置微调控件的范围和伙伴编辑框
  87. m_ctrlCurrentGraySpin.SetRange(0,255);
  88. m_ctrlCurrentGraySpin.SetBuddy( (CWnd* )GetDlgItem(IDC_EDIT_CUR_GRAY));
  89. m_ctrlLowGraySpin.SetRange(0,255);
  90. m_ctrlLowGraySpin.SetBuddy( (CWnd* )GetDlgItem(IDC_EDIT_LowGray));
  91. m_ctrlUpGraySpin.SetRange(0,255);
  92. m_ctrlUpGraySpin.SetBuddy( (CWnd* )GetDlgItem(IDC_EDIT_UpGray));
  93. if ( m_bIsGray256 )
  94. {
  95. GrayTypeRedRadio().EnableWindow(FALSE);
  96. GrayTypeGreenRadio().EnableWindow(FALSE);
  97. GrayTypeBlueRadio().EnableWindow(FALSE);
  98. }
  99. m_pHistTemp = m_pnHistogram;
  100. // 返回TRUE
  101. return TRUE;
  102. }
  103. void CDlgIntensity::OnLButtonDown(UINT nFlags, CPoint point) 
  104. {
  105. // 当用户单击鼠标左键开始拖动
  106. // 判断是否在接受鼠标事件的有效区域中
  107. if(m_MouseRect.PtInRect(point))
  108. {
  109. m_bRMouseDown = FALSE;
  110. if( !m_bRMouseDown )
  111. {
  112. ::SetCursor(::LoadCursor(NULL,IDC_CROSS));
  113. m_nGrayValue = point.x-10;
  114. m_nCurrentGray = m_nGrayValue - 10;
  115. m_nCurrentPiexsNum = m_pHistTemp[m_nCurrentGray];
  116. UpdateData(FALSE);
  117. InvalidateRect(m_MouseRect, TRUE);
  118. }
  119. if (point.x == (m_MouseRect.left + m_iLowGray))
  120. {
  121. // 设置拖动状态1,拖动下限
  122. m_iIsDraging = 1;
  123. // 更改光标
  124. ::SetCursor(::LoadCursor(NULL, IDC_SIZEWE));
  125. }
  126. else if (point.x == (m_MouseRect.left + m_iUpGray))
  127. {
  128. // 设置拖动状态为2,拖动上限
  129. m_iIsDraging = 2;
  130. // 更改光标
  131. ::SetCursor(::LoadCursor(NULL, IDC_SIZEWE));
  132. }
  133. }
  134. // 默认单击鼠标左键处理事件
  135. CDialog::OnLButtonDown(nFlags, point);
  136. }
  137. void CDlgIntensity::OnLButtonUp()
  138. {
  139. }
  140. void CDlgIntensity::OnMouseMove(UINT nFlags, CPoint point) 
  141. {
  142. // 判断是否在接受鼠标事件的有效区域中
  143. if(m_MouseRect.PtInRect(point))
  144. {
  145. if( !m_bRMouseDown )
  146. {
  147. ::SetCursor(::LoadCursor(NULL,IDC_CROSS));
  148. m_nGrayValue = point.x-10;
  149. m_nCurrentGray = m_nGrayValue - 10;
  150. m_nCurrentPiexsNum = m_pHistTemp[m_nCurrentGray];
  151. UpdateData(FALSE);
  152. InvalidateRect(m_MouseRect, TRUE);
  153. }
  154. // 判断是否正在拖动
  155. if (m_iIsDraging != 0)
  156. {
  157. // 判断正在拖动上限还是下限
  158. if (m_iIsDraging == 1)
  159. {
  160. // 判断是否下限<上限
  161. if (point.x - m_MouseRect.left < m_iUpGray)
  162. {
  163. // 更改下限
  164. m_iLowGray = point.x - m_MouseRect.left;
  165. }
  166. else
  167. {
  168. // 下限拖过上限,设置为上限-1
  169. m_iLowGray = m_iUpGray - 1;
  170. // 重设鼠标位置
  171. point.x = m_MouseRect.left + m_iUpGray - 1;
  172. }
  173. }
  174. else
  175. {
  176. // 正在拖动上限
  177. // 判断是否上限>下限
  178. if (point.x - m_MouseRect.left > m_iLowGray)
  179. {
  180. // 更改下限
  181. m_iUpGray = point.x - m_MouseRect.left;
  182. }
  183. else
  184. {
  185. // 下限拖过上限,设置为下限+1
  186. m_iUpGray = m_iLowGray + 1;
  187. // 重设鼠标位置
  188. point.x = m_MouseRect.left + m_iLowGray + 1;
  189. }
  190. }
  191. // 更改光标
  192. ::SetCursor(::LoadCursor(NULL, IDC_SIZEWE));
  193. // 更新
  194. UpdateData(FALSE);
  195. // 重绘直方图
  196. InvalidateRect(m_MouseRect, TRUE);
  197. }
  198. else if (point.x == (m_MouseRect.left + m_iLowGray) || point.x == (m_MouseRect.left + m_iUpGray))
  199. {
  200. // 更改光标
  201. ::SetCursor(::LoadCursor(NULL, IDC_SIZEWE));
  202. }
  203. }
  204. // 默认鼠标移动处理事件
  205. CDialog::OnMouseMove(nFlags, point);
  206. }
  207. void CDlgIntensity::OnLButtonUp(UINT nFlags, CPoint point) 
  208. {
  209. // 当用户释放鼠标左键停止拖动
  210. if (m_iIsDraging != 0)
  211. {
  212. // 重置拖动状态
  213. m_iIsDraging = 0;
  214. }
  215. // 默认释放鼠标左键处理事件
  216. CDialog::OnLButtonUp(nFlags, point);
  217. }
  218. void CDlgIntensity::OnPaint() 
  219. {
  220. // 字符串
  221. CString str;
  222. // 循环变量
  223. LONG i;
  224. // 最大计数
  225. LONG lMaxCount = 0;
  226. // 设备上下文
  227. CPaintDC dc(this);
  228. // 获取绘制坐标的文本框
  229. CWnd* pWnd = GetDlgItem(IDC_COORD);
  230. // 指针
  231. CDC* pDC = pWnd->GetDC();
  232. pWnd->Invalidate();
  233. pWnd->UpdateWindow();
  234. pDC->Rectangle(0,0,330,300);
  235. // 创建画笔对象
  236. CPen* pPenRed = new CPen;
  237. // 红色画笔
  238. pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0));
  239. // 创建画笔对象
  240. CPen* pPenBlue = new CPen;
  241. // 蓝色画笔
  242. pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0, 255));
  243. // 创建画笔对象
  244. CPen* pPenGreen = new CPen;
  245. // 绿色画笔
  246. pPenGreen->CreatePen(PS_SOLID,1,RGB(0,255,0));
  247. // 创建画笔对象
  248. CPen* pPenBlack = new CPen;
  249. // 黑色画笔
  250. pPenBlack->CreatePen(PS_SOLID,1,RGB(0,0,0));
  251. // 创建画笔对象
  252. CPen* pPenGray = new CPen;
  253. // 灰色画笔
  254. pPenGray->CreatePen(PS_SOLID,1,RGB(80,80,80));
  255. // 创建画笔对象
  256. CPen* pPenBrow = new CPen;
  257. // 褐色画笔
  258. pPenBrow->CreatePen(PS_DOT,1,RGB(128,64,64));
  259. // 创建画笔对象
  260. CPen* pPenYellow = new CPen;
  261. // 黄色画笔
  262. pPenYellow->CreatePen(PS_DOT,1,RGB(255,128,64));
  263. // 选中当前黑色画笔,并保存以前的画笔
  264. CGdiObject* pOldPen = pDC->SelectObject(pPenBlack);
  265. // 绘制坐标轴
  266. pDC->MoveTo(10,6);
  267. // 垂直轴
  268. pDC->LineTo(10,276);
  269. // 水平轴
  270. pDC->LineTo(320,276);
  271. // 写X轴刻度值
  272. str.Format("0");
  273. pDC->TextOut(10, 279, str);
  274. str.Format("50");
  275. pDC->TextOut(60, 279, str);
  276. str.Format("100");
  277. pDC->TextOut(110, 279, str);
  278. str.Format("150");
  279. pDC->TextOut(160, 279, str);
  280. str.Format("200");
  281. pDC->TextOut(210, 279, str);
  282. str.Format("255");
  283. pDC->TextOut(265, 279, str);
  284. // 绘制X轴刻度
  285. for (i = 0; i < 256; i += 5)
  286. {
  287. if ((i & 1) == 0)
  288. {
  289. // 10的倍数
  290. pDC->MoveTo(i + 10, 276);
  291. pDC->LineTo(i + 10, 280);
  292. }
  293. else
  294. {
  295. // 10的倍数
  296. pDC->MoveTo(i + 10, 276);
  297. pDC->LineTo(i + 10, 278);
  298. }
  299. }
  300. // 绘制X轴箭头
  301. pDC->MoveTo(315,271);
  302. pDC->LineTo(320,276);
  303. pDC->LineTo(315,281);
  304. // 绘制X轴箭头
  305. pDC->MoveTo(10,6);
  306. pDC->LineTo(5,11);
  307. pDC->MoveTo(10,6);
  308. pDC->LineTo(15,11);
  309. // 计算最大计数值
  310. for (i = m_iLowGray; i <= m_iUpGray; i ++)
  311. {
  312. if ( m_pHistTemp[ i ] > lMaxCount )
  313. {
  314. // 更新最大值
  315. lMaxCount = m_pHistTemp[ i ];
  316. }
  317. }
  318. // 输出最大计数值
  319. pDC->MoveTo(10, 21);
  320. pDC->LineTo(14, 21);
  321. str.Format("%d", lMaxCount);
  322. pDC->TextOut(11, 22, str);
  323. // 更改成褐色画笔
  324. pDC->SelectObject(pPenBrow);
  325. // 绘制窗口上下限
  326. pDC->MoveTo(m_iLowGray + 10, 21);
  327. pDC->LineTo(m_iLowGray + 10, 276);
  328. pDC->MoveTo(m_iUpGray + 10, 21);
  329. pDC->LineTo(m_iUpGray + 10, 276);
  330. // 更改成蓝色画笔
  331. switch(m_nPenType)
  332. {
  333. case 0:
  334. // 更改成黑色画笔
  335. pDC->SelectObject(pPenGray);
  336. break;
  337. case 1:
  338. // 更改成红色画笔
  339. pDC->SelectObject(pPenRed);
  340. break;
  341. case 2:
  342. // 更改成绿色画笔
  343. pDC->SelectObject(pPenGreen);
  344. break;
  345. case 3:
  346. // 更改成蓝色画笔
  347. pDC->SelectObject(pPenBlue);
  348. break;
  349. }
  350. // 判断是否有计数
  351. if (lMaxCount > 0)
  352. {
  353. // 绘制直方图
  354. for (i = m_iLowGray; i <= m_iUpGray; i ++)
  355. {
  356. pDC->MoveTo(i + 10, 276);
  357. pDC->LineTo(i + 10, 277 - (int) (m_pHistTemp[ i ] * 256 / lMaxCount));
  358. }
  359. }
  360. // 更改成黄色画笔
  361. pDC->SelectObject(pPenYellow);
  362. // 绘制当前鼠标位置线
  363. pDC->MoveTo(m_nGrayValue, 21);
  364. pDC->LineTo(m_nGrayValue, 276);
  365. // 恢复以前的画笔
  366. pDC->SelectObject(pOldPen);
  367. // 删除新的画笔
  368. delete pPenRed;
  369. delete pPenBlue;
  370. delete pPenGreen;
  371. delete pPenBlack;
  372. delete pPenBrow;
  373. delete pPenYellow;
  374. delete pPenGray;
  375. }
  376. void CDlgIntensity::OnOK() 
  377. {
  378. // 判断是否下限超过上限
  379. if (m_iLowGray > m_iUpGray)
  380. {
  381. // 互换
  382. int iTemp = m_iLowGray;
  383. m_iLowGray = m_iUpGray;
  384. m_iUpGray = iTemp;
  385. }
  386. // 返回
  387. CDialog::OnOK();
  388. }
  389. void CDlgIntensity::OnChangeEDITLowGray() 
  390. {
  391. // 保存变动(控件中数值保存到成员变量中)
  392. UpdateData(TRUE);
  393. // 判断是否下限超过上限
  394. if (m_iLowGray > m_iUpGray)
  395. {
  396. // 互换
  397. int iTemp = m_iLowGray;
  398. m_iLowGray = m_iUpGray;
  399. m_iUpGray = iTemp;
  400. // 更新(成员变量中数值保存到控件中)
  401. UpdateData(FALSE);
  402. }
  403. // 重绘直方图
  404. InvalidateRect(m_MouseRect, TRUE);
  405. }
  406. void CDlgIntensity::OnChangeEDITUpGray() 
  407. {
  408. // 保存变动(控件中数值保存到成员变量中)
  409. UpdateData(TRUE);
  410. // 判断是否下限超过上限
  411. if (m_iLowGray > m_iUpGray)
  412. {
  413. // 互换
  414. int iTemp = m_iLowGray;
  415. m_iLowGray = m_iUpGray;
  416. m_iUpGray = iTemp;
  417. // 更新
  418. UpdateData(FALSE);
  419. }
  420. // 重绘直方图
  421. InvalidateRect(m_MouseRect, TRUE);
  422. }
  423. void CDlgIntensity::OnChangeEditCurGray() 
  424. {
  425. // 保存变动(控件中数值保存到成员变量中)
  426. UpdateData(TRUE);
  427. m_nCurrentPiexsNum = m_pHistTemp[m_nCurrentGray];
  428. // 更新(成员变量中数值保存到控件中)
  429. UpdateData(FALSE);
  430. // 重绘直方图
  431. InvalidateRect(m_MouseRect, TRUE);
  432. }
  433. void CDlgIntensity::OnHistogramtype() 
  434. {
  435. m_pHistTemp = m_pnHistogram;
  436. // 保存变动(控件中数值保存到成员变量中)
  437. UpdateData(TRUE);
  438. m_nCurrentPiexsNum = m_pHistTemp[m_nCurrentGray];
  439. UpdateData(FALSE);
  440. //更改黑色画笔
  441. m_nPenType = 0;
  442. // 重绘直方图
  443. InvalidateRect(m_MouseRect, TRUE);
  444. }
  445. void CDlgIntensity::OnGreenRadio() 
  446. {
  447. m_pHistTemp = &m_pnHistogram[512];
  448. UpdateData(TRUE);
  449. m_nCurrentPiexsNum = m_pHistTemp[m_nCurrentGray];
  450. UpdateData(FALSE);
  451. //更改绿色画笔
  452. m_nPenType = 2;
  453. // 重绘直方图
  454. InvalidateRect(m_MouseRect, TRUE);
  455. }
  456. void CDlgIntensity::OnRedRadio() 
  457. {
  458. m_pHistTemp = &m_pnHistogram[256];
  459. UpdateData(TRUE);
  460. m_nCurrentPiexsNum = m_pHistTemp[m_nCurrentGray];
  461. UpdateData(FALSE);
  462. //更改红色画笔
  463. m_nPenType = 1;
  464. // 重绘直方图
  465. InvalidateRect(m_MouseRect, TRUE);
  466. }
  467. void CDlgIntensity::OnBlueRadio() 
  468. {
  469. m_pHistTemp = &m_pnHistogram[768];
  470. UpdateData(TRUE);
  471. m_nCurrentPiexsNum = m_pHistTemp[m_nCurrentGray];
  472. UpdateData(FALSE);
  473. //更改蓝色画笔
  474. m_nPenType = 3;
  475. // 重绘直方图
  476. InvalidateRect(m_MouseRect, TRUE);
  477. }
  478. void CDlgIntensity::OnRButtonDown(UINT nFlags, CPoint point)
  479. {
  480. // 判断是否在接受鼠标事件的有效区域中
  481. if(m_MouseRect.PtInRect(point))
  482. {
  483. m_bRMouseDown = TRUE;
  484. }
  485. CDialog::OnRButtonDown(nFlags, point);
  486. }