Unterschiedliches Verhalten bei StretchBlt() und BitBlt()
-
Hallo,
ich habe irgendwie ein kleines Verständnisproblem mit den Funktionen BitBlt() und StretchBlt().
Eigentlich sollten die sich doch identisch verhalten, außer das die StretchBlt() Funktion das Ergebnis ggf. verzerrt bzw. streckt.
Ich habe aber jetzt das Verhalten, dass die StretchBlt Funktion sich abhängig von der Größe des Ziels unterschiedlich verhält...Folgendes habe ich gemacht:
Ich habe eine Funktion, die mir einen Screenshot als .bmp auf die Platte speichert. Funktioniert wunderbar mit BitBlt():::BitBlt(hMemDCBitBlt, 0, 0, screenWidth, screenHeight, hdc, 0, 0,CAPTUREBLT | SRCCOPY);
, und auch mit StretchBlt wenn man es wie BitBlt() verwendet (also Ziel und Quelle gleich groß):
::StretchBlt(hMemDCStretchBlt, 0, 0, screenWidth, screenHeight, hdc, 0, 0, screenWidth, screenHeight, CAPTUREBLT | SRCCOPY);
Die Ergebnisse sind identisch.
Wenn ich jetzt aber die Zielgröße unterschiedlich zur Quellgröße mache, ist der im Bitmap gespeicherte sichtbare Bildschirminhalt nicht mehr gleich, es fehlen Fenster die Alpha-Transparenz verwenden (z.B. WinAMP oder Fenster, die mit Glass2K transparent gemacht wurden):
const int destWidth = screenWidth * 2; const int destHeight = destWidth; ::StretchBlt(hMemDCStretchBltReal, 0, 0, destWidth, destHeight, hdc, 0, 0, screenWidth, screenHeight, CAPTUREBLT | SRCCOPY);
Kann mir das jemand erklären, warum das so ist?
:edit
Ach so, bis auf den Austausch der obigen Zeilen ist die Funktion natürlich identischVielen Dank
-
Die Bitmap-Funktionen der WinApi sind etwas schwierig zu handhaben. Charles Petzold hat in seinem Buch zur Windows-Programmierung die Zusammenhänge ausführlich erklärt und liefert gebrauchsfähige mit.