Сбой StretchBlt при печати - PullRequest
       12

Сбой StretchBlt при печати

1 голос
/ 22 января 2009

У меня есть диаграмма (в растровом формате), которую я пытаюсь отобразить на принтере, используя StretchBlt. При рисовании на экран StretchBlt работает нормально. При рисовании на принтере CutePDF он возвращает 0, устанавливает последнюю ошибку на ERROR_INVALID_HANDLE и работает в любом случае. При рисовании на принтере PDF995 или физическом принтере HP он возвращает 0, устанавливает последнюю ошибку на ERROR_INVALID_HANDLE и ничего не рисует.

Что может вызвать сбой StretchBlt для определенных устройств? Я проверил, что исходное растровое изображение является DIB и что пункт назначения поддерживает StretchBlt, вызвав GetDeviceCaps.

Вот мой код, на случай, если он уместен: (Он написан на C ++ Builder, поэтому он использует VCL Delphi; TCanvas оборачивает HDC, а TBitmap - HBITMAP. VCL предоставляет собственную StretchDraw функцию, которая не поддерживает HALFTONE; у меня такие же проблемы.)

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

1 Ответ

3 голосов
/ 22 января 2009

StretchBlt не работает в некоторых драйверах принтера (пример PDF995).

Однажды я обнаружил эту ошибку, возникающую только на Windows 2003 Server (она работала на XP).

Попробуйте воспроизвести проблему на других ОС, но это не так, считайте ее специфичной для ОС и используйте StretchDIBits вместо этой ОС.

...