我有一张图表(位图格式),我试图使用StretchBlt
来呈现给打印机。在画到屏幕时,StretchBlt
工作正常。在绘制到CutePDF打印机时,它返回0,将最后一个错误设置为ERROR_INVALID_HANDLE
,并且仍然可以工作。绘制到PDF995打印机或物理HP打印机时,返回0,将最后一个错误设置为ERROR_INVALID_HANDLE
,并且未能绘制任何内容。StretchBlt打印失败
什么会导致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);
}
}
StretchDIBits的作品,和http://www.codeproject.com/KB/printing/printingtricksandtips.aspx提供的代码来创建一个DIB从GDI位图传递给StretchDIBits。谢谢! – 2009-01-22 19:29:46