Browse Source

zoom in on image

sabrogden 6 years ago
parent
commit
e6209d00fe
2 changed files with 101 additions and 16 deletions
  1. 96 15
      ImageViewer.cpp
  2. 5 1
      ScrollHelper.cpp

+ 96 - 15
ImageViewer.cpp

@@ -72,6 +72,8 @@ BOOL CImageViewer::Create(CWnd* pParent)
 	return TRUE;
 }
 
+double m_scale = 1;
+
 void CImageViewer::UpdateBitmapSize()
 {
 	if (m_pGdiplusBitmap != NULL)
@@ -88,7 +90,7 @@ void CImageViewer::UpdateBitmapSize()
 		else
 		{
 			m_scrollHelper.AttachWnd(this);
-			m_scrollHelper.SetDisplaySize(m_pGdiplusBitmap->GetWidth(), m_pGdiplusBitmap->GetHeight());
+			m_scrollHelper.SetDisplaySize(m_pGdiplusBitmap->GetWidth() * m_scale, m_pGdiplusBitmap->GetHeight() * m_scale);
 		}
 	}
 }
@@ -154,7 +156,17 @@ void CImageViewer::OnPaint()
 
 			CSize s = m_scrollHelper.GetScrollPos();
 			Gdiplus::Graphics graphics(memDC);
-			graphics.DrawImage(m_pGdiplusBitmap, rect.left, rect.top, s.cx, s.cy, width, height, Gdiplus::UnitPixel);
+
+			graphics.SetInterpolationMode(Gdiplus::InterpolationModeHighQualityBicubic);
+
+			graphics.SetPixelOffsetMode(Gdiplus::PixelOffsetModeHalf);
+			//graphics.ScaleTransform(m_scale, m_scale);
+			double x = m_scale;
+			if (x != 1)
+			{
+				x = 1.0 + (1.0 - m_scale);
+			}
+			graphics.DrawImage(m_pGdiplusBitmap, rect.left, rect.top, s.cx, s.cy, width * (x), height * (x), Gdiplus::UnitPixel);
 		}
 		
 		rect.top += height;
@@ -178,14 +190,75 @@ void CImageViewer::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
 
 BOOL CImageViewer::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
 {
-	//OutputDebugString(_T("OnMouseWheel\r\n"));
-	BOOL wasScrolled = m_scrollHelper.OnMouseWheel(nFlags, zDelta, pt);
-	return wasScrolled;
+	OutputDebugString(_T("OnMouseWheel\r\n"));
+
+	if (nFlags == 8)
+	{
+		this->LockWindowUpdate();
+		CPoint delta;
+
+		int upDown = 1;
+
+
+		m_scrollHelper.GetScrollPos();
+
+		if (zDelta > 0)
+		{
+			m_scale -= .1;
+			upDown = -1;
+
+		}
+		else
+		{
+			m_scale += .1;
+		}		
+		
+		/*int n = (m_pGdiplusBitmap->GetWidth() - m_scrollHelper.GetPageSize().cx) * m_scale;
+		int n2 = (m_pGdiplusBitmap->GetHeight() - m_scrollHelper.GetPageSize().cy) * m_scale;
+		int d = n - o;
+		int d2 = n2 - o2;*/
+
+		
+
+		POINT pointInImage;
+		pointInImage.x = pt.x;
+		pointInImage.y = pt.y;
+
+		::ScreenToClient(m_hWnd, &pointInImage);
+
+		pointInImage.x += m_scrollHelper.GetScrollPos().cx;
+		pointInImage.y += m_scrollHelper.GetScrollPos().cy;
+
+		UpdateBitmapSize();
+
+		POINT b;
+		b.x = pointInImage.x + (pointInImage.x * .1);
+		b.y = pointInImage.y + (pointInImage.y * .1);
+
+		delta.x = (b.x - pointInImage.x) * upDown;
+		delta.y = (b.y - pointInImage.y) * upDown;
+
+		CString cs;
+		cs.Format(_T("pos in image: x: %d, y: %d, new x: %d, y: %d, diff: x: %d, y: %d\r\n"), pointInImage.x, pointInImage.y, b.x, b.y, delta.x, delta.y);
+		OutputDebugString(cs);
+		m_scrollHelper.Update(delta);
+
+		Invalidate();
+
+		this->UnlockWindowUpdate();
+	}
+	else
+	{
+		BOOL wasScrolled = m_scrollHelper.OnMouseWheel(nFlags, zDelta, pt);
+		return wasScrolled;
+	}
+
+	return TRUE;
 }
 
 void CImageViewer::OnMouseHWheel(UINT nFlags, short zDelta, CPoint pt)
 {
-	//OutputDebugString(_T("OnMouseHWheel\r\n"));
+	OutputDebugString(_T("OnMouseHWheel\r\n"));
 
 	BOOL wasScrolled = m_scrollHelper.OnMouseHWheel(nFlags, -zDelta, pt);
 
@@ -273,6 +346,11 @@ LRESULT CImageViewer::OnGesture(WPARAM wParam, LPARAM lParam)
 				m_ptFirst.x = gi.ptsLocation.x;
 				m_ptFirst.y = gi.ptsLocation.y;
 				::ScreenToClient(m_hWnd, &m_ptFirst);
+				OutputDebugString(_T("zoom start\r\n"));
+				break;
+
+			case GF_END:
+				OutputDebugString(_T("zoom end\r\n"));
 				break;
 
 			default:
@@ -296,16 +374,16 @@ LRESULT CImageViewer::OnGesture(WPARAM wParam, LPARAM lParam)
 
 				//m_scrollHelper.Update(ptZoomCenter);
 
-				//CString cs;
-				//cs.Format(_T("ZOOM k: %f, x: %d, y: %d\r\n"), k, ptZoomCenter.x, ptZoomCenter.y);
-				//OutputDebugString(cs);
+				CString cs;
+				cs.Format(_T("ZOOM k: %f, x: %d, y: %d\r\n"), k, ptZoomCenter.x, ptZoomCenter.y);
+				OutputDebugString(cs);
 
 				//InvalidateRect(hWnd, NULL, TRUE);
 
 				// Now we have to store new information as a starting information 
 				// for the next step in this gesture.
 				m_ptFirst = m_ptSecond;
-				m_dwArguments = LODWORD(gi.ullArguments);
+				//m_dwArguments = LODWORD(gi.ullArguments);
 				break;
 			}
 			break;
