2

を使用してプリンターにレンダリングしようとしているグラフ (ビットマップ形式) がありますStretchBlt。画面に描画すると、正常にStretchBlt動作します。CutePDF プリンターに描画すると、0 が返され、最後のエラーが に設定されERROR_INVALID_HANDLE、とにかく動作します。PDF995 プリンターまたは物理的な HP プリンターに描画すると、0 が返され、最後のエラーが に設定されERROR_INVALID_HANDLE、何も描画できません。

StretchBlt特定のデバイスで失敗する原因は何ですか? ソース ビットマップが DIB であり、宛先がStretchBltを呼び出してサポートしていることを確認しましたGetDeviceCaps

StretchDraw関連する場合に備えて、私のコードを次に示します (C++Builder で記述されているため、Delphi の VCL を使用します。TCanvas は HDC をラップし、TBitmap は HBITMAP をラップします。VCLは、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 で動作しました)。

他の OS で問題を再現してみてください。再現しない場合は、OS 固有のものと考えて、StretchDIBits代わりにこの OS を使用してください。

于 2009-01-22T17:18:15.403 に答える