// CutPhoto.cpp : implementation file // #include "stdafx.h" #include "ylgl.h" #include "CutPhoto.h" #include "SetSize.h" #include "ShowCut.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CutPhoto dialog CutPhoto::CutPhoto(CWnd* pParent /*=NULL*/): CDialog(CutPhoto::IDD, pParent) { m_pImg = NULL; m_width = 0; m_height = 0; m_fscale = 1.0; m_slider1 = 0; m_fZoomScale = 0.0; } void CutPhoto::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_SLIDER1, m_sliderctrl); DDX_Control(pDX, IDC_COMBO1, m_combo1); DDX_Slider(pDX, IDC_SLIDER1, m_slider1); } BEGIN_MESSAGE_MAP(CutPhoto, CDialog) ON_WM_PAINT() ON_BN_CLICKED(IDC_BUTTON7, OnButton7) ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchangeCombo1) ON_BN_CLICKED(IDC_BUTTON1, OnButton1) ON_BN_CLICKED(IDC_BUTTON2, OnButton2) ON_BN_CLICKED(IDC_BUTTON3, OnButton3) ON_BN_CLICKED(IDC_BUTTON4, OnButton4) ON_BN_CLICKED(IDC_BUTTON5, OnButton5) ON_BN_CLICKED(IDC_BUTTON6, OnButton6) ON_BN_CLICKED(IDC_BUTTON10, OnButton10) ON_BN_CLICKED(IDC_BUTTON32, OnButton32) ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER1, OnCustomdrawSlider1) ON_NOTIFY(NM_OUTOFMEMORY, IDC_SLIDER1, OnOutofmemorySlider1) ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER1, OnReleasedcaptureSlider1) ON_WM_MOUSEWHEEL() ON_WM_LBUTTONUP() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() BOOL CutPhoto::OnInitDialog() { CDialog::OnInitDialog(); g_sendhead.bsql = 0; g_sendhead.code[0] = 11; g_sendhead.code[1] = 174; g_sendhead.tabcount = 2; CString filter = "id='" + m_strOrderNumber + "';"; g_pMainWnd->ProcessChatMessageRequest2(filter); if (g_bSendOK == 0) { CDialog::OnCancel(); return 0; } CArraym_List1array; DataToArray(&m_List1array, &g_List1array); CenterWindow(); if (m_List1array.GetSize())m_size = m_List1array.ElementAt(0).ElementAt(60); m_sliderctrl.SetRange(0, 50); m_combo1.ResetContent(); namearray.RemoveAll(); widtharray.RemoveAll(); heightarray.RemoveAll(); for (int i = 0; i < g_List1array.GetSize(); i++) { namearray.Add(g_List1array.ElementAt(i).ElementAt(0)); widtharray.Add(atoi(g_List1array.ElementAt(i).ElementAt(1))); heightarray.Add(atoi(g_List1array.ElementAt(i).ElementAt(2))); CString str; 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))); m_combo1.AddString(str); } #if JEFF_TEST_ON GetDlgItem(IDC_STATIC1)->GetWindowRect(m_rcStatc1); ScreenToClient(m_rcStatc1); GetDlgItem(IDC_STATIC2)->GetWindowRect(m_rcStatc2); ScreenToClient(m_rcStatc2); #endif if (m_combo1.GetCount()) { m_combo1.SetCurSel(0); OnSelchangeCombo1(); } return TRUE; } #if JEFF_TEST_ON //-------------------------------------------------------------------------------------------- // Add by Jeff 2014.11.12 // 函数: // 描述:获取缩放比例; // 参数: // nSrcImgWidth:原图宽; // nSrcImgHeight:原图高; // rcImgDisplay:显示图片的缩放区域,也是要重新按缩放比例调整位置的区域; // 返回:返回缩放比例; //-------------------------------------------------------------------------------------------- float GetZoomScale(IN const int &nSrcImgWidth,IN const int &nSrcImgHeight,IN OUT CRect &rcImgDisplay) { float fZoomScale = 0.0; float fWidthZoom = 0.0; float fHeightZoom = 0.0; fWidthZoom = (float)nSrcImgWidth / rcImgDisplay.Width(); fHeightZoom = (float)nSrcImgHeight / rcImgDisplay.Height(); int nDifferValue = 0; //相差值; fZoomScale = (fWidthZoom > fHeightZoom) ? fWidthZoom : fHeightZoom; if (fWidthZoom > fHeightZoom) // rcImgDisplay 宽不变,重新计算缩放高度值; { // 显示区域原高 - 缩放后的高 = 差值; nDifferValue = (rcImgDisplay.Height() - nSrcImgHeight / fZoomScale) / 2; rcImgDisplay.top += nDifferValue; rcImgDisplay.bottom -= nDifferValue; } else // rcImgDisplay 高不变,重新计算缩放宽值; { // 显示区域原宽 - 缩放后的宽 = 差值; nDifferValue = (rcImgDisplay.Width() - nSrcImgWidth / fZoomScale) / 2; rcImgDisplay.left += nDifferValue; rcImgDisplay.right -= nDifferValue; } return fZoomScale; } #endif void CutPhoto::OnPaint() { CPaintDC dc(this); // device context for painting #if JEFF_TEST_ON if ( m_width && m_height ) { // 先绘制裁剪区域--------------------------------------------------------------------------------------------------------- Graphics graph(dc.GetSafeHdc()); // 1.创建LinearGradientBrush(渐变画刷),主要功能是使用线性渐变绘制区域。 LinearGradientBrush linGrBrush( Point(0, 0), Point(1.44*max(m_rcShowCutImage.Width(), m_rcShowCutImage.Height()), 1.44*max(m_rcShowCutImage.Width(), m_rcShowCutImage.Height())), Color(255, 255, 250, 156), // opaque blue Color(255, 176, 125, 44)); // opaque green // 2.用渐变画刷填充缩放区域; graph.FillRectangle(&linGrBrush, m_rcShowCutImage.left, m_rcShowCutImage.top, m_rcShowCutImage.Width(), m_rcShowCutImage.Height()); // 3.DeflateRect通过将CRect的边向其中心移动来缩小它。 m_rcShowCutImage.DeflateRect(m_slider1, m_slider1, m_slider1, m_slider1); // 4.rcCutting通过GetZoomScale计算后,在原图中的实际裁剪坐标;也是要保存的坐标值 CRect rcCutting(0, 0, m_pImg->GetWidth(), m_pImg->GetHeight()); GetZoomScale(m_rcShowCutImage.Width(), m_rcShowCutImage.Height(), rcCutting); m_photorcbak = rcCutting; if (m_rcRealCuttingArea.right == 0) // m_photorc为裁剪尺寸; m_rcRealCuttingArea = rcCutting; else rcCutting = m_rcRealCuttingArea; 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); // Draw3dRect:调用该成员函数绘制三维矩形。该矩形的顶部、左侧颜色由clrTopLeft指定,底部和右侧颜色由clrBottomRight指定。 if (m_slider1 == 0) dc.Draw3dRect(m_rcShowCutImage, RGB(255, 0, 0), RGB(255, 0, 0)); // 绘制小图区域--------------------------------------------------------------------------------------------------------- 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); // 将rcCutting映射到小图上,需要用到小图到大图的缩放比例值fZoomScale; rcCutting.left = m_rcRealCuttingArea.left / m_fZoomScale + m_rtSmall.left; rcCutting.top = m_rcRealCuttingArea.top / m_fZoomScale + m_rtSmall.top; rcCutting.right = rcCutting.left + m_rcRealCuttingArea.Width() / m_fZoomScale; rcCutting.bottom = rcCutting.top + m_rcRealCuttingArea.Height() / m_fZoomScale; dc.Draw3dRect(rcCutting, RGB(0, 0, 255), RGB(0, 0, 255)); } #else if (m_width && m_height) { // 1.获取控件客户区域,并从屏幕坐标转化客户坐标; CRect rc; GetDlgItem(IDC_STATIC1)->GetWindowRect(rc); ScreenToClient(rc); m_rcShowCutImage = rc; // 2.计算控件客户区域与原图片大小的缩放比例值,从而得出一个按比例缩放的CRect对象; RectFitDes(m_width, m_height, m_rcShowCutImage); Graphics graph(dc.GetSafeHdc()); // 3.创建LinearGradientBrush(渐变画刷),主要功能是使用线性渐变绘制区域。 LinearGradientBrush linGrBrush( Point(0, 0), Point(1.44*max(m_rcShowCutImage.Width(), m_rcShowCutImage.Height()), 1.44*max(m_rcShowCutImage.Width(), m_rcShowCutImage.Height())), Color(255, 255, 250, 156), // opaque blue Color(255, 176, 125, 44)); // opaque green // 4.用渐变画刷填充缩放区域; graph.FillRectangle(&linGrBrush, m_rcShowCutImage.left, m_rcShowCutImage.top, m_rcShowCutImage.Width(), m_rcShowCutImage.Height()); // 5.DeflateRect通过将CRect的边向其中心移动来缩小它。 // 为了做到这一点,DeflateRect将单位数增加到矩形的左边和上边,从右边和下边减去单位数。 // DeflateRect的参数是有符号的值;正值缩小CRect,而负值则放大它。 // dc.FillSolidRect (m_paintrc, RGB(234,208,98)); m_rcShowCutImage.DeflateRect(m_slider1, m_slider1, m_slider1, m_slider1); rc = m_rcShowCutImage; // 保存缩小后的缩放区域; // 6.使用小图(m_pImg是"s"小图)生成一个CRect区域对象,与缩放区域做参数计算出小图合适的缩放区域; CRect rc2(0, 0, m_pImg->GetWidth(), m_pImg->GetHeight()); RectFitDes(rc.Width(), rc.Height(), rc2); m_photorcbak = rc2; if (m_rcRealCuttingArea.right == 0) // m_photorc为裁剪尺寸; { m_rcRealCuttingArea = rc2; } else { rc2 = m_rcRealCuttingArea; } // 这里m_pImg又疑为大图,而非小图; Rect destinationRect(rc.left, rc.top, rc.Width(), rc.Height()); graph.DrawImage(m_pImg, destinationRect, rc2.left, rc2.top, rc2.Width(), rc2.Height(), UnitPixel); // Draw3dRect:调用该成员函数绘制三维矩形。该矩形的顶部、左侧颜色由clrTopLeft指定,底部和右侧颜色由clrBottomRight指定。 if (m_slider1 == 0) dc.Draw3dRect(m_rcShowCutImage, RGB(255, 0, 0), RGB(255, 0, 0)); /////////////////// { // 获取左上角小区域的显示效果; GetDlgItem(IDC_STATIC2)->GetWindowRect(rc); ScreenToClient(rc); RectFitDes(m_pImg->GetWidth(), m_pImg->GetHeight(), rc); Rect destinationRect(rc.left, rc.top, rc.Width(), rc.Height()); graph.DrawImage(m_pImg, destinationRect, 0, 0, m_pImg->GetWidth(), m_pImg->GetHeight(), UnitPixel); float scale = (float)rc.Width() / (float)m_pImg->GetWidth(); rc2.left *= scale; rc2.right *= scale; rc2.top *= scale; rc2.bottom *= scale; rc2.left += rc.left; rc2.right += rc.left; rc2.top += rc.top; rc2.bottom += rc.top; dc.Draw3dRect(rc2, RGB(255, 0, 0), RGB(255, 0, 0)); } } #endif // Do not call CDialog::OnPaint() for painting messages } void CutPhoto::OnButton7() // 设置按钮; { SetSize dlg; dlg.DoModal(); GetSize(); } void CutPhoto::GetSize() { g_sendhead.bsql = 0; g_sendhead.code[0] = 174; g_sendhead.tabcount = 1; g_pMainWnd->ProcessChatMessageRequest2(6); if (g_bSendOK == 0) { return; } DataToArray(&g_List1array); CenterWindow(); m_combo1.ResetContent(); namearray.RemoveAll(); widtharray.RemoveAll(); heightarray.RemoveAll(); for (int i = 0; i < g_List1array.GetSize(); i++) { namearray.Add(g_List1array.ElementAt(i).ElementAt(0)); widtharray.Add(atoi(g_List1array.ElementAt(i).ElementAt(1))); heightarray.Add(atoi(g_List1array.ElementAt(i).ElementAt(2))); CString str; 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))); m_combo1.AddString(str); } if (m_combo1.GetCount()) { m_combo1.SetCurSel(0); OnSelchangeCombo1(); } } void CutPhoto::OnSelchangeCombo1() { int pos = m_combo1.GetCurSel(); if (pos == -1)return; m_rcRealCuttingArea.right = 0; m_fscale = 1.0; m_width = widtharray.ElementAt(pos); // 裁剪方案 宽值; m_height = heightarray.ElementAt(pos); // 裁剪方案 高值; m_name = namearray.ElementAt(pos); // 裁剪方案 名称; CString header = m_strImgName + ":" + m_name + ","; pos = m_size.Find(header); if (pos != -1) { CString str = m_size.Right(m_size.GetLength() - pos); CString size = str.Left(str.Find(";")); int pos = size.Find(":"); if (pos != -1) { CRect rc, rc2; str = size.Left(pos); str = size.Right(size.GetLength() - pos - 1); pos = str.Find(","); str.Delete(0, pos + 1); // rc原图 pos = str.Find(","); rc.left = atoi(str.Left(pos)); str.Delete(0, pos + 1); pos = str.Find(","); rc.top = atoi(str.Left(pos)); str.Delete(0, pos + 1); // rc2实际裁剪区域; pos = str.Find(","); rc2.left = atoi(str.Left(pos)); str.Delete(0, pos + 1); pos = str.Find(","); rc2.top = atoi(str.Left(pos)); str.Delete(0, pos + 1); pos = str.Find(","); rc2.right = atoi(str.Left(pos)); str.Delete(0, pos + 1); rc2.bottom = atoi(str); #if JEFF_TEST_ON //CRect rc; //GetDlgItem(IDC_STATIC1)->GetWindowRect(rc); //ScreenToClient(rc); //GetZoomScale(m_width,m_height,rc); //GetZoomScale(m_width,m_height,rc2); #else // 小图宽 / 原图宽 = 缩放比例; float scale = (float)m_pImg->GetWidth() / (float)rc.left; // rc2为实际裁剪区域; rc2.left *= scale; rc2.right *= scale; rc2.top *= scale; rc2.bottom *= scale; m_rcRealCuttingArea = rc2; #endif } } #if JEFF_TEST_ON m_rtSmall = m_rcStatc2; m_rcShowCutImage = m_rcStatc1; GetZoomScale(m_width, m_height, m_rcShowCutImage); m_fZoomScale = GetZoomScale(m_pImg->GetWidth(), m_pImg->GetHeight(), m_rtSmall); #endif RefreshRc(); } void CutPhoto::OnButton1() // 放大按钮;应该以矩形中心点向外; { #if JEFF_TEST_OFF #if 0 // 正切值; float fTanx = m_rcRealCuttingArea.Width() / m_rcRealCuttingArea.Height(); float lhOffSet = 5.0; // 水平移动的像素; // 根据fTanx值计算出垂直移动的像素; float lvOffSet = lhOffSet / fTanx; RectF rcTemp(m_rcRealCuttingArea.left,m_rcRealCuttingArea.top,m_rcRealCuttingArea.Width(),m_rcRealCuttingArea.Height()); if (rcTemp.GetRight() == 0)return; rcTemp.X += lhOffSet; rcTemp.Width -= lhOffSet*2; rcTemp.Y += lvOffSet; rcTemp.Height -= lvOffSet*2; //if ((rcTemp.X + rcTemp.Width >= m_pImg->GetWidth()) || (m_pImg->GetHeight() <= rcTemp.Y+rcTemp.Height) || rcTemp.X <= 0 || rcTemp.Y <= 0) //if (rcTemp.X >= (rcTemp.X+rcTemp.Width)) if (0) { AfxMessageBox("亲,已放最大啦~"); return; } else { m_rcRealCuttingArea.left = rcTemp.X; m_rcRealCuttingArea.top = rcTemp.Y; m_rcRealCuttingArea.right = m_rcRealCuttingArea.left + rcTemp.Width; m_rcRealCuttingArea.bottom = m_rcRealCuttingArea.top + rcTemp.Height; //m_rcRealCuttingArea.SetRect(rcTemp.GetLeft(),rcTemp.GetTop(),rcTemp.GetRight(),rcTemp.GetBottom()); } #else // 正切值; float fTanx = m_rcRealCuttingArea.Width() / m_rcRealCuttingArea.Height(); LONG lhOffSet = 2; // 水平移动的像素; // 根据fTanx值计算出垂直移动的像素; LONG lvOffSet = lhOffSet/fTanx; CRect rcTemp = m_rcRealCuttingArea; if (rcTemp.right == 0)return; rcTemp.left += lhOffSet; rcTemp.right -= lhOffSet; rcTemp.top += lvOffSet; rcTemp.bottom -= lvOffSet; if ( fTanx >= 1) // 纵向; { lvOffSet = 2; lhOffSet = lvOffSet*fTanx; if ( rcTemp.Width() <= lhOffSet) { AfxMessageBox("已放最大"); } else { m_rcRealCuttingArea = rcTemp; } } else // 横向; { lhOffSet = 2; lvOffSet = lhOffSet / fTanx; if (rcTemp.Height() <= lvOffSet) { AfxMessageBox("已放最大"); } else { m_rcRealCuttingArea = rcTemp; } } #endif #else #if 1 CRect rcTemp = m_rcRealCuttingArea; if (rcTemp.right == 0)return; float fScale = 1.05; // 1.2 int dt = rcTemp.Width() - rcTemp.Width() / fScale; dt /= 2; rcTemp.left += dt; rcTemp.right -= dt; if (rcTemp.left < 0)rcTemp.left = 0; if (rcTemp.right > m_photorcbak.right)rcTemp.right = m_photorcbak.right; dt = rcTemp.Height() - rcTemp.Height() / fScale; dt /= 2; rcTemp.top += dt; rcTemp.bottom = rcTemp.top + rcTemp.Width()*m_photorcbak.Height() / m_photorcbak.Width(); if (rcTemp.top < 0)rcTemp.top = 0; if (rcTemp.bottom > m_photorcbak.bottom)rcTemp.bottom = m_photorcbak.bottom; if ((rcTemp.Width() >= m_pImg->GetWidth()) || (m_pImg->GetHeight() <= rcTemp.Height())) { //AfxMessageBox("亲,已放最大啦~"); return; } else { m_rcRealCuttingArea = rcTemp; } #else if (m_rcRealCuttingArea.right == 0)return; float fScale = 1.2; // 1.2 int dt = m_rcRealCuttingArea.Width() - m_rcRealCuttingArea.Width() / fScale; dt /= 2; m_rcRealCuttingArea.left += dt; m_rcRealCuttingArea.right -= dt; if (m_rcRealCuttingArea.left < 0)m_rcRealCuttingArea.left = 0; if (m_rcRealCuttingArea.right > m_photorcbak.right)m_rcRealCuttingArea.right = m_photorcbak.right; dt = m_rcRealCuttingArea.Height() - m_rcRealCuttingArea.Height() / fScale; dt /= 2; m_rcRealCuttingArea.top += dt; m_rcRealCuttingArea.bottom = m_rcRealCuttingArea.top + m_rcRealCuttingArea.Width()*m_photorcbak.Height() / m_photorcbak.Width(); if (m_rcRealCuttingArea.top < 0)m_rcRealCuttingArea.top = 0; if (m_rcRealCuttingArea.bottom > m_photorcbak.bottom)m_rcRealCuttingArea.bottom = m_photorcbak.bottom; #endif #endif RefreshRc(); } void CutPhoto::OnButton2() // 缩小按钮 - 缩小到一定程序,禁止缩小,否则会变形; { #if JEFF_TEST_OFF // 这里控制会产生错误; #if 1 // 正切值; float fTanx = m_rcRealCuttingArea.Width() / m_rcRealCuttingArea.Height(); float lhOffSet = 5.0; // 水平移动的像素; // 根据fTanx值计算出垂直移动的像素; float lvOffSet = lhOffSet / fTanx; RectF rcTemp(m_rcRealCuttingArea.left, m_rcRealCuttingArea.top, m_rcRealCuttingArea.Width(), m_rcRealCuttingArea.Height()); if (rcTemp.GetRight() == 0)return; rcTemp.X -= lhOffSet; rcTemp.Width += lhOffSet*2; rcTemp.Y -= lvOffSet; rcTemp.Height += lvOffSet*2; if ((rcTemp.X + rcTemp.Width >= m_pImg->GetWidth()) || (m_pImg->GetHeight() <= rcTemp.Y + rcTemp.Height) || rcTemp.X <= 0 || rcTemp.Y <= 0) { AfxMessageBox("亲,已最小啦~"); return; } else { m_rcRealCuttingArea.left = rcTemp.GetLeft(); m_rcRealCuttingArea.top = rcTemp.GetTop(); m_rcRealCuttingArea.right = rcTemp.GetRight(); m_rcRealCuttingArea.bottom = rcTemp.GetBottom(); //m_rcRealCuttingArea.SetRect(rcTemp.GetLeft(),rcTemp.GetTop(),rcTemp.GetRight(),rcTemp.GetBottom()); } #else // 正切值; float fTanx = m_rcRealCuttingArea.Width() / m_rcRealCuttingArea.Height(); LONG lhOffSet = 5; // 水平移动的像素; // 根据fTanx值计算出垂直移动的像素; LONG lvOffSet = lhOffSet/fTanx; CRect rcTemp = m_rcRealCuttingArea; if (rcTemp.right == 0)return; rcTemp.left -= lhOffSet; rcTemp.right += lhOffSet; rcTemp.top -= lvOffSet; rcTemp.bottom += lvOffSet; if ((rcTemp.right >= m_pImg->GetWidth()) || (m_pImg->GetHeight() <= rcTemp.bottom) || rcTemp.left <= 0 || rcTemp.top <= 0 ) { AfxMessageBox("亲,已最小啦~"); return; } else { m_rcRealCuttingArea = rcTemp; } #endif #else #if 1 CRect rcTemp = m_rcRealCuttingArea; if (rcTemp.right == 0)return; float fScale = 0.95; int dt = rcTemp.Width() - rcTemp.Width()*fScale; dt /= 2; rcTemp.left -= dt; rcTemp.right += dt; if (rcTemp.left < 0)rcTemp.left = 0; if (rcTemp.right > m_photorcbak.right)rcTemp.right = m_photorcbak.right; dt = rcTemp.Height() - rcTemp.Height()*fScale; dt /= 2; rcTemp.top -= dt; rcTemp.bottom = rcTemp.top + rcTemp.Width()*m_photorcbak.Height() / m_photorcbak.Width(); if (rcTemp.top < 0)rcTemp.top = 0; if (rcTemp.bottom > m_photorcbak.bottom)rcTemp.bottom = m_photorcbak.bottom; if ((rcTemp.Width() >= m_pImg->GetWidth()) || (m_pImg->GetHeight() <= rcTemp.Height())) { //AfxMessageBox("亲,已最小啦~"); return; } else { m_rcRealCuttingArea = rcTemp; } #else if (m_rcRealCuttingArea.right == 0)return; int dt = m_rcRealCuttingArea.Width() - m_rcRealCuttingArea.Width()*0.8; dt /= 2; m_rcRealCuttingArea.left -= dt; m_rcRealCuttingArea.right += dt; if (m_rcRealCuttingArea.left < 0)m_rcRealCuttingArea.left = 0; if (m_rcRealCuttingArea.right > m_photorcbak.right)m_rcRealCuttingArea.right = m_photorcbak.right; dt = m_rcRealCuttingArea.Height() - m_rcRealCuttingArea.Height()*0.8; dt /= 2; m_rcRealCuttingArea.top -= dt; m_rcRealCuttingArea.bottom = m_rcRealCuttingArea.top + m_rcRealCuttingArea.Width()*m_photorcbak.Height() / m_photorcbak.Width(); if (m_rcRealCuttingArea.top < 0)m_rcRealCuttingArea.top = 0; if (m_rcRealCuttingArea.bottom > m_photorcbak.bottom)m_rcRealCuttingArea.bottom = m_photorcbak.bottom; #endif #endif RefreshRc(); } void CutPhoto::OnButton3() // 左 按钮; { if (m_rcRealCuttingArea.right == 0)return; int dt = m_photorcbak.Width() / 50; if (dt<1)dt = 1; if ((m_rcRealCuttingArea.right + dt)>(m_pImg->GetWidth() - 1)) dt = m_pImg->GetWidth() - m_rcRealCuttingArea.right - 1; m_rcRealCuttingArea.left += dt; m_rcRealCuttingArea.right += dt; RefreshRc(); } void CutPhoto::OnButton4() // 右按钮; { if (m_rcRealCuttingArea.right == 0)return; int dt = m_photorcbak.Width() / 50; if (dt < 1)dt = 1; if ((m_rcRealCuttingArea.left - dt) < 0) dt = m_rcRealCuttingArea.left; m_rcRealCuttingArea.left -= dt; m_rcRealCuttingArea.right -= dt; RefreshRc(); } void CutPhoto::OnButton5() // 上 按钮; { if (m_rcRealCuttingArea.right == 0)return; int dt = m_photorcbak.Height() / 50; if (dt<1)dt = 1; if ((m_rcRealCuttingArea.bottom + dt)>(m_pImg->GetHeight() - 1)) dt = m_pImg->GetHeight() - m_rcRealCuttingArea.bottom - 1; m_rcRealCuttingArea.top += dt; m_rcRealCuttingArea.bottom += dt; RefreshRc(); } void CutPhoto::OnButton6() // 下 按钮; { if (m_rcRealCuttingArea.right == 0)return; int dt = m_photorcbak.Height() / 50; if (dt < 1)dt = 1; if ((m_rcRealCuttingArea.top - dt) < 0) dt = m_rcRealCuttingArea.top; m_rcRealCuttingArea.top -= dt; m_rcRealCuttingArea.bottom -= dt; RefreshRc(); } void CutPhoto::RefreshRc() { UpdateData(); CRect rc; GetDlgItem(IDC_STATIC1)->GetWindowRect(rc); ScreenToClient(rc); InvalidateRect(rc); GetDlgItem(IDC_STATIC2)->GetWindowRect(rc); ScreenToClient(rc); InvalidateRect(rc); } void CutPhoto::OnButton10() // 保存按钮; { if (!(m_width && m_height)) { AfxMessageBox("请选择尺寸!"); return; } CString str; 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); int pos; CString header = m_strImgName + ":" + m_name + ","; pos = m_size.Find(header); if (pos != -1) { CString left, right; left = m_size.Left(pos); m_size = m_size.Right(m_size.GetLength() - pos - header.GetLength()); pos = m_size.Find(";"); right = m_size.Right(m_size.GetLength() - pos - 1); m_size = left + right; } m_size += str; CString sql; sql.Format("update dindan set size='%s' where id='%s'", m_size, m_strOrderNumber); g_sendhead.bsql = 1; g_pMainWnd->ProcessChatMessageRequest2(sql); if (g_bSendOK == 0)return; AfxMessageBox("保存成功!"); // CDialog::OnCancel (); } void CutPhoto::OnButton32() // 查看剪裁按钮; { ShowCut dlg; dlg.m_id = m_strOrderNumber; dlg.DoModal(); g_sendhead.bsql = 0; g_sendhead.code[0] = 11; g_sendhead.tabcount = 1; CString filter = "id='" + m_strOrderNumber + "';"; g_pMainWnd->ProcessChatMessageRequest2(filter); if (g_bSendOK == 0) { CDialog::OnCancel(); return; } CArraym_List1array; DataToArray(&m_List1array); CenterWindow(); if (m_List1array.GetSize()) { m_size = m_List1array.ElementAt(0).ElementAt(60); } } void CutPhoto::OnCustomdrawSlider1(NMHDR* pNMHDR, LRESULT* pResult) { *pResult = 0; } void CutPhoto::OnOutofmemorySlider1(NMHDR* pNMHDR, LRESULT* pResult) { *pResult = 0; } void CutPhoto::OnReleasedcaptureSlider1(NMHDR* pNMHDR, LRESULT* pResult) { RefreshRc(); *pResult = 0; } BOOL CutPhoto::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) { //----------------------------------------------------------------------------------------- // 1.判断鼠标是否在客户区域内,不在退出; // 2.获取客户区域,进而计算出中心点Center(x,y). // 3.若鼠标滚轮向下,以中心点为轴心缩小操作,缩放尺寸为1个像素点,定义宏#define ZOOMSIZE 1L; // 4.若鼠标滚轮向上,以中心点为轴心放大操作,缩放尺寸为1个像素点,定义宏#define ZOOMSIZE 1L; //----------------------------------------------------------------------------------------- ScreenToClient(&pt); if (m_rcShowCutImage.PtInRect(pt) == TRUE) { if ( zDelta > 0) { OnButton1(); } else { OnButton2(); } } return CDialog::OnMouseWheel(nFlags, zDelta, pt); } void CutPhoto::OnLButtonUp(UINT nFlags, CPoint point) { //ScreenToClient(&point); if (m_rcShowCutImage.PtInRect(point) == TRUE) { if (GetCapture() != this) return; ReleaseCapture(); int a = abs(point.x - m_ptStart.x); int b = abs(point.y - m_ptStart.y); float tanX = 0.0; if (b != 0) tanX = a / b; // 求两点的正切值,对照正切表判断点区域; if ( point.x > m_ptStart.x && point.y <= m_ptStart.y) // point在m_ptStart的右上角; { if (b == 0) { OnButton4(); } else { if (tanX < 1) { OnButton4(); // 右移; } else if (tanX >= 1) { OnButton5(); // 上移; } } } else if ( point.x <= m_ptStart.x && point.y < m_ptStart.y) // point在m_ptStart的左上角; { if (b == 0) { OnButton3(); } else { if (tanX < 1) { OnButton5(); // 上移; } else if (tanX >= 1) { OnButton3(); // 左移; } } } else if ( point.x < m_ptStart.x && point.y >= m_ptStart.y ) // point在m_ptStart的左下角; { if (b == 0) { OnButton3(); } else { if (tanX < 1) { OnButton6(); // 下移; } else if (tanX >= 1) { OnButton3(); // 左移; } } } else if ( point.x >= m_ptStart.x && point.y > m_ptStart.y) // point在m_ptStart的右下角; { if (b == 0) { OnButton4(); } else { if (tanX < 1) { OnButton6(); // 下移; } else if (tanX >= 1) { OnButton4(); // 右移; } } } } CDialog::OnLButtonUp(nFlags, point); } void CutPhoto::OnLButtonDown(UINT nFlags, CPoint point) { //ScreenToClient(&point); if (m_rcShowCutImage.PtInRect(point) == TRUE) { GetDlgItem(IDC_STATIC1)->SetFocus(); //AfxMessageBox(_T("按下在区域内")); SetCapture(); m_ptStart = point; } CDialog::OnLButtonDown(nFlags, point); }