void CExImageView::OnDraw(CDC* pDC)
{
CExImageDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!m_Image.IsNull()) {
CRect rectWindow;
GetClientRect(rectWindow);
CSize sizeImage(m_Image.GetWidth(), m_Image.GetHeight());
CRect rectShow;
rectShow = RectSizeWithConstantRatio(&rectWindow, sizeImage, TRUE);
SetStretchBltMode(pDC->m_hDC, HALFTONE);
m_Image.Draw(pDC->m_hDC, rectShow);
//m_Image.Draw(pDC->m_hDC, 0, 0,rectWindow.Width(),rectWindow.Height());
//CString str;
//str.Format("%d", rectWindow.Width());
//AfxMessageBox(str);
//str.Format("%d", rectWindow.Height());
//AfxMessageBox(str);
//SetStretchBltMode(pDC->m_hDC, HALFTONE);
//m_Image.StretchBlt(pDC->m_hDC, 0,0,rectWindow.Width(),rectWindow.Height(),SRCCOPY);
}
CRect CExImageView::RectSizeWithConstantRatio(CRect* rcScreen,CSize sizePicture,BOOL bCenter)
{
CRect rect(rcScreen);
double dWidth = rcScreen->Width();
double dHeight = rcScreen->Height();
double dAspectRatio = dWidth/dHeight;
double dPictureWidth = sizePicture.cx;
double dPictureHeight = sizePicture.cy;
double dPictureAspectRatio = dPictureWidth/dPictureHeight;
//If the aspect ratios are same then the screen rectangle
// will do, otherwise we need to calculate the new rectangle
if (dPictureAspectRatio > dAspectRatio)
{
int nNewHeight = (int)(dWidth/dPictureWidth*dPictureHeight);
int nCenteringFactor = (rcScreen->Height() - nNewHeight) / 2;
rect.SetRect( 0,
nCenteringFactor,
(int)dWidth,
nNewHeight + nCenteringFactor);
}
else if (dPictureAspectRatio < dAspectRatio)
{
int nNewWidth = (int)(dHeight/dPictureHeight*dPictureWidth);
int nCenteringFactor = (rcScreen->Width() - nNewWidth) / 2;
rect.SetRect( nCenteringFactor,
0,
nNewWidth + nCenteringFactor,
(int)(dHeight));
}
return rect;
}