CutPhoto.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901
  1. // CutPhoto.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ylgl.h"
  5. #include "CutPhoto.h"
  6. #include "SetSize.h"
  7. #include "ShowCut.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CutPhoto dialog
  15. CutPhoto::CutPhoto(CWnd* pParent /*=NULL*/): CDialog(CutPhoto::IDD, pParent)
  16. {
  17. m_pImg = NULL;
  18. m_width = 0;
  19. m_height = 0;
  20. m_fscale = 1.0;
  21. m_slider1 = 0;
  22. m_fZoomScale = 0.0;
  23. }
  24. void CutPhoto::DoDataExchange(CDataExchange* pDX)
  25. {
  26. CDialog::DoDataExchange(pDX);
  27. DDX_Control(pDX, IDC_SLIDER1, m_sliderctrl);
  28. DDX_Control(pDX, IDC_COMBO1, m_combo1);
  29. DDX_Slider(pDX, IDC_SLIDER1, m_slider1);
  30. }
  31. BEGIN_MESSAGE_MAP(CutPhoto, CDialog)
  32. ON_WM_PAINT()
  33. ON_BN_CLICKED(IDC_BUTTON7, OnButton7)
  34. ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchangeCombo1)
  35. ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
  36. ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
  37. ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
  38. ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
  39. ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
  40. ON_BN_CLICKED(IDC_BUTTON6, OnButton6)
  41. ON_BN_CLICKED(IDC_BUTTON10, OnButton10)
  42. ON_BN_CLICKED(IDC_BUTTON32, OnButton32)
  43. ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER1, OnCustomdrawSlider1)
  44. ON_NOTIFY(NM_OUTOFMEMORY, IDC_SLIDER1, OnOutofmemorySlider1)
  45. ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER1, OnReleasedcaptureSlider1)
  46. ON_WM_MOUSEWHEEL()
  47. ON_WM_LBUTTONUP()
  48. ON_WM_LBUTTONDOWN()
  49. END_MESSAGE_MAP()
  50. BOOL CutPhoto::OnInitDialog()
  51. {
  52. CDialog::OnInitDialog();
  53. g_sendhead.bsql = 0;
  54. g_sendhead.code[0] = 11;
  55. g_sendhead.code[1] = 174;
  56. g_sendhead.tabcount = 2;
  57. CString filter = "id='" + m_strOrderNumber + "';";
  58. g_pMainWnd->ProcessChatMessageRequest2(filter);
  59. if (g_bSendOK == 0)
  60. {
  61. CDialog::OnCancel();
  62. return 0;
  63. }
  64. CArray<CStringArray, CStringArray>m_List1array;
  65. DataToArray(&m_List1array, &g_List1array);
  66. CenterWindow();
  67. if (m_List1array.GetSize())m_size = m_List1array.ElementAt(0).ElementAt(60);
  68. m_sliderctrl.SetRange(0, 50);
  69. m_combo1.ResetContent();
  70. namearray.RemoveAll();
  71. widtharray.RemoveAll();
  72. heightarray.RemoveAll();
  73. for (int i = 0; i < g_List1array.GetSize(); i++)
  74. {
  75. namearray.Add(g_List1array.ElementAt(i).ElementAt(0));
  76. widtharray.Add(atoi(g_List1array.ElementAt(i).ElementAt(1)));
  77. heightarray.Add(atoi(g_List1array.ElementAt(i).ElementAt(2)));
  78. CString str;
  79. str.Format(_T("%s 宽:%d 高:%d"), g_List1array.ElementAt(i).ElementAt(0), atoi(g_List1array.ElementAt(i).ElementAt(1)), atoi(g_List1array.ElementAt(i).ElementAt(2)));
  80. m_combo1.AddString(str);
  81. }
  82. #if JEFF_TEST_ON
  83. GetDlgItem(IDC_STATIC1)->GetWindowRect(m_rcStatc1);
  84. ScreenToClient(m_rcStatc1);
  85. GetDlgItem(IDC_STATIC2)->GetWindowRect(m_rcStatc2);
  86. ScreenToClient(m_rcStatc2);
  87. #endif
  88. if (m_combo1.GetCount())
  89. {
  90. m_combo1.SetCurSel(0);
  91. OnSelchangeCombo1();
  92. }
  93. return TRUE;
  94. }
  95. #if JEFF_TEST_ON
  96. //--------------------------------------------------------------------------------------------
  97. // Add by Jeff 2014.11.12
  98. // 函数:
  99. // 描述:获取缩放比例;
  100. // 参数:
  101. // nSrcImgWidth:原图宽;
  102. // nSrcImgHeight:原图高;
  103. // rcImgDisplay:显示图片的缩放区域,也是要重新按缩放比例调整位置的区域;
  104. // 返回:返回缩放比例;
  105. //--------------------------------------------------------------------------------------------
  106. float GetZoomScale(IN const int &nSrcImgWidth,IN const int &nSrcImgHeight,IN OUT CRect &rcImgDisplay)
  107. {
  108. float fZoomScale = 0.0;
  109. float fWidthZoom = 0.0;
  110. float fHeightZoom = 0.0;
  111. fWidthZoom = (float)nSrcImgWidth / rcImgDisplay.Width();
  112. fHeightZoom = (float)nSrcImgHeight / rcImgDisplay.Height();
  113. int nDifferValue = 0; //相差值;
  114. fZoomScale = (fWidthZoom > fHeightZoom) ? fWidthZoom : fHeightZoom;
  115. if (fWidthZoom > fHeightZoom) // rcImgDisplay 宽不变,重新计算缩放高度值;
  116. {
  117. // 显示区域原高 - 缩放后的高 = 差值;
  118. nDifferValue = (rcImgDisplay.Height() - nSrcImgHeight / fZoomScale) / 2;
  119. rcImgDisplay.top += nDifferValue;
  120. rcImgDisplay.bottom -= nDifferValue;
  121. }
  122. else // rcImgDisplay 高不变,重新计算缩放宽值;
  123. {
  124. // 显示区域原宽 - 缩放后的宽 = 差值;
  125. nDifferValue = (rcImgDisplay.Width() - nSrcImgWidth / fZoomScale) / 2;
  126. rcImgDisplay.left += nDifferValue;
  127. rcImgDisplay.right -= nDifferValue;
  128. }
  129. return fZoomScale;
  130. }
  131. #endif
  132. void CutPhoto::OnPaint()
  133. {
  134. CPaintDC dc(this); // device context for painting
  135. #if JEFF_TEST_ON
  136. if ( m_width && m_height )
  137. {
  138. // 先绘制裁剪区域---------------------------------------------------------------------------------------------------------
  139. Graphics graph(dc.GetSafeHdc());
  140. // 1.创建LinearGradientBrush(渐变画刷),主要功能是使用线性渐变绘制区域。
  141. LinearGradientBrush linGrBrush(
  142. Point(0, 0),
  143. Point(1.44*max(m_rcShowCutImage.Width(), m_rcShowCutImage.Height()), 1.44*max(m_rcShowCutImage.Width(), m_rcShowCutImage.Height())),
  144. Color(255, 255, 250, 156), // opaque blue
  145. Color(255, 176, 125, 44)); // opaque green
  146. // 2.用渐变画刷填充缩放区域;
  147. graph.FillRectangle(&linGrBrush, m_rcShowCutImage.left, m_rcShowCutImage.top, m_rcShowCutImage.Width(), m_rcShowCutImage.Height());
  148. // 3.DeflateRect通过将CRect的边向其中心移动来缩小它。
  149. m_rcShowCutImage.DeflateRect(m_slider1, m_slider1, m_slider1, m_slider1);
  150. // 4.rcCutting通过GetZoomScale计算后,在原图中的实际裁剪坐标;也是要保存的坐标值
  151. CRect rcCutting(0, 0, m_pImg->GetWidth(), m_pImg->GetHeight());
  152. GetZoomScale(m_rcShowCutImage.Width(), m_rcShowCutImage.Height(), rcCutting);
  153. m_photorcbak = rcCutting;
  154. if (m_rcRealCuttingArea.right == 0) // m_photorc为裁剪尺寸;
  155. m_rcRealCuttingArea = rcCutting;
  156. else
  157. rcCutting = m_rcRealCuttingArea;
  158. graph.DrawImage(m_pImg, Rect(m_rcShowCutImage.left, m_rcShowCutImage.top, m_rcShowCutImage.Width(), m_rcShowCutImage.Height()), rcCutting.left, rcCutting.top, rcCutting.Width(), rcCutting.Height(), UnitPixel);
  159. // Draw3dRect:调用该成员函数绘制三维矩形。该矩形的顶部、左侧颜色由clrTopLeft指定,底部和右侧颜色由clrBottomRight指定。
  160. if (m_slider1 == 0)
  161. dc.Draw3dRect(m_rcShowCutImage, RGB(255, 0, 0), RGB(255, 0, 0));
  162. // 绘制小图区域---------------------------------------------------------------------------------------------------------
  163. graph.DrawImage(m_pImg, Rect(m_rtSmall.left,m_rtSmall.top,m_rtSmall.Width(),m_rtSmall.Height()), 0, 0, m_pImg->GetWidth(), m_pImg->GetHeight(), UnitPixel);
  164. // 将rcCutting映射到小图上,需要用到小图到大图的缩放比例值fZoomScale;
  165. rcCutting.left = m_rcRealCuttingArea.left / m_fZoomScale + m_rtSmall.left;
  166. rcCutting.top = m_rcRealCuttingArea.top / m_fZoomScale + m_rtSmall.top;
  167. rcCutting.right = rcCutting.left + m_rcRealCuttingArea.Width() / m_fZoomScale;
  168. rcCutting.bottom = rcCutting.top + m_rcRealCuttingArea.Height() / m_fZoomScale;
  169. dc.Draw3dRect(rcCutting, RGB(0, 0, 255), RGB(0, 0, 255));
  170. }
  171. #else
  172. if (m_width && m_height)
  173. {
  174. // 1.获取控件客户区域,并从屏幕坐标转化客户坐标;
  175. CRect rc;
  176. GetDlgItem(IDC_STATIC1)->GetWindowRect(rc);
  177. ScreenToClient(rc);
  178. m_rcShowCutImage = rc;
  179. // 2.计算控件客户区域与原图片大小的缩放比例值,从而得出一个按比例缩放的CRect对象;
  180. RectFitDes(m_width, m_height, m_rcShowCutImage);
  181. Graphics graph(dc.GetSafeHdc());
  182. // 3.创建LinearGradientBrush(渐变画刷),主要功能是使用线性渐变绘制区域。
  183. LinearGradientBrush linGrBrush(
  184. Point(0, 0),
  185. Point(1.44*max(m_rcShowCutImage.Width(), m_rcShowCutImage.Height()), 1.44*max(m_rcShowCutImage.Width(), m_rcShowCutImage.Height())),
  186. Color(255, 255, 250, 156), // opaque blue
  187. Color(255, 176, 125, 44)); // opaque green
  188. // 4.用渐变画刷填充缩放区域;
  189. graph.FillRectangle(&linGrBrush, m_rcShowCutImage.left, m_rcShowCutImage.top, m_rcShowCutImage.Width(), m_rcShowCutImage.Height());
  190. // 5.DeflateRect通过将CRect的边向其中心移动来缩小它。
  191. // 为了做到这一点,DeflateRect将单位数增加到矩形的左边和上边,从右边和下边减去单位数。
  192. // DeflateRect的参数是有符号的值;正值缩小CRect,而负值则放大它。
  193. // dc.FillSolidRect (m_paintrc, RGB(234,208,98));
  194. m_rcShowCutImage.DeflateRect(m_slider1, m_slider1, m_slider1, m_slider1);
  195. rc = m_rcShowCutImage; // 保存缩小后的缩放区域;
  196. // 6.使用小图(m_pImg是"s"小图)生成一个CRect区域对象,与缩放区域做参数计算出小图合适的缩放区域;
  197. CRect rc2(0, 0, m_pImg->GetWidth(), m_pImg->GetHeight());
  198. RectFitDes(rc.Width(), rc.Height(), rc2);
  199. m_photorcbak = rc2;
  200. if (m_rcRealCuttingArea.right == 0) // m_photorc为裁剪尺寸;
  201. {
  202. m_rcRealCuttingArea = rc2;
  203. }
  204. else
  205. {
  206. rc2 = m_rcRealCuttingArea;
  207. }
  208. // 这里m_pImg又疑为大图,而非小图;
  209. Rect destinationRect(rc.left, rc.top, rc.Width(), rc.Height());
  210. graph.DrawImage(m_pImg, destinationRect, rc2.left, rc2.top, rc2.Width(), rc2.Height(), UnitPixel);
  211. // Draw3dRect:调用该成员函数绘制三维矩形。该矩形的顶部、左侧颜色由clrTopLeft指定,底部和右侧颜色由clrBottomRight指定。
  212. if (m_slider1 == 0)
  213. dc.Draw3dRect(m_rcShowCutImage, RGB(255, 0, 0), RGB(255, 0, 0));
  214. ///////////////////
  215. {
  216. // 获取左上角小区域的显示效果;
  217. GetDlgItem(IDC_STATIC2)->GetWindowRect(rc);
  218. ScreenToClient(rc);
  219. RectFitDes(m_pImg->GetWidth(), m_pImg->GetHeight(), rc);
  220. Rect destinationRect(rc.left, rc.top, rc.Width(), rc.Height());
  221. graph.DrawImage(m_pImg, destinationRect, 0, 0, m_pImg->GetWidth(), m_pImg->GetHeight(), UnitPixel);
  222. float scale = (float)rc.Width() / (float)m_pImg->GetWidth();
  223. rc2.left *= scale;
  224. rc2.right *= scale;
  225. rc2.top *= scale;
  226. rc2.bottom *= scale;
  227. rc2.left += rc.left;
  228. rc2.right += rc.left;
  229. rc2.top += rc.top;
  230. rc2.bottom += rc.top;
  231. dc.Draw3dRect(rc2, RGB(255, 0, 0), RGB(255, 0, 0));
  232. }
  233. }
  234. #endif
  235. // Do not call CDialog::OnPaint() for painting messages
  236. }
  237. void CutPhoto::OnButton7() // 设置按钮;
  238. {
  239. SetSize dlg;
  240. dlg.DoModal();
  241. GetSize();
  242. }
  243. void CutPhoto::GetSize()
  244. {
  245. g_sendhead.bsql = 0;
  246. g_sendhead.code[0] = 174;
  247. g_sendhead.tabcount = 1;
  248. g_pMainWnd->ProcessChatMessageRequest2(6);
  249. if (g_bSendOK == 0)
  250. {
  251. return;
  252. }
  253. DataToArray(&g_List1array);
  254. CenterWindow();
  255. m_combo1.ResetContent();
  256. namearray.RemoveAll();
  257. widtharray.RemoveAll();
  258. heightarray.RemoveAll();
  259. for (int i = 0; i < g_List1array.GetSize(); i++)
  260. {
  261. namearray.Add(g_List1array.ElementAt(i).ElementAt(0));
  262. widtharray.Add(atoi(g_List1array.ElementAt(i).ElementAt(1)));
  263. heightarray.Add(atoi(g_List1array.ElementAt(i).ElementAt(2)));
  264. CString str;
  265. str.Format(_T("%s 宽:%d 高:%d"), g_List1array.ElementAt(i).ElementAt(0), atoi(g_List1array.ElementAt(i).ElementAt(1)), atoi(g_List1array.ElementAt(i).ElementAt(2)));
  266. m_combo1.AddString(str);
  267. }
  268. if (m_combo1.GetCount())
  269. {
  270. m_combo1.SetCurSel(0);
  271. OnSelchangeCombo1();
  272. }
  273. }
  274. void CutPhoto::OnSelchangeCombo1()
  275. {
  276. int pos = m_combo1.GetCurSel();
  277. if (pos == -1)return;
  278. m_rcRealCuttingArea.right = 0;
  279. m_fscale = 1.0;
  280. m_width = widtharray.ElementAt(pos); // 裁剪方案 宽值;
  281. m_height = heightarray.ElementAt(pos); // 裁剪方案 高值;
  282. m_name = namearray.ElementAt(pos); // 裁剪方案 名称;
  283. CString header = m_strImgName + ":" + m_name + ",";
  284. pos = m_size.Find(header);
  285. if (pos != -1)
  286. {
  287. CString str = m_size.Right(m_size.GetLength() - pos);
  288. CString size = str.Left(str.Find(";"));
  289. int pos = size.Find(":");
  290. if (pos != -1)
  291. {
  292. CRect rc, rc2;
  293. str = size.Left(pos);
  294. str = size.Right(size.GetLength() - pos - 1);
  295. pos = str.Find(",");
  296. str.Delete(0, pos + 1);
  297. // rc原图
  298. pos = str.Find(",");
  299. rc.left = atoi(str.Left(pos)); str.Delete(0, pos + 1);
  300. pos = str.Find(",");
  301. rc.top = atoi(str.Left(pos)); str.Delete(0, pos + 1);
  302. // rc2实际裁剪区域;
  303. pos = str.Find(",");
  304. rc2.left = atoi(str.Left(pos)); str.Delete(0, pos + 1);
  305. pos = str.Find(",");
  306. rc2.top = atoi(str.Left(pos)); str.Delete(0, pos + 1);
  307. pos = str.Find(",");
  308. rc2.right = atoi(str.Left(pos)); str.Delete(0, pos + 1);
  309. rc2.bottom = atoi(str);
  310. #if JEFF_TEST_ON
  311. //CRect rc;
  312. //GetDlgItem(IDC_STATIC1)->GetWindowRect(rc);
  313. //ScreenToClient(rc);
  314. //GetZoomScale(m_width,m_height,rc);
  315. //GetZoomScale(m_width,m_height,rc2);
  316. #else
  317. // 小图宽 / 原图宽 = 缩放比例;
  318. float scale = (float)m_pImg->GetWidth() / (float)rc.left;
  319. // rc2为实际裁剪区域;
  320. rc2.left *= scale;
  321. rc2.right *= scale;
  322. rc2.top *= scale;
  323. rc2.bottom *= scale;
  324. m_rcRealCuttingArea = rc2;
  325. #endif
  326. }
  327. }
  328. #if JEFF_TEST_ON
  329. m_rtSmall = m_rcStatc2;
  330. m_rcShowCutImage = m_rcStatc1;
  331. GetZoomScale(m_width, m_height, m_rcShowCutImage);
  332. m_fZoomScale = GetZoomScale(m_pImg->GetWidth(), m_pImg->GetHeight(), m_rtSmall);
  333. #endif
  334. RefreshRc();
  335. }
  336. void CutPhoto::OnButton1() // 放大按钮;应该以矩形中心点向外;
  337. {
  338. #if JEFF_TEST_OFF
  339. #if 0
  340. // 正切值;
  341. float fTanx = m_rcRealCuttingArea.Width() / m_rcRealCuttingArea.Height();
  342. float lhOffSet = 5.0; // 水平移动的像素;
  343. // 根据fTanx值计算出垂直移动的像素;
  344. float lvOffSet = lhOffSet / fTanx;
  345. RectF rcTemp(m_rcRealCuttingArea.left,m_rcRealCuttingArea.top,m_rcRealCuttingArea.Width(),m_rcRealCuttingArea.Height());
  346. if (rcTemp.GetRight() == 0)return;
  347. rcTemp.X += lhOffSet;
  348. rcTemp.Width -= lhOffSet*2;
  349. rcTemp.Y += lvOffSet;
  350. rcTemp.Height -= lvOffSet*2;
  351. //if ((rcTemp.X + rcTemp.Width >= m_pImg->GetWidth()) || (m_pImg->GetHeight() <= rcTemp.Y+rcTemp.Height) || rcTemp.X <= 0 || rcTemp.Y <= 0)
  352. //if (rcTemp.X >= (rcTemp.X+rcTemp.Width))
  353. if (0)
  354. {
  355. AfxMessageBox("亲,已放最大啦~");
  356. return;
  357. }
  358. else
  359. {
  360. m_rcRealCuttingArea.left = rcTemp.X;
  361. m_rcRealCuttingArea.top = rcTemp.Y;
  362. m_rcRealCuttingArea.right = m_rcRealCuttingArea.left + rcTemp.Width;
  363. m_rcRealCuttingArea.bottom = m_rcRealCuttingArea.top + rcTemp.Height;
  364. //m_rcRealCuttingArea.SetRect(rcTemp.GetLeft(),rcTemp.GetTop(),rcTemp.GetRight(),rcTemp.GetBottom());
  365. }
  366. #else
  367. // 正切值;
  368. float fTanx = m_rcRealCuttingArea.Width() / m_rcRealCuttingArea.Height();
  369. LONG lhOffSet = 2; // 水平移动的像素;
  370. // 根据fTanx值计算出垂直移动的像素;
  371. LONG lvOffSet = lhOffSet/fTanx;
  372. CRect rcTemp = m_rcRealCuttingArea;
  373. if (rcTemp.right == 0)return;
  374. rcTemp.left += lhOffSet;
  375. rcTemp.right -= lhOffSet;
  376. rcTemp.top += lvOffSet;
  377. rcTemp.bottom -= lvOffSet;
  378. if ( fTanx >= 1) // 纵向;
  379. {
  380. lvOffSet = 2;
  381. lhOffSet = lvOffSet*fTanx;
  382. if ( rcTemp.Width() <= lhOffSet)
  383. {
  384. AfxMessageBox("已放最大");
  385. }
  386. else
  387. {
  388. m_rcRealCuttingArea = rcTemp;
  389. }
  390. }
  391. else // 横向;
  392. {
  393. lhOffSet = 2;
  394. lvOffSet = lhOffSet / fTanx;
  395. if (rcTemp.Height() <= lvOffSet)
  396. {
  397. AfxMessageBox("已放最大");
  398. }
  399. else
  400. {
  401. m_rcRealCuttingArea = rcTemp;
  402. }
  403. }
  404. #endif
  405. #else
  406. #if 1
  407. CRect rcTemp = m_rcRealCuttingArea;
  408. if (rcTemp.right == 0)return;
  409. float fScale = 1.05; // 1.2
  410. int dt = rcTemp.Width() - rcTemp.Width() / fScale;
  411. dt /= 2;
  412. rcTemp.left += dt;
  413. rcTemp.right -= dt;
  414. if (rcTemp.left < 0)rcTemp.left = 0;
  415. if (rcTemp.right > m_photorcbak.right)rcTemp.right = m_photorcbak.right;
  416. dt = rcTemp.Height() - rcTemp.Height() / fScale;
  417. dt /= 2;
  418. rcTemp.top += dt;
  419. rcTemp.bottom = rcTemp.top + rcTemp.Width()*m_photorcbak.Height() / m_photorcbak.Width();
  420. if (rcTemp.top < 0)rcTemp.top = 0;
  421. if (rcTemp.bottom > m_photorcbak.bottom)rcTemp.bottom = m_photorcbak.bottom;
  422. if ((rcTemp.Width() >= m_pImg->GetWidth()) || (m_pImg->GetHeight() <= rcTemp.Height()))
  423. {
  424. //AfxMessageBox("亲,已放最大啦~");
  425. return;
  426. }
  427. else
  428. {
  429. m_rcRealCuttingArea = rcTemp;
  430. }
  431. #else
  432. if (m_rcRealCuttingArea.right == 0)return;
  433. float fScale = 1.2; // 1.2
  434. int dt = m_rcRealCuttingArea.Width() - m_rcRealCuttingArea.Width() / fScale;
  435. dt /= 2;
  436. m_rcRealCuttingArea.left += dt;
  437. m_rcRealCuttingArea.right -= dt;
  438. if (m_rcRealCuttingArea.left < 0)m_rcRealCuttingArea.left = 0;
  439. if (m_rcRealCuttingArea.right > m_photorcbak.right)m_rcRealCuttingArea.right = m_photorcbak.right;
  440. dt = m_rcRealCuttingArea.Height() - m_rcRealCuttingArea.Height() / fScale;
  441. dt /= 2;
  442. m_rcRealCuttingArea.top += dt;
  443. m_rcRealCuttingArea.bottom = m_rcRealCuttingArea.top + m_rcRealCuttingArea.Width()*m_photorcbak.Height() / m_photorcbak.Width();
  444. if (m_rcRealCuttingArea.top < 0)m_rcRealCuttingArea.top = 0;
  445. if (m_rcRealCuttingArea.bottom > m_photorcbak.bottom)m_rcRealCuttingArea.bottom = m_photorcbak.bottom;
  446. #endif
  447. #endif
  448. RefreshRc();
  449. }
  450. void CutPhoto::OnButton2() // 缩小按钮 - 缩小到一定程序,禁止缩小,否则会变形;
  451. {
  452. #if JEFF_TEST_OFF // 这里控制会产生错误;
  453. #if 1
  454. // 正切值;
  455. float fTanx = m_rcRealCuttingArea.Width() / m_rcRealCuttingArea.Height();
  456. float lhOffSet = 5.0; // 水平移动的像素;
  457. // 根据fTanx值计算出垂直移动的像素;
  458. float lvOffSet = lhOffSet / fTanx;
  459. RectF rcTemp(m_rcRealCuttingArea.left, m_rcRealCuttingArea.top, m_rcRealCuttingArea.Width(), m_rcRealCuttingArea.Height());
  460. if (rcTemp.GetRight() == 0)return;
  461. rcTemp.X -= lhOffSet;
  462. rcTemp.Width += lhOffSet*2;
  463. rcTemp.Y -= lvOffSet;
  464. rcTemp.Height += lvOffSet*2;
  465. if ((rcTemp.X + rcTemp.Width >= m_pImg->GetWidth()) || (m_pImg->GetHeight() <= rcTemp.Y + rcTemp.Height) || rcTemp.X <= 0 || rcTemp.Y <= 0)
  466. {
  467. AfxMessageBox("亲,已最小啦~");
  468. return;
  469. }
  470. else
  471. {
  472. m_rcRealCuttingArea.left = rcTemp.GetLeft();
  473. m_rcRealCuttingArea.top = rcTemp.GetTop();
  474. m_rcRealCuttingArea.right = rcTemp.GetRight();
  475. m_rcRealCuttingArea.bottom = rcTemp.GetBottom();
  476. //m_rcRealCuttingArea.SetRect(rcTemp.GetLeft(),rcTemp.GetTop(),rcTemp.GetRight(),rcTemp.GetBottom());
  477. }
  478. #else
  479. // 正切值;
  480. float fTanx = m_rcRealCuttingArea.Width() / m_rcRealCuttingArea.Height();
  481. LONG lhOffSet = 5; // 水平移动的像素;
  482. // 根据fTanx值计算出垂直移动的像素;
  483. LONG lvOffSet = lhOffSet/fTanx;
  484. CRect rcTemp = m_rcRealCuttingArea;
  485. if (rcTemp.right == 0)return;
  486. rcTemp.left -= lhOffSet;
  487. rcTemp.right += lhOffSet;
  488. rcTemp.top -= lvOffSet;
  489. rcTemp.bottom += lvOffSet;
  490. if ((rcTemp.right >= m_pImg->GetWidth()) || (m_pImg->GetHeight() <= rcTemp.bottom) || rcTemp.left <= 0 || rcTemp.top <= 0 )
  491. {
  492. AfxMessageBox("亲,已最小啦~");
  493. return;
  494. }
  495. else
  496. {
  497. m_rcRealCuttingArea = rcTemp;
  498. }
  499. #endif
  500. #else
  501. #if 1
  502. CRect rcTemp = m_rcRealCuttingArea;
  503. if (rcTemp.right == 0)return;
  504. float fScale = 0.95;
  505. int dt = rcTemp.Width() - rcTemp.Width()*fScale;
  506. dt /= 2;
  507. rcTemp.left -= dt;
  508. rcTemp.right += dt;
  509. if (rcTemp.left < 0)rcTemp.left = 0;
  510. if (rcTemp.right > m_photorcbak.right)rcTemp.right = m_photorcbak.right;
  511. dt = rcTemp.Height() - rcTemp.Height()*fScale;
  512. dt /= 2;
  513. rcTemp.top -= dt;
  514. rcTemp.bottom = rcTemp.top + rcTemp.Width()*m_photorcbak.Height() / m_photorcbak.Width();
  515. if (rcTemp.top < 0)rcTemp.top = 0;
  516. if (rcTemp.bottom > m_photorcbak.bottom)rcTemp.bottom = m_photorcbak.bottom;
  517. if ((rcTemp.Width() >= m_pImg->GetWidth()) || (m_pImg->GetHeight() <= rcTemp.Height()))
  518. {
  519. //AfxMessageBox("亲,已最小啦~");
  520. return;
  521. }
  522. else
  523. {
  524. m_rcRealCuttingArea = rcTemp;
  525. }
  526. #else
  527. if (m_rcRealCuttingArea.right == 0)return;
  528. int dt = m_rcRealCuttingArea.Width() - m_rcRealCuttingArea.Width()*0.8;
  529. dt /= 2;
  530. m_rcRealCuttingArea.left -= dt;
  531. m_rcRealCuttingArea.right += dt;
  532. if (m_rcRealCuttingArea.left < 0)m_rcRealCuttingArea.left = 0;
  533. if (m_rcRealCuttingArea.right > m_photorcbak.right)m_rcRealCuttingArea.right = m_photorcbak.right;
  534. dt = m_rcRealCuttingArea.Height() - m_rcRealCuttingArea.Height()*0.8;
  535. dt /= 2;
  536. m_rcRealCuttingArea.top -= dt;
  537. m_rcRealCuttingArea.bottom = m_rcRealCuttingArea.top + m_rcRealCuttingArea.Width()*m_photorcbak.Height() / m_photorcbak.Width();
  538. if (m_rcRealCuttingArea.top < 0)m_rcRealCuttingArea.top = 0;
  539. if (m_rcRealCuttingArea.bottom > m_photorcbak.bottom)m_rcRealCuttingArea.bottom = m_photorcbak.bottom;
  540. #endif
  541. #endif
  542. RefreshRc();
  543. }
  544. void CutPhoto::OnButton3() // 左 按钮;
  545. {
  546. if (m_rcRealCuttingArea.right == 0)return;
  547. int dt = m_photorcbak.Width() / 50; if (dt<1)dt = 1;
  548. if ((m_rcRealCuttingArea.right + dt)>(m_pImg->GetWidth() - 1))
  549. dt = m_pImg->GetWidth() - m_rcRealCuttingArea.right - 1;
  550. m_rcRealCuttingArea.left += dt;
  551. m_rcRealCuttingArea.right += dt;
  552. RefreshRc();
  553. }
  554. void CutPhoto::OnButton4() // 右按钮;
  555. {
  556. if (m_rcRealCuttingArea.right == 0)return;
  557. int dt = m_photorcbak.Width() / 50; if (dt < 1)dt = 1;
  558. if ((m_rcRealCuttingArea.left - dt) < 0)
  559. dt = m_rcRealCuttingArea.left;
  560. m_rcRealCuttingArea.left -= dt;
  561. m_rcRealCuttingArea.right -= dt;
  562. RefreshRc();
  563. }
  564. void CutPhoto::OnButton5() // 上 按钮;
  565. {
  566. if (m_rcRealCuttingArea.right == 0)return;
  567. int dt = m_photorcbak.Height() / 50; if (dt<1)dt = 1;
  568. if ((m_rcRealCuttingArea.bottom + dt)>(m_pImg->GetHeight() - 1))
  569. dt = m_pImg->GetHeight() - m_rcRealCuttingArea.bottom - 1;
  570. m_rcRealCuttingArea.top += dt;
  571. m_rcRealCuttingArea.bottom += dt;
  572. RefreshRc();
  573. }
  574. void CutPhoto::OnButton6() // 下 按钮;
  575. {
  576. if (m_rcRealCuttingArea.right == 0)return;
  577. int dt = m_photorcbak.Height() / 50; if (dt < 1)dt = 1;
  578. if ((m_rcRealCuttingArea.top - dt) < 0)
  579. dt = m_rcRealCuttingArea.top;
  580. m_rcRealCuttingArea.top -= dt;
  581. m_rcRealCuttingArea.bottom -= dt;
  582. RefreshRc();
  583. }
  584. void CutPhoto::RefreshRc()
  585. {
  586. UpdateData();
  587. CRect rc;
  588. GetDlgItem(IDC_STATIC1)->GetWindowRect(rc);
  589. ScreenToClient(rc);
  590. InvalidateRect(rc);
  591. GetDlgItem(IDC_STATIC2)->GetWindowRect(rc);
  592. ScreenToClient(rc);
  593. InvalidateRect(rc);
  594. }
  595. void CutPhoto::OnButton10() // 保存按钮;
  596. {
  597. if (!(m_width && m_height))
  598. {
  599. AfxMessageBox("请选择尺寸!");
  600. return;
  601. }
  602. CString str;
  603. str.Format("%s:%s,%d,%d,%d,%d,%d,%d;", m_strImgName, m_name, m_pImg->GetWidth(), m_pImg->GetHeight(), m_rcRealCuttingArea.left, m_rcRealCuttingArea.top, m_rcRealCuttingArea.right, m_rcRealCuttingArea.bottom);
  604. int pos;
  605. CString header = m_strImgName + ":" + m_name + ",";
  606. pos = m_size.Find(header);
  607. if (pos != -1)
  608. {
  609. CString left, right;
  610. left = m_size.Left(pos);
  611. m_size = m_size.Right(m_size.GetLength() - pos - header.GetLength());
  612. pos = m_size.Find(";");
  613. right = m_size.Right(m_size.GetLength() - pos - 1);
  614. m_size = left + right;
  615. }
  616. m_size += str;
  617. CString sql;
  618. sql.Format("update dindan set size='%s' where id='%s'", m_size, m_strOrderNumber);
  619. g_sendhead.bsql = 1;
  620. g_pMainWnd->ProcessChatMessageRequest2(sql);
  621. if (g_bSendOK == 0)return;
  622. AfxMessageBox("保存成功!");
  623. // CDialog::OnCancel ();
  624. }
  625. void CutPhoto::OnButton32() // 查看剪裁按钮;
  626. {
  627. ShowCut dlg;
  628. dlg.m_id = m_strOrderNumber;
  629. dlg.DoModal();
  630. g_sendhead.bsql = 0;
  631. g_sendhead.code[0] = 11;
  632. g_sendhead.tabcount = 1;
  633. CString filter = "id='" + m_strOrderNumber + "';";
  634. g_pMainWnd->ProcessChatMessageRequest2(filter);
  635. if (g_bSendOK == 0)
  636. {
  637. CDialog::OnCancel();
  638. return;
  639. }
  640. CArray<CStringArray, CStringArray>m_List1array;
  641. DataToArray(&m_List1array);
  642. CenterWindow();
  643. if (m_List1array.GetSize())
  644. {
  645. m_size = m_List1array.ElementAt(0).ElementAt(60);
  646. }
  647. }
  648. void CutPhoto::OnCustomdrawSlider1(NMHDR* pNMHDR, LRESULT* pResult)
  649. {
  650. *pResult = 0;
  651. }
  652. void CutPhoto::OnOutofmemorySlider1(NMHDR* pNMHDR, LRESULT* pResult)
  653. {
  654. *pResult = 0;
  655. }
  656. void CutPhoto::OnReleasedcaptureSlider1(NMHDR* pNMHDR, LRESULT* pResult)
  657. {
  658. RefreshRc();
  659. *pResult = 0;
  660. }
  661. BOOL CutPhoto::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
  662. {
  663. //-----------------------------------------------------------------------------------------
  664. // 1.判断鼠标是否在客户区域内,不在退出;
  665. // 2.获取客户区域,进而计算出中心点Center(x,y).
  666. // 3.若鼠标滚轮向下,以中心点为轴心缩小操作,缩放尺寸为1个像素点,定义宏#define ZOOMSIZE 1L;
  667. // 4.若鼠标滚轮向上,以中心点为轴心放大操作,缩放尺寸为1个像素点,定义宏#define ZOOMSIZE 1L;
  668. //-----------------------------------------------------------------------------------------
  669. ScreenToClient(&pt);
  670. if (m_rcShowCutImage.PtInRect(pt) == TRUE)
  671. {
  672. if ( zDelta > 0)
  673. {
  674. OnButton1();
  675. }
  676. else
  677. {
  678. OnButton2();
  679. }
  680. }
  681. return CDialog::OnMouseWheel(nFlags, zDelta, pt);
  682. }
  683. void CutPhoto::OnLButtonUp(UINT nFlags, CPoint point)
  684. {
  685. //ScreenToClient(&point);
  686. if (m_rcShowCutImage.PtInRect(point) == TRUE)
  687. {
  688. if (GetCapture() != this)
  689. return;
  690. ReleaseCapture();
  691. int a = abs(point.x - m_ptStart.x);
  692. int b = abs(point.y - m_ptStart.y);
  693. float tanX = 0.0;
  694. if (b != 0)
  695. tanX = a / b;
  696. // 求两点的正切值,对照正切表判断点区域;
  697. if ( point.x > m_ptStart.x && point.y <= m_ptStart.y) // point在m_ptStart的右上角;
  698. {
  699. if (b == 0)
  700. {
  701. OnButton4();
  702. }
  703. else
  704. {
  705. if (tanX < 1)
  706. {
  707. OnButton4(); // 右移;
  708. }
  709. else if (tanX >= 1)
  710. {
  711. OnButton5(); // 上移;
  712. }
  713. }
  714. }
  715. else if ( point.x <= m_ptStart.x && point.y < m_ptStart.y) // point在m_ptStart的左上角;
  716. {
  717. if (b == 0)
  718. {
  719. OnButton3();
  720. }
  721. else
  722. {
  723. if (tanX < 1)
  724. {
  725. OnButton5(); // 上移;
  726. }
  727. else if (tanX >= 1)
  728. {
  729. OnButton3(); // 左移;
  730. }
  731. }
  732. }
  733. else if ( point.x < m_ptStart.x && point.y >= m_ptStart.y ) // point在m_ptStart的左下角;
  734. {
  735. if (b == 0)
  736. {
  737. OnButton3();
  738. }
  739. else
  740. {
  741. if (tanX < 1)
  742. {
  743. OnButton6(); // 下移;
  744. }
  745. else if (tanX >= 1)
  746. {
  747. OnButton3(); // 左移;
  748. }
  749. }
  750. }
  751. else if ( point.x >= m_ptStart.x && point.y > m_ptStart.y) // point在m_ptStart的右下角;
  752. {
  753. if (b == 0)
  754. {
  755. OnButton4();
  756. }
  757. else
  758. {
  759. if (tanX < 1)
  760. {
  761. OnButton6(); // 下移;
  762. }
  763. else if (tanX >= 1)
  764. {
  765. OnButton4(); // 右移;
  766. }
  767. }
  768. }
  769. }
  770. CDialog::OnLButtonUp(nFlags, point);
  771. }
  772. void CutPhoto::OnLButtonDown(UINT nFlags, CPoint point)
  773. {
  774. //ScreenToClient(&point);
  775. if (m_rcShowCutImage.PtInRect(point) == TRUE)
  776. {
  777. GetDlgItem(IDC_STATIC1)->SetFocus();
  778. //AfxMessageBox(_T("按下在区域内"));
  779. SetCapture();
  780. m_ptStart = point;
  781. }
  782. CDialog::OnLButtonDown(nFlags, point);
  783. }