を使用してプリンターにレンダリングしようとしているグラフ (ビットマップ形式) があります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);
}
}