@@ -352,21 +430,22 @@ LRESULT CImageViewer::OnGesture(WPARAM wParam, LPARAM lParam)
 			break;
 			break;
 		case GID_ROTATE:
-			//OutputDebugString(_T("rotate\r\n"));
+			OutputDebugString(_T("rotate\r\n"));
 			// Code for rotation goes here
 			bHandled = TRUE;
 			break;
 		case GID_TWOFINGERTAP:
-			//OutputDebugString(_T("two finger\r\n"));
+			OutputDebugString(_T("two finger\r\n"));
 			// Code for two-finger tap goes here
 			bHandled = TRUE;
 			break;
 		case GID_PRESSANDTAP:
-			//OutputDebugString(_T("press and tap\r\n"));
+			OutputDebugString(_T("press and tap\r\n"));
 			// Code for roll over goes here
 			bHandled = TRUE;
 			break;
 		default:
+			OutputDebugString(_T("default\r\n"));
 			// A gesture was not recognized
 			break;
 		}
@@ -374,6 +453,7 @@ LRESULT CImageViewer::OnGesture(WPARAM wParam, LPARAM lParam)
 	else {
 		DWORD dwErr = GetLastError();
 		if (dwErr > 0) {
+			OutputDebugString(_T("error\r\n"));
 			//MessageBoxW(hWnd, L"Error!", L"Could not retrieve a GESTUREINFO structure.", MB_OK);
 		}
 	}
@@ -389,8 +469,9 @@ LRESULT CImageViewer::OnGestureNotify(WPARAM wParam, LPARAM lParam)
 			// that we want to handle in our application. In this app we
 			// decide to handle all gestures.
 	GESTURECONFIG gc = {
-		GID_PAN,              // gesture ID
-		GC_PAN | GC_PAN_WITH_SINGLE_FINGER_VERTICALLY | GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY | GC_PAN_WITH_GUTTER | GC_PAN_WITH_INERTIA, // settings related to gesture ID that are to be 
+		0,              // gesture ID
+		GC_ALLGESTURES,
+		//GC_PAN | GC_PAN_WITH_SINGLE_FINGER_VERTICALLY | GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY | GC_PAN_WITH_GUTTER | GC_PAN_WITH_INERTIA, // settings related to gesture ID that are to be 
 						// turned on
 		0               // settings related to gesture ID that are to be 
 						// turned off

+ 5 - 1
ScrollHelper.cpp

@@ -60,7 +60,11 @@ void CScrollHelper::DetachWnd()
 void CScrollHelper::SetDisplaySize(int displayWidth, int displayHeight)
 {
 	int cxSB = ::GetSystemMetrics(SM_CXVSCROLL);
-	int cySB = ::GetSystemMetrics(SM_CYHSCROLL);
+	int cySB = ::GetSystemMetrics(SM_CYHSCROLL);	
+
+	CString msg;
+	msg.Format(_T("width: %d, height: %d"), displayWidth, displayHeight);
+	OutputDebugString(msg);
 
     m_displaySize = CSize(displayWidth + cxSB, displayHeight + cySB);