2 Stimmen

StretchBlt schlägt beim Drucken fehl

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);
  }
}

5voto

Quassnoi Punkte 396418

StretchBlt ist bei einigen Druckertreibern defekt (PDF995 ist ein bemerkenswertes Beispiel).

Ich habe diesen Fehler einmal nur unter Windows 2003 Server festgestellt (unter XP funktionierte er).

Versuchen Sie, das Problem auf anderen Betriebssystemen zu reproduzieren, und wenn dies nicht gelingt, betrachten Sie es als betriebssystemspezifisch und verwenden Sie StretchDIBits stattdessen auf diesem Betriebssystem.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X