Ich habe ein Diagramm (im Bitmap-Format), das ich versuche, auf einem Drucker zu rendern, indem ich StretchBlt
. Beim Zeichnen auf dem Bildschirm, StretchBlt
funktioniert gut. Beim Zeichnen auf einem CutePDF-Drucker wird 0 zurückgegeben, der letzte Fehler wird auf ERROR_INVALID_HANDLE
und funktioniert trotzdem. Beim Zeichnen auf einem PDF995-Drucker oder einem physischen HP-Drucker wird 0 zurückgegeben, der letzte Fehler wird auf ERROR_INVALID_HANDLE
und scheitert daran, etwas zu zeichnen.
Was würde dazu führen StretchBlt
für bestimmte Geräte ausfallen? Ich habe mich vergewissert, dass die Quell-Bitmap eine DIB ist und dass das Ziel folgende Funktionen unterstützt StretchBlt
durch den Aufruf GetDeviceCaps
.
Hier ist mein Code, falls es relevant ist: (Es ist in C++Builder geschrieben, so dass es Delphi's VCL verwendet; TCanvas wickelt ein HDC, und TBitmap wickelt ein HBITMAP. VCL bietet seine eigene StretchDraw
Funktion, die HALFTONE nicht unterstützt; ich habe damit die gleichen Probleme).
void PrettyStretchDraw(TCanvas *dest, const TRect& rect, TGraphic *source)
{
if (dynamic_cast<Graphics::TBitmap*>(source) && !source->Transparent) {
POINT pt;
GetBrushOrgEx(dest->Handle, &pt);
SetStretchBltMode(dest->Handle, HALFTONE);
SetBrushOrgEx(dest->Handle, pt.x, pt.y, NULL);
StretchBlt(
dest->Handle,
rect.Left,
rect.Top,
rect.Width(),
rect.Height(),
dynamic_cast<Graphics::TBitmap*>(source)->Canvas->Handle,
0,
0,
source->Width,
source->Height,
SRCCOPY);
} else {
DrawItSomeOtherWay(dest, rect, source);
}
}