代码之家  ›  专栏  ›  技术社区  ›  Josh Kelley

打印时StretchBlt失败

  •  1
  • Josh Kelley  · 技术社区  · 15 年前

    我有一个图表(位图格式),我正试图用 StretchBlt . 当绘制到屏幕上时, 拉伸切片机 工作良好。当绘制到CutePdf打印机时,它返回0,将最后一个错误设置为 ERROR_INVALID_HANDLE 不管怎样都可以。当绘制到PDF995打印机或物理HP打印机时,它返回0,将上一个错误设置为 错误\无效\句柄 没有画出任何东西。

    会导致什么 拉伸切片机 某些设备出现故障?我已经验证了源位图是DIB,并且目标支持 拉伸切片机 通过呼叫 GetDeviceCaps .

    这是我的代码,如果它是相关的:(它是用C++Builder编写的,所以它使用Delphi的VCL;TCANVAS包装一个HDC,并且TBITMAP封装了一个HbM映像。VCL提供自己的 StretchDraw 不支持半色调的功能;我也遇到同样的问题。)

    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 回复  |  直到 15 年前
        1
  •  3
  •   Quassnoi    15 年前

    StretchBlt 在某些打印机驱动程序上损坏(PDF995是显著的示例)。

    我曾经只在Windows2003服务器上遇到过这个错误(它在XP上工作)。

    试着在其他操作系统上重现这个问题,但它没有,认为它是操作系统特有的,并且使用 StretchDIBits 而是在这个操作系统上。