2

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

什么会导致StretchBlt某些设备出现故障?我已经验证了源位图是一个 DIB 并且目标支持StretchBlt通过调用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);
  }
}
4

1 回答 1

5

StretchBlt在某些打印机驱动程序上损坏(PDF995 是一个显着的例子)。

我曾经遇到过这个错误只发生在 Windows 2003 Server 上(它在 XP 上工作)。

尝试在其他操作系统上重现该问题,但事实并非如此,将其视为特定于操作系统并StretchDIBits在此操作系统上使用。

于 2009-01-22T17:18:15.403 回答