У меня есть диаграмма (в растровом формате), которую я пытаюсь отобразить на принтере, используя 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);
}
}