DlgImageScissor.cpp
上传用户:gzboli
上传日期:2013-04-10
资源大小:471k
文件大小:7k
源码类别:

图片显示

开发平台:

Visual C++

  1. // DlgImageScissor.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "QuickImage.h"
  5. #include "DlgImageScissor.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CDlgImageScissor dialog
  13. CDlgImageScissor::CDlgImageScissor(HDIB hDIB, CWnd* pParent /*=NULL*/)
  14. : CDialog(CDlgImageScissor::IDD, pParent), m_hDIB(hDIB)
  15. {
  16. //{{AFX_DATA_INIT(CDlgImageScissor)
  17. m_iZoom = 1;
  18. m_ibrX = 0;
  19. m_ibrY = 0;
  20. m_itlX = 0;
  21. m_itlY = 0;
  22. //}}AFX_DATA_INIT
  23. m_iCorner = 0;
  24. // m_pPalette =new CPalette;
  25. }
  26. void CDlgImageScissor::DoDataExchange(CDataExchange* pDX)
  27. {
  28. CDialog::DoDataExchange(pDX);
  29. //{{AFX_DATA_MAP(CDlgImageScissor)
  30. DDX_Text(pDX, IDC_EDIT_ZOOM, m_iZoom);
  31. DDV_MinMaxUInt(pDX, m_iZoom, 1, 10);
  32. DDX_Text(pDX, IDC_EDIT_BR_X, m_ibrX);
  33. DDX_Text(pDX, IDC_EDIT_BR_Y, m_ibrY);
  34. DDX_Text(pDX, IDC_EDIT_TL_X, m_itlX);
  35. DDX_Text(pDX, IDC_EDIT_TL_Y, m_itlY);
  36. //}}AFX_DATA_MAP
  37. }
  38. BEGIN_MESSAGE_MAP(CDlgImageScissor, CDialog)
  39. //{{AFX_MSG_MAP(CDlgImageScissor)
  40. ON_WM_CTLCOLOR()
  41. ON_WM_PAINT()
  42. ON_EN_KILLFOCUS(IDC_EDIT_ZOOM, OnKillfocusEditZoom)
  43. ON_WM_MOUSEMOVE()
  44. ON_WM_LBUTTONUP()
  45. ON_WM_LBUTTONDOWN()
  46. //}}AFX_MSG_MAP
  47. ON_CONTROL_RANGE(EN_SETFOCUS, IDC_EDIT_TL_X, IDC_EDIT_BR_Y, OnEditsSetFocus)
  48. ON_CONTROL_RANGE(EN_KILLFOCUS, IDC_EDIT_TL_X, IDC_EDIT_BR_Y, OnEditsKillFocus)
  49. ON_CONTROL_RANGE(WM_LBUTTONDOWN, IDC_EDIT_TL_X, IDC_EDIT_BR_Y, OnEditsMouseUp)
  50. END_MESSAGE_MAP()
  51. /////////////////////////////////////////////////////////////////////////////
  52. // CDlgImageScissor message handlers
  53. HBRUSH CDlgImageScissor::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
  54. {
  55. HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  56. CWnd *pEdit = GetDlgItem(IDC_EDIT_ZOOM);
  57. ASSERT_VALID(pEdit);
  58. if(pEdit->m_hWnd == pWnd->m_hWnd)
  59. {
  60. CBrush b;
  61. COLORREF color = (COLORREF)::GetSysColor(COLOR_BTNFACE);
  62. b.CreateSolidBrush(color);
  63. CRect rc;
  64. pWnd->GetClientRect(&rc);
  65. pDC->FillRect(&rc,&b);
  66. pDC->SetBkColor(color);
  67. }
  68. if(nCtlColor == CTLCOLOR_STATIC || nCtlColor == CTLCOLOR_EDIT)
  69. pDC->SetTextColor(RGB(0,96,249));
  70. // TODO: Return a different brush if the default is not desired
  71. return hbr;
  72. }
  73. BOOL CDlgImageScissor::OnInitDialog() 
  74. {
  75. CDialog::OnInitDialog();
  76. m_btOK.SubclassDlgItem(IDOK, this);
  77. m_btOK.SetIcon(IDI_OKAC, IDI_OKUN);
  78. m_btOK.SetActiveBgColor(RGB(220,220,220));
  79. m_btOK.SetActiveFgColor(RGB(255,0,0));
  80. m_btOK.SetBtnCursor(IDC_GREEN);
  81. m_btCancel.SubclassDlgItem(IDCANCEL, this);
  82. m_btCancel.SetIcon(IDI_CANCELAC, IDI_CANCELUN);
  83. m_btCancel.SetActiveBgColor(RGB(220,220,220));
  84. m_btCancel.SetActiveFgColor(RGB(255,0,0));
  85. m_btCancel.SetBtnCursor(IDC_GREEN);
  86. // HDIB hDIB = GetDocument()->GetHDIB();
  87. if (m_hDIB != NULL)
  88. {
  89. LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);
  90. m_iWidth = (int) ::DIBWidth(lpDIB);         // Size of DIB - x
  91. m_iHeight = (int) abs(::DIBHeight(lpDIB));        // Size of DIB - y
  92. ::GlobalUnlock((HGLOBAL) m_hDIB);
  93. if(m_itlX < 0)
  94. {
  95. m_itlX = 0;
  96. }
  97. if(m_itlY < 0)
  98. {
  99. m_itlY = 0;
  100. }
  101. if(m_ibrX > m_iWidth)
  102. {
  103. m_ibrX = m_iWidth;
  104. }
  105. if(m_ibrY > m_iHeight)
  106. {
  107. m_ibrY = m_iHeight;
  108. }
  109. if(m_iHeight > 0)
  110. {
  111. int iTemp = m_itlY;
  112. m_itlY = m_iHeight - m_ibrY;
  113. m_ibrY = m_iHeight - iTemp;
  114. }
  115. else
  116. {
  117. m_iHeight = -m_iHeight;
  118. }
  119. UpdateData(FALSE);
  120. }
  121. return TRUE;  // return TRUE unless you set the focus to a control
  122.               // EXCEPTION: OCX Property Pages should return FALSE
  123. }
  124. void CDlgImageScissor::DrawAll()
  125. {
  126. CWnd *pWnd = GetDlgItem(IDC_PIC_LARGE);
  127. ASSERT_VALID(pWnd);
  128. CDC *pDC = pWnd->GetDC();
  129. ASSERT_VALID(pDC);
  130. CRect rcDC;
  131. CPoint ptDCCent;
  132. pWnd->GetClientRect(&rcDC);
  133. ptDCCent = rcDC.CenterPoint();
  134. if(m_itlX < 0)m_itlX = 0;
  135. if(m_itlY < 0)m_itlY = 0;
  136. if(m_ibrX > m_iWidth)m_ibrX = m_iWidth;
  137. if(m_ibrY > m_iHeight)m_ibrY = m_iHeight;
  138. double dx = rcDC.Width() / double(m_ibrX - m_itlX)/2.0;
  139. double dy =rcDC.Height() / double(m_ibrY - m_itlY)/2.0;
  140. if(dx > dy)
  141. {
  142. rcDC.left = ptDCCent.x - long((m_ibrX - m_itlX)*dy);
  143. rcDC.right = ptDCCent.x + long((m_ibrX - m_itlX)*dy);
  144. }
  145. else
  146. {
  147. rcDC.top = ptDCCent.y - long((m_ibrY - m_itlY)*dx);
  148. rcDC.bottom = ptDCCent.y + long((m_ibrY - m_itlY)*dx);
  149. }
  150. /* CRect rcDC;
  151. GetClientRect(&rcDC);
  152. rcDC.left += 100;
  153. rcDC.right -= 100;
  154. rcDC.top += 50;
  155. rcDC.bottom -= 200;
  156. */ pDC->Rectangle(rcDC);
  157. ::PaintDIB(pDC->GetSafeHdc(), rcDC, m_hDIB,
  158. CRect(m_itlX,m_itlY,m_ibrX,m_ibrY),NULL);
  159. }
  160. void CDlgImageScissor::DrawCorner()
  161. {
  162. CWnd *pWnd = GetDlgItem(IDC_PIC_SMALL);
  163. ASSERT_VALID(pWnd);
  164. CDC *pDC = pWnd->GetDC();
  165. ASSERT_VALID(pDC);
  166. CRect rcDC, rcDIB;
  167. pWnd->GetClientRect(&rcDC);
  168. CPoint pt = rcDC.CenterPoint();
  169. int x, y;
  170. if(m_iCorner == 0)
  171. {
  172. x = m_itlX;
  173. y = m_ibrY;
  174. }
  175. else if(m_iCorner == 1)
  176. {
  177. x = m_ibrX;
  178. y = m_itlY;
  179. }
  180. int iHalf = int(rcDC.Width() / (double)m_iZoom / 2.0);
  181. rcDIB.left = x - iHalf;
  182. rcDIB.right = x + iHalf;
  183. iHalf = int(rcDC.Height() / (double)m_iZoom / 2.0);
  184. rcDIB.top = y - iHalf;
  185. rcDIB.bottom = y + iHalf;
  186. ::PaintDIB(pDC->GetSafeHdc(), rcDC, m_hDIB, rcDIB, NULL);
  187. pDC->MoveTo(0, pt.y);
  188. pDC->LineTo(rcDC.Width(), pt.y);
  189. pDC->MoveTo(pt.x, 0);
  190. pDC->LineTo(pt.x, rcDC.Height());
  191. }
  192. void CDlgImageScissor::OnPaint() 
  193. {
  194. CPaintDC dc(this); // device context for painting
  195. DrawAll();
  196. DrawCorner();
  197. // Do not call CDialog::OnPaint() for painting messages
  198. }
  199. void CDlgImageScissor::OnEditsSetFocus(UINT uID)
  200. {
  201. CEdit *pEdit = (CEdit*)GetDlgItem(uID);
  202. ASSERT_VALID(pEdit);
  203. pEdit->SetSel(0,-1);
  204. switch(uID)
  205. {
  206. case IDC_EDIT_TL_X:
  207. case IDC_EDIT_TL_Y:
  208. m_iCorner = 0;
  209. DrawCorner();
  210. break;
  211. case IDC_EDIT_BR_X:
  212. case IDC_EDIT_BR_Y:
  213. m_iCorner = 1;
  214. DrawCorner();
  215. break;
  216. default:
  217. ASSERT(FALSE);
  218. }
  219. }
  220. void CDlgImageScissor::OnEditsKillFocus(UINT uID)
  221. {
  222. CWnd *pWnd = GetDlgItem(IDC_PIC_LARGE);
  223. ASSERT_VALID(pWnd);
  224. CRect rcPic;
  225. pWnd ->GetClientRect(&rcPic);
  226. CDC *pDC = pWnd->GetDC();
  227. ASSERT_VALID(pDC);
  228. CBrush b;
  229. b.CreateSolidBrush((COLORREF)::GetSysColor(COLOR_BTNFACE));
  230. pDC->FillRect(rcPic, &b);
  231. UpdateData();
  232. DrawAll();
  233. DrawCorner();
  234. }
  235. void CDlgImageScissor::OnEditsMouseUp(UINT uID)
  236. {
  237. CEdit *pEdit = (CEdit*)GetDlgItem(uID);
  238. ASSERT_VALID(pEdit);
  239. pEdit->SetSel(0,-1);
  240. }
  241. void CDlgImageScissor::OnKillfocusEditZoom() 
  242. {
  243. UpdateData();
  244. DrawCorner();
  245. }
  246. void CDlgImageScissor::OnLButtonDown(UINT nFlags, CPoint point) 
  247. {
  248. CDialog::OnLButtonDown(nFlags, point);
  249. }
  250. void CDlgImageScissor::OnMouseMove(UINT nFlags, CPoint point) 
  251. {
  252. CDialog::OnMouseMove(nFlags, point);
  253. }
  254. void CDlgImageScissor::OnLButtonUp(UINT nFlags, CPoint point) 
  255. {
  256. CDialog::OnLButtonUp(nFlags, point);
  257. }