打印时StretchBlt失败

时间:2009-01-22 16:57:52

标签: winapi printing gdi

我有一个图表(以位图格式),我正在尝试使用StretchBlt呈现给打印机。绘制到屏幕时,StretchBlt工作正常。当绘制到CutePDF打印机时,它返回0,将最后一个错误设置为ERROR_INVALID_HANDLE,并且无论如何都能正常工作。当绘制到PDF995打印机或物理HP打印机时,它返回0,将最后一个错误设置为ERROR_INVALID_HANDLE,并且无法绘制任何内容。

导致StretchBlt某些设备失败的原因是什么?我已经通过调用StretchBlt验证了源位图是DIB并且目标支持GetDeviceCaps

这是我的代码,如果它是相关的:(它是用C ++ Builder编写的,所以它使用Delphi的VCL; 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 个答案:

答案 0 :(得分:3)

StretchBlt在某些打印机驱动程序上被破坏(PDF995是值得注意的例子)。

我曾经在Windows 2003 Server上遇到过这种错误(它在XP上运行)。

尝试在其他操作系统上重现该问题,并且它没有,请考虑特定于操作系统并在此操作系统上使用StretchDIBits