Zooming In on a Selection: Step 5
/* Use the mouse position's percentage offsets in the image rectangle
to determine the pixel offsets in the bitmap.
Using percentages allows for the possibility that the image is zoomed. */
EndPixelX = MulDiv(LeadBitmap.GetWidth(), EndGDIX - rLeadDest.left, DisplayWidth);
EndPixelY = MulDiv(LeadBitmap.GetHeight(), EndGDIY - rLeadDest.top, DisplayHeight);
/* Do nothing if no area is defined */
if ((EndPixelX == StartPixelX) || (EndPixelY == StartPixelY))
return;
/* Get the source rectangle coordinates for painting.
Allow for different mouse drag directions */
if (StartGDIX < EndGDIX)
{
rLeadSource.left = StartPixelX;
rLeadSource.right = EndPixelX;
}
else
{
rLeadSource.left = EndPixelX;
rLeadSource.right = StartPixelX;
}
if (StartGDIY < EndGDIY)
{
rLeadSource.top = StartPixelY;
rLeadSource.bottom = EndPixelY;
}
else
{
rLeadSource.top = EndPixelY;
rLeadSource.bottom = StartPixelY;
}
::GetClientRect(this->m_hWnd, &rClientSize);
/* Use this function to center the cropped display in the client area. */
CalcDisplay (rClientSize.right, /* Width allowed */
rClientSize.bottom, /* Height allowed */
rLeadSource.right - rLeadSource.left, /* Width factor, for aspect ratio */
rLeadSource.bottom - rLeadSource.top, /* Height factor, for aspect ratio */
&DisplayLeft, /* Resulting left value, for centering */
&DisplayTop, /* Resulting top value, for centering */
&DisplayWidth, /* Resulting width value */
&DisplayHeight); /* Resulting height value */
/* Set the destination rectangle for painting */
SetRect(&rLeadDest,
DisplayLeft, DisplayTop,
DisplayLeft + DisplayWidth,
DisplayTop + DisplayHeight);
/* If necessary, translate the source rectangle to the bitmap's view perspective */
if (LeadBitmap.GetViewPerspective() != TOP_LEFT)
LeadBitmap.RectToBitmap(TOP_LEFT, &rLeadSource);
/* Repaint the whole client area */
::InvalidateRect(this->m_hWnd,NULL,TRUE);
CView::OnLButtonUp(nFlags, point);
/*---[CalcDisplay]-----------------------------------------------------------
Parameters: WidthAllowed Maximum width
HeightAllowed Maximum height
WidthFactor For preserving aspect ratio, usually bitmap width
HeightFactor For preserving aspect ratio, usually bitmap height
*ResultLeft Pass NULL if you do not care about centering
Otherwise, this is updated with the X offset
*ResultTop Pass NULL if you do not care about centering
Otherwise, this is updated with the Y offset
*ResultWidth Address of the width variable to update
*ResultHeight Address of the height variable to update
Notes: Use this function to fit a displayed image in a particular
space, while preserving the aspect ratio.
--------------------------------------------------------------------------*/
void CTt2View::CalcDisplay (L_INT WidthAllowed, L_INT HeightAllowed,
L_INT WidthFactor, L_INT HeightFactor,
L_INT *ResultLeft, L_INT *ResultTop,
L_INT *ResultWidth, L_INT *ResultHeight)
{
/* Local variables for calculating results */
L_INT Left, Top, Width, Height;
/* See if using the maximum width will make the image too tall */
if(MulDiv(WidthAllowed, HeightFactor, WidthFactor) < HeightAllowed)
{ /* Use the maximum width, and calculate the height and top values */
Left = 0;
Width = WidthAllowed;
Height = MulDiv(Width, HeightFactor, WidthFactor);
Top = (HeightAllowed - Height) / 2;
}
else
{ /* Use the maximum height, and calculate the width and left values */
Top = 0;
Height = HeightAllowed;
Width = MulDiv(Height, WidthFactor, HeightFactor);
Left = (WidthAllowed - Width) / 2;
}
/* Update the top and left results, if the caller did not pass NULL */
if (ResultTop != NULL)
*ResultTop = Top;
if (ResultLeft != NULL)
*ResultLeft = Left;
/* Update the width and height results */
*ResultWidth = Width;
*ResultHeight = Height;
return;
}