DlgSmooth.cpp
上传用户:panpan8800
上传日期:2013-06-29
资源大小:274k
文件大小:8k
源码类别:

图形图像处理

开发平台:

Visual C++

  1. // DlgSmooth.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ImageProcessing.h"
  5. #include "DlgSmooth.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CDlgSmooth dialog
  13. CDlgSmooth::CDlgSmooth(CWnd* pParent /*=NULL*/)
  14. : CDialog(CDlgSmooth::IDD, pParent)
  15. {
  16. //{{AFX_DATA_INIT(CDlgSmooth)
  17. m_nTemType = 0;
  18. m_nSmthTemCenX = 0;
  19. m_nSmthTemCenY = 0;
  20. m_dbSmthTemCoef = 0.0;
  21. m_nSmthTemHeight = 0;
  22. m_nSmthTemWidth = 0;
  23. //}}AFX_DATA_INIT
  24. }
  25. void CDlgSmooth::DoDataExchange(CDataExchange* pDX)
  26. {
  27. CDialog::DoDataExchange(pDX);
  28. //{{AFX_DATA_MAP(CDlgSmooth)
  29. DDX_Text(pDX, IDC_EDIT_SELFTEM_CEN_X, m_nSmthTemCenX);
  30. DDX_Text(pDX, IDC_EDIT_SELFTEM_CEN_Y, m_nSmthTemCenY);
  31. DDX_Text(pDX, IDC_EDIT_SELFTEM_COEF, m_dbSmthTemCoef);
  32. DDX_Text(pDX, IDC_EDIT_SELFTEM_HEIGHT, m_nSmthTemHeight);
  33. DDV_MinMaxInt(pDX, m_nSmthTemHeight, 2, 5);
  34. DDX_Text(pDX, IDC_EDIT_SELFTEM_WIDTH, m_nSmthTemWidth);
  35. DDV_MinMaxInt(pDX, m_nSmthTemWidth, 2, 5);
  36. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL0  , m_pdbTemp[0 ]);
  37. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL1  , m_pdbTemp[1 ]);
  38. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL2  , m_pdbTemp[2 ]);
  39. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL3  , m_pdbTemp[3 ]);
  40. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL4  , m_pdbTemp[4 ]);
  41. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL5  , m_pdbTemp[5 ]);
  42. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL6  , m_pdbTemp[6 ]);
  43. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL7  , m_pdbTemp[7 ]);
  44. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL8  , m_pdbTemp[8 ]);
  45. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL9  , m_pdbTemp[9 ]);
  46. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL10 , m_pdbTemp[10]);
  47. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL11 , m_pdbTemp[11]);
  48. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL12 , m_pdbTemp[12]);
  49. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL13 , m_pdbTemp[13]);
  50. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL14 , m_pdbTemp[14]);
  51. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL15 , m_pdbTemp[15]);
  52. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL16 , m_pdbTemp[16]);
  53. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL17 , m_pdbTemp[17]);
  54. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL18 , m_pdbTemp[18]);
  55. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL19 , m_pdbTemp[19]);
  56. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL20 , m_pdbTemp[20]);
  57. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL22 , m_pdbTemp[22]);
  58. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL23 , m_pdbTemp[23]);
  59. DDX_Text(pDX, IDC_EDIT_SELFTEM_EL24 , m_pdbTemp[24]);
  60. //}}AFX_DATA_MAP
  61. }
  62. BEGIN_MESSAGE_MAP(CDlgSmooth, CDialog)
  63. //{{AFX_MSG_MAP(CDlgSmooth)
  64. ON_BN_CLICKED(IDC_RADIO_AVERTEM, OnRadioAvertem)
  65. ON_BN_CLICKED(IDC_RADIO_GUASSTEM, OnRadioGuasstem)
  66. ON_BN_CLICKED(IDC_RADIO_SELFTEM, OnRadioSelftem)
  67. ON_EN_KILLFOCUS(IDC_EDIT_SELFTEM_HEIGHT, OnKillfocusEditSelftemHeight)
  68. ON_EN_KILLFOCUS(IDC_EDIT_SELFTEM_WIDTH, OnKillfocusEditSelftemWidth)
  69. ON_EN_CHANGE(IDC_EDIT_SELFTEM_WIDTH, OnChangeEditSelftemWidth)
  70. //}}AFX_MSG_MAP
  71. END_MESSAGE_MAP()
  72. /////////////////////////////////////////////////////////////////////////////
  73. // CDlgSmooth message handlers
  74. void CDlgSmooth::OnRadioAvertem() 
  75. {
  76. // 设置3×3平均模板参数
  77. m_nTemType = 0;
  78. m_nSmthTemHeight = 3;
  79. m_nSmthTemWidth  = 3;
  80. m_nSmthTemCenX   = 1;
  81. m_nSmthTemCenY   = 1;
  82. m_dbSmthTemCoef  = (double)1.0/9.0;
  83. // 设置3×3平均模板元素
  84. m_pdbTemp[0] = 1.0;
  85. m_pdbTemp[1] = 1.0;
  86. m_pdbTemp[2] = 1.0;
  87. m_pdbTemp[3] = 0.0;
  88. m_pdbTemp[4] = 0.0;
  89. m_pdbTemp[5] = 1.0;
  90. m_pdbTemp[6] = 1.0;
  91. m_pdbTemp[7] = 1.0;
  92. m_pdbTemp[8] = 0.0;
  93. m_pdbTemp[9] = 0.0;
  94. m_pdbTemp[10] = 1.0;
  95. m_pdbTemp[11] = 1.0;
  96. m_pdbTemp[12] = 1.0;
  97. m_pdbTemp[13] = 0.0;
  98. m_pdbTemp[14] = 0.0;
  99. m_pdbTemp[15] = 0.0;
  100. m_pdbTemp[16] = 0.0;
  101. m_pdbTemp[17] = 0.0;
  102. m_pdbTemp[18] = 0.0;
  103. m_pdbTemp[19] = 0.0;
  104. m_pdbTemp[20] = 0.0;
  105. m_pdbTemp[21] = 0.0;
  106. m_pdbTemp[22] = 0.0;
  107. m_pdbTemp[23] = 0.0;
  108. m_pdbTemp[24] = 0.0;
  109. // 更新文本框状态
  110. //UpdateEdit();
  111. // 更新
  112. UpdateData(FALSE);
  113. }
  114. void CDlgSmooth::OnRadioGuasstem() 
  115. {
  116. // 3×3高斯模板
  117. m_nTemType = 1;
  118. m_nSmthTemHeight = 3;
  119. m_nSmthTemWidth  = 3;
  120. m_nSmthTemCenX   = 1;
  121. m_nSmthTemCenY   = 1;
  122. m_dbSmthTemCoef  = (double)(1.0/16.0);
  123. // 设置模板元素
  124. m_pdbTemp[0] = 1.0;
  125. m_pdbTemp[1] = 2.0;
  126. m_pdbTemp[2] = 1.0;
  127. m_pdbTemp[3] = 0.0;
  128. m_pdbTemp[4] = 0.0;
  129. m_pdbTemp[5] = 2.0;
  130. m_pdbTemp[6] = 4.0;
  131. m_pdbTemp[7] = 2.0;
  132. m_pdbTemp[8] = 0.0;
  133. m_pdbTemp[9] = 0.0;
  134. m_pdbTemp[10] = 1.0;
  135. m_pdbTemp[11] = 2.0;
  136. m_pdbTemp[12] = 1.0;
  137. m_pdbTemp[13] = 0.0;
  138. m_pdbTemp[14] = 0.0;
  139. m_pdbTemp[15] = 0.0;
  140. m_pdbTemp[16] = 0.0;
  141. m_pdbTemp[17] = 0.0;
  142. m_pdbTemp[18] = 0.0;
  143. m_pdbTemp[19] = 0.0;
  144. m_pdbTemp[20] = 0.0;
  145. m_pdbTemp[21] = 0.0;
  146. m_pdbTemp[22] = 0.0;
  147. m_pdbTemp[23] = 0.0;
  148. m_pdbTemp[24] = 0.0;
  149. // 更新文本框状态
  150. UpdateEdit();
  151. // 更新
  152. UpdateData(FALSE);
  153. }
  154. void CDlgSmooth::OnRadioSelftem() 
  155. {
  156. // TODO: Add your control notification handler code here
  157. // 自定义模板
  158. m_nTemType = 2;
  159. // 更新文本框状态
  160. UpdateEdit();
  161. }
  162. void CDlgSmooth::OnKillfocusEditSelftemHeight() 
  163. {
  164. // TODO: Add your control notification handler code here
  165. // 更新
  166. UpdateData(TRUE);
  167. // 更新文本框状态
  168. UpdateEdit();
  169. }
  170. void CDlgSmooth::OnKillfocusEditSelftemWidth() 
  171. {
  172. // TODO: Add your control notification handler code here
  173. // 更新
  174. UpdateData(TRUE);
  175. // 更新文本框状态
  176. UpdateEdit();
  177. }
  178. void CDlgSmooth::OnOK() 
  179. {
  180. // 获取用户设置(更新)
  181. UpdateData(TRUE);
  182. // 判断设置是否有效
  183. if ((m_nSmthTemCenX  < 0) || (m_nSmthTemCenX > m_nSmthTemWidth - 1) ||
  184. (m_nSmthTemCenY < 0) || (m_nSmthTemCenY > m_nSmthTemHeight - 1))
  185. {
  186. // 提示用户参数设置错误
  187. MessageBox("中心元素参数设置错误!", "系统提示" , 
  188. MB_ICONINFORMATION | MB_OK);
  189. // 返回
  190. return;
  191. }
  192. // 更新模板元素数组(将有效元素放置在数组的前面)
  193. for (int i = 0; i < m_nSmthTemHeight; i++)
  194. {
  195. for (int j = 0; j < m_nSmthTemWidth; j++)
  196. {
  197. m_pdbTemp[i * m_nSmthTemWidth + j] = m_pdbTemp[i * 5 + j];
  198. }
  199. }
  200. // 更新
  201. UpdateData(FALSE);
  202. // 退出
  203. CDialog::OnOK();
  204. }
  205. void CDlgSmooth::OnChangeEditSelftemWidth() 
  206. {
  207. // TODO: If this is a RICHEDIT control, the control will not
  208. // send this notification unless you override the CDialog::OnInitDialog()
  209. // function and call CRichEditCtrl().SetEventMask()
  210. // with the ENM_CHANGE flag ORed into the mask.
  211. // TODO: Add your control notification handler code here
  212. }
  213. void CDlgSmooth::UpdateEdit()
  214. {
  215. BOOL bEnable;
  216. // 循环变量
  217. int i;
  218. int j;
  219. // 判断是不是自定义模板
  220. if (m_nTemType  == 2) 
  221. {
  222. bEnable = TRUE;
  223. }
  224. else
  225. {
  226. bEnable = FALSE;
  227. }
  228. // 设置文本框可用状态
  229. (CEdit *) GetDlgItem(IDC_EDIT_SELFTEM_HEIGHT)->EnableWindow(bEnable);
  230. (CEdit *) GetDlgItem(IDC_EDIT_SELFTEM_WIDTH)->EnableWindow(bEnable);
  231. (CEdit *) GetDlgItem(IDC_EDIT_SELFTEM_COEF)->EnableWindow(bEnable);
  232. (CEdit *) GetDlgItem(IDC_EDIT_SELFTEM_CEN_X)->EnableWindow(bEnable);
  233. (CEdit *) GetDlgItem(IDC_EDIT_SELFTEM_CEN_Y)->EnableWindow(bEnable);
  234. // IDC_EDIT_SELFTEM_EL0等ID其实是一个整数,它的数值定义在Resource.h中定义。
  235. // 设置模板元素文本框bEnable状态
  236. for (i = IDC_EDIT_SELFTEM_EL0; i <= IDC_EDIT_SELFTEM_EL24; i++)
  237. {
  238. // 设置文本框不可编辑
  239. (CEdit *) GetDlgItem(i)->EnableWindow(bEnable);
  240. }
  241. // 显示应该可见的模板元素文本框
  242. for (i = 0; i < m_nSmthTemHeight; i++)
  243. {
  244. for (j = 0; j < m_nSmthTemWidth; j++)
  245. {
  246. // 设置文本框可见
  247. (CEdit *) GetDlgItem(IDC_EDIT_SELFTEM_EL0 + i*5 + j)->ShowWindow(SW_SHOW);
  248. }
  249. }
  250. // 隐藏应该不可见的模板元素文本框(前m_nSmthTemHeight行的后几列)
  251. for (i = 0; i < m_nSmthTemHeight; i++)
  252. {
  253. for (j = m_nSmthTemWidth; j < 5; j++)
  254. {
  255. // 设置不可见
  256. (CEdit *) GetDlgItem(IDC_EDIT_SELFTEM_EL0 + i*5 + j)->ShowWindow(SW_HIDE);
  257. }
  258. }
  259. // 隐藏应该不可见的模板元素文本框(后几行)
  260. for (i = m_nSmthTemHeight; i < 5; i++)
  261. {
  262. for (j = 0; j < 5; j++)
  263. {
  264. // 设置不可见
  265. (CEdit *) GetDlgItem(IDC_EDIT_SELFTEM_EL0 + i*5 + j)->ShowWindow(SW_HIDE);
  266. }
  267. }
  268. }