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

图形图像处理

开发平台:

Visual C++

  1. // DlgEhnLinTrans.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ImageProcessing.h"
  5. #include "DlgEhnLinTrans.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CDlgEhnLinTrans dialog
  13. CDlgEhnLinTrans::CDlgEhnLinTrans(CWnd* pParent /*=NULL*/)
  14. : CDialog(CDlgEhnLinTrans::IDD, pParent)
  15. {
  16. //{{AFX_DATA_INIT(CDlgEhnLinTrans)
  17. m_nX1 = 0;
  18. m_nX2 = 0;
  19. m_nY1 = 0;
  20. m_nY2 = 0;
  21. //}}AFX_DATA_INIT
  22. }
  23. void CDlgEhnLinTrans::DoDataExchange(CDataExchange* pDX)
  24. {
  25. CDialog::DoDataExchange(pDX);
  26. //{{AFX_DATA_MAP(CDlgEhnLinTrans)
  27. DDX_Text(pDX, IDC_EDIT_LINTRANS_X1, m_nX1);
  28. DDV_MinMaxInt(pDX, m_nX1, 0, 255);
  29. DDX_Text(pDX, IDC_EDIT_LINTRANS_X2, m_nX2);
  30. DDV_MinMaxInt(pDX, m_nX2, 0, 255);
  31. DDX_Text(pDX, IDC_EDIT_LINTRANS_Y1, m_nY1);
  32. DDV_MinMaxInt(pDX, m_nY1, 0, 255);
  33. DDX_Text(pDX, IDC_EDIT_LINTRANS_Y2, m_nY2);
  34. DDV_MinMaxInt(pDX, m_nY2, 0, 255);
  35. //}}AFX_DATA_MAP
  36. }
  37. BEGIN_MESSAGE_MAP(CDlgEhnLinTrans, CDialog)
  38. //{{AFX_MSG_MAP(CDlgEhnLinTrans)
  39. ON_WM_LBUTTONDOWN()
  40. ON_WM_MOUSEMOVE()
  41. ON_WM_LBUTTONUP()
  42. ON_WM_PAINT()
  43. ON_EN_KILLFOCUS(IDC_EDIT_LINTRANS_X1, OnKillfocusEditLintransX1)
  44. ON_EN_KILLFOCUS(IDC_EDIT_LINTRANS_X2, OnKillfocusEditLintransX2)
  45. ON_EN_KILLFOCUS(IDC_EDIT_LINTRANS_Y1, OnKillfocusEditLintransY1)
  46. ON_EN_KILLFOCUS(IDC_EDIT_LINTRANS_Y2, OnKillfocusEditLintransY2)
  47. //}}AFX_MSG_MAP
  48. END_MESSAGE_MAP()
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CDlgEhnLinTrans message handlers
  51. BOOL CDlgEhnLinTrans::OnInitDialog() 
  52. {
  53. // 调用默认OnInitDialog函数
  54. CDialog::OnInitDialog();
  55. // 获取绘制直方图的标签
  56. CWnd* pWnd = GetDlgItem(IDC_LINTRANS_SHOWCOR);
  57. // 计算接受鼠标事件的有效区域
  58. pWnd->GetClientRect(m_rectMouse);
  59. pWnd->ClientToScreen(&m_rectMouse);
  60. CRect rect;
  61. GetClientRect(rect);
  62. ClientToScreen(&rect);
  63. m_rectMouse.top -= rect.top;
  64. m_rectMouse.left -= rect.left;
  65. // 设置接受鼠标事件的有效区域
  66. m_rectMouse.top += 25;
  67. m_rectMouse.left += 10;
  68. m_rectMouse.bottom = m_rectMouse.top + 255;
  69. m_rectMouse.right = m_rectMouse.left + 256;
  70. // 初始化拖动状态
  71. m_nIsDraging = 0;
  72. return TRUE;  // return TRUE unless you set the focus to a control
  73.               // EXCEPTION: OCX Property Pages should return FALSE
  74. }
  75. void CDlgEhnLinTrans::OnLButtonDown(UINT nFlags, CPoint point) 
  76. {
  77. // 当用户单击鼠标左键开始拖动
  78. if(m_rectMouse.PtInRect(point))
  79. {
  80. CRect rectTemp;
  81. // 计算点1临近区域
  82. rectTemp.left = m_rectMouse.left + m_nX1 - 2;
  83. rectTemp.right = m_rectMouse.left + m_nX1 + 2;
  84. rectTemp.top = 255 + m_rectMouse.top - m_nY1 - 2;
  85. rectTemp.bottom = 255 + m_rectMouse.top - m_nY1 + 2;
  86. // 判断用户是不是想拖动点1
  87. if (rectTemp.PtInRect(point))
  88. {
  89. // 设置拖动状态1,拖动点1
  90. m_nIsDraging = 1;
  91. // 更改光标
  92. ::SetCursor(::LoadCursor(NULL, IDC_SIZEALL));
  93. }
  94. else
  95. {
  96. // 计算点2临近区域
  97. rectTemp.left = m_rectMouse.left + m_nX2 - 2;
  98. rectTemp.right = m_rectMouse.left + m_nX2 + 2;
  99. rectTemp.top = 255 + m_rectMouse.top - m_nY2 - 2;
  100. rectTemp.bottom = 255 + m_rectMouse.top - m_nY2 + 2;
  101. // 判断用户是不是想拖动点2
  102. if (rectTemp.PtInRect(point))
  103. {
  104. // 设置拖动状态为2,拖动点2
  105. m_nIsDraging = 2;
  106. // 更改光标
  107. ::SetCursor(::LoadCursor(NULL, IDC_SIZEALL));
  108. }
  109. }
  110. }
  111. // 默认单击鼠标左键处理事件
  112. CDialog::OnLButtonDown(nFlags, point);
  113. }
  114. void CDlgEhnLinTrans::OnLButtonUp(UINT nFlags, CPoint point) 
  115. {
  116. // 当用户释放鼠标左键停止拖动
  117. if (m_nIsDraging != 0)
  118. {
  119. // 重置拖动状态
  120. m_nIsDraging = 0;
  121. }
  122. // 默认释放鼠标左键处理事件
  123. CDialog::OnLButtonUp(nFlags, point);
  124. }
  125. void CDlgEhnLinTrans::OnMouseMove(UINT nFlags, CPoint point) 
  126. {
  127. // 判断当前光标是否在绘制区域
  128. if(m_rectMouse.PtInRect(point))
  129. {
  130. // 判断是否正在拖动
  131. if (m_nIsDraging != 0)
  132. {
  133. // 判断正在拖动点1还是点2
  134. if (m_nIsDraging == 1)
  135. {
  136. // 判断是否下限<上限
  137. if (point.x - m_rectMouse.left < m_nX2)
  138. {
  139. // 更改下限
  140. m_nX1 =  point.x - m_rectMouse.left;
  141. }
  142. else
  143. {
  144. // 下限拖过上限,设置为上限-1
  145. m_nX1 = m_nX2 - 1;
  146. // 重设鼠标位置
  147. point.x = m_rectMouse.left + m_nX2 - 1;
  148. }
  149. // 更改Y坐标
  150. m_nY1 = 255 + m_rectMouse.top - point.y;
  151. }
  152. else
  153. {
  154. // 正在拖动点2
  155. // 判断是否上限>下限
  156. if (point.x - m_rectMouse.left > m_nX1)
  157. {
  158. // 更改下限
  159. m_nX2 = point.x - m_rectMouse.left;
  160. }
  161. else
  162. {
  163. // 下限拖过上限,设置为下限+1
  164. m_nX2 = m_nX1 + 1;
  165. // 重设鼠标位置
  166. point.x = m_rectMouse.left + m_nX1 + 1;
  167. }
  168. // 更改Y坐标
  169. m_nY2 = 255 + m_rectMouse.top - point.y;
  170. }
  171. // 更改光标
  172. ::SetCursor(::LoadCursor(NULL, IDC_SIZEALL));
  173. // 更新
  174. UpdateData(FALSE);
  175. // 重绘
  176. InvalidateRect(m_rectMouse, TRUE);
  177. }
  178. else
  179. {
  180. CRect rectTemp1;
  181. CRect rectTemp2;
  182. // 计算点1临近区域
  183. rectTemp1.left = m_rectMouse.left + m_nX1 - 2;
  184. rectTemp1.right = m_rectMouse.left + m_nX1 + 2;
  185. rectTemp1.top = 255 + m_rectMouse.top - m_nY1 - 2;
  186. rectTemp1.bottom = 255 + m_rectMouse.top - m_nY1 + 2;
  187. // 计算点2临近区域
  188. rectTemp2.left = m_rectMouse.left + m_nX2 - 2;
  189. rectTemp2.right = m_rectMouse.left + m_nX2 + 2;
  190. rectTemp2.top = 255 + m_rectMouse.top - m_nY2 - 2;
  191. rectTemp2.bottom = 255 + m_rectMouse.top - m_nY2 + 2;
  192. // 判断用户在点1或点2旁边
  193. if ((rectTemp1.PtInRect(point)) || (rectTemp2.PtInRect(point)))
  194. {
  195. // 更改光标
  196. ::SetCursor(::LoadCursor(NULL, IDC_SIZEALL));
  197. }
  198. }
  199. }
  200. // 默认鼠标移动处理事件
  201. CDialog::OnMouseMove(nFlags, point);
  202. }
  203. void CDlgEhnLinTrans::OnPaint() 
  204. {
  205. // 设备上下文
  206. CPaintDC dc(this); // device context for painting
  207. // 字符串
  208. CString str;
  209. // 获取绘制坐标的文本框
  210. CWnd* pWnd = GetDlgItem(IDC_LINTRANS_SHOWCOR);
  211. // 指针
  212. CDC* pDC = pWnd->GetDC();
  213. pWnd->Invalidate();
  214. pWnd->UpdateWindow();
  215. pDC->Rectangle(0,0,330,300);
  216. // 创建画笔对象
  217. CPen* pPenRed = new CPen;
  218. // 红色画笔
  219. pPenRed->CreatePen(PS_SOLID, 2, RGB(255,0,0));
  220. // 创建画笔对象
  221. CPen* pPenBlue = new CPen;
  222. // 蓝色画笔
  223. pPenBlue->CreatePen(PS_SOLID, 1, RGB(0,0, 255));
  224. // 选中当前红色画笔,并保存以前的画笔
  225. CGdiObject* pOldPen = pDC->SelectObject(pPenRed);
  226. // 绘制坐标轴
  227. pDC->MoveTo(10,10);
  228. // 垂直轴
  229. pDC->LineTo(10,280);
  230. // 水平轴
  231. pDC->LineTo(320,280);
  232. // 写坐标
  233. str.Format("0");
  234. pDC->TextOut(10, 281, str);
  235. str.Format("255");
  236. pDC->TextOut(265, 281, str);
  237. pDC->TextOut(11, 25, str);
  238. // 绘制X轴箭头
  239. pDC->LineTo(315,275);
  240. pDC->MoveTo(320,280);
  241. pDC->LineTo(315,285);
  242. // 绘制X轴箭头
  243. pDC->MoveTo(10,10);
  244. pDC->LineTo(5,15);
  245. pDC->MoveTo(10,10);
  246. pDC->LineTo(15,15);
  247. // 更改成蓝色画笔
  248. pDC->SelectObject(pPenBlue);
  249. // 绘制坐标值
  250. str.Format("(%d, %d)", m_nX1, m_nY1);
  251. pDC->TextOut(m_nX1 + 10, 281 - m_nY1, str);
  252. str.Format("(%d, %d)", m_nX2, m_nY2);
  253. pDC->TextOut(m_nX2 + 10, 281 - m_nY2, str);
  254. // 绘制用户指定的变换直线
  255. pDC->MoveTo(10, 280);
  256. pDC->LineTo(m_nX1 + 10, 280 - m_nY1);
  257. pDC->LineTo(m_nX2 + 10, 280 - m_nY2);
  258. pDC->LineTo(265, 25);
  259. // 绘制点边缘的小矩形
  260. CBrush  brush;
  261. brush.CreateSolidBrush(RGB(0,255,0));
  262. // 选中刷子
  263. CGdiObject* pOldBrush = pDC->SelectObject(&brush);
  264. // 绘制小矩形
  265. pDC->Rectangle(m_nX1 + 10 - 2, 280 - m_nY1 - 2, m_nX1 + 12, 280 - m_nY1 + 2);
  266. pDC->Rectangle(m_nX2 + 10 - 2, 280 - m_nY2 - 2, m_nX2 + 12, 280 - m_nY2 + 2);
  267. // 恢复以前的画笔
  268. pDC->SelectObject(pOldPen);
  269. // 绘制边缘
  270. pDC->MoveTo(10,25);
  271. pDC->LineTo(265,25);
  272. pDC->LineTo(265,280);
  273. // 删除新的画笔
  274. delete pPenRed;
  275. delete pPenBlue;
  276. // Do not call CDialog::OnPaint() for painting messages
  277. }
  278. void CDlgEhnLinTrans::OnKillfocusEditLintransX1() 
  279. {
  280. // 更新
  281. UpdateData(TRUE);
  282. // 判断是否下限超过上限
  283. if (m_nX1 > m_nX2)
  284. {
  285. // 互换
  286. int nTemp = m_nX1;
  287. m_nX1 = m_nX2;
  288. m_nX2 = nTemp;
  289. nTemp = m_nY1;
  290. m_nY1 = m_nY2;
  291. m_nY2 = nTemp;
  292. // 更新
  293. UpdateData(FALSE);
  294. }
  295. // 重绘
  296. InvalidateRect(m_rectMouse, TRUE);
  297. }
  298. void CDlgEhnLinTrans::OnKillfocusEditLintransX2() 
  299. {
  300. // 更新
  301. UpdateData(TRUE);
  302. // 判断是否下限超过上限
  303. if (m_nX1 > m_nX2)
  304. {
  305. // 互换
  306. int nTemp = m_nX1;
  307. m_nX1 = m_nX2;
  308. m_nX2 = nTemp;
  309. nTemp = m_nY1;
  310. m_nY1 = m_nY2;
  311. m_nY2 = nTemp;
  312. // 更新
  313. UpdateData(FALSE);
  314. }
  315. // 重绘
  316. InvalidateRect(m_rectMouse, TRUE);
  317. }
  318. void CDlgEhnLinTrans::OnKillfocusEditLintransY1() 
  319. {
  320. // 更新
  321. UpdateData(TRUE);
  322. // 重绘
  323. InvalidateRect(m_rectMouse, TRUE);
  324. }
  325. void CDlgEhnLinTrans::OnKillfocusEditLintransY2() 
  326. {
  327. // 更新
  328. UpdateData(TRUE);
  329. // 重绘
  330. InvalidateRect(m_rectMouse, TRUE);
  331. }
  332. void CDlgEhnLinTrans::OnOK() 
  333. {
  334. // 判断是否下限超过上限
  335. if (m_nX1 > m_nX2)
  336. {
  337. // 互换
  338. int nTemp = m_nX1;
  339. m_nX1 = m_nX2;
  340. m_nX2 = nTemp;
  341. nTemp = m_nY1;
  342. m_nY1 = m_nY2;
  343. m_nY2 = nTemp;
  344. // 更新
  345. UpdateData(FALSE);
  346. }
  347. // 默认处理事件
  348. CDialog::OnOK();
  349. }