Knowledge Base Nr: 00195 thumbnail.cpp - http://www.swe-kaiser.de

Downloads:

MFC: thumbnailfunktion für bitmaps

  
// bild neu scalieren und einpassen in fenster, hintergrund definiert setzen.
//aspect ratio wird beibehalten. die CImageSupport-klasse ist bestandteil meiner basisklassen.

//Aufrufbeispiel:
//(IDC_FRAME ist ein Picture-Control vom Type Frame in einem Dialog.)
int nError = m_img.ShowThumbnail(GetDlgItem(IDC_FRAME), lpszFilename, RGB(50,50,50));

//bild neu skalieren
int CImageSupport::MakeThumbnail(int& nSizeX, int& nSizeY, int& nXoffset, int& nYoffset)
{
//aspekt ratio beibehalten und zentrieren
nXoffset = nSizeX;
nYoffset = nSizeY;

int x = GetSizeX();
int y = GetSizeY();
int nX = nSizeX;
int nY = nSizeY;

if (x>y) //quer
{
nSizeY = (int)((1.0*y / x) * nX);
nXoffset = 0;
nYoffset = (nYoffset - nSizeY) / 2;

if (nSizeY > nY) //sonderfall
{
nSizeY = nY;
nSizeX = (int)((1.0*x / y) * nY);
nXoffset = (nX - nSizeX) / 2;
nYoffset = 0;
}
}
else //hoch
{
nSizeX = (int)((1.0*x / y) * nY);
nXoffset = (nXoffset - nSizeX) / 2;
nYoffset = 0;

if (nSizeX > nX) //sonderfall
{
nSizeX = nX;
nSizeY = (int)((1.0*y / x) * nX);
nXoffset = 0;
nYoffset = (nY - nSizeY) / 2;
}
}

int nErr = Resize(nSizeX, nSizeY);
return nErr;
}

//bild neu skalieren und einpassen in fenster, hintergrund definiert setzen
int CImageSupport::ShowThumbnail(CWnd* pWnd, const char* lpszFilename, COLORREF crefBackground)
{
if (!pWnd)
return IS_NODC;

//fenstergröße ermitteln
CDC* pDC = pWnd->GetDC();
if (!pDC)
return IS_NODC;

RECT rect;
pWnd->GetClientRect(&rect);

//hintergrund setzen
pDC->FillSolidRect(&rect, crefBackground);

//temporäre kopie laden
CImageSupport img;

int nErr = 0;

if ((lpszFilename != NULL) && (lpszFilename[0]!=0))
{
nErr = img.Load(lpszFilename);
if (nErr != IS_OK)
{
pWnd->ReleaseDC(pDC);
return nErr;
}
}
else
{
img.CloneFrom(this);
}

//neue größe berechnen...
int nOrgWidth = img.GetSizeX();
int nOrgHeight = img.GetSizeY();
int nActPrevWidth = rect.right;
int nActPrevHeight = rect.bottom;

int nPrevPosX, nPrevPosY;

nErr = img.MakeThumbnail(nActPrevWidth, nActPrevHeight, nPrevPosX, nPrevPosY); //ändert alle werte!

//... und anzeigen
if (nErr == IS_OK)
nErr = img.Draw(pDC->GetSafeHdc(), 0,0, nActPrevWidth, nActPrevHeight, nPrevPosX, nPrevPosY);

pWnd->ReleaseDC(pDC);
return nErr;
}