C
Ein BitBlt oder StretchBlt geht immer nur in einen "echten" DC oder in eine kompatible Bitmap. Es muss also eine solche verwendet werden um den Stretch zu machen. Von der BMP kann man dann einen beliebeigen Auschnitt ins HDC kopieren.
Hier mal mein Code
/*
Einen Bitmapausschnitt in ein CPaintDC beliebig gestretcht/gestaucht zeichnen.
hdc=Ausgabegerät
Bitmap=eine geladene Bitmap
xStart/yStart=x/y-Koordinate der Ausgabe im Ziel
br,ho=Breite/Höhe in die die Bitmap gestrecht/gestaucht wird
int cx, cy=Größe des Ausgabegerätes
*/
void DrawBitmap(CPaintDC *hdc, CBitmap *Bitmap, int xStart,
int yStart, int br, int ho, BOOL stretch, int cx, int cy)
{
BITMAP bm; //eine Bitmap-Info Struktur
// Speicherkontexte
CDC *dcmem=new CDC; //Speicherkontext für
CDC *dc=new CDC();
CBitmap *bmp=new CBitmap;
//Informationen über die übergebene Bitmap auslesen
Bitmap->GetObject( sizeof(BITMAP), (LPVOID)&bm); //in BM sichern
dcmem->CreateCompatibleDC(hdc);
dcmem->SelectObject( Bitmap); //Bitmap selektieren
dcmem->SetMapMode( hdc->GetMapMode()); //selbes Mapping wie in der Basis einstellen
// BitMap mit stretch in neuen Context
bmp->CreateCompatibleBitmap(dcmem,ho,br);
dc->CreateCompatibleDC(hdc);
dc->SelectObject( bmp ); //selektieren
dc->SetStretchBltMode(HALFTONE);
dc->StretchBlt(0,0,ho,br, dcmem,0,0,bm.bmWidth, bm.bmHeight,SRCCOPY);
hdc->SelectObject(dc);
// Begrenzt auf Control Groesse (cx,cy)
hdc->BitBlt(0,0,cx,cy,dc,0,0,SRCCOPY);
dc->DeleteDC();
dcmem->DeleteDC();
delete dc;
delete dcmem;
delete bmp;
}
Funktioniert recht gut bei mir, kann aber sicher noch verbessert werden...
Hab dank und Gruss