2009-01-22 102 views
1

我有一张图表(位图格式),我试图使用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); 
    } 
} 

回答

3

StretchBlt是在某些打印机驱动程序(PDF995是明显的例子)打破。

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

尝试在其他操作系统上重现此问题,但它不会,请考虑它是操作系统特定的,并在此操作系统上使用StretchDIBits

+0

StretchDIBits的作品,和http://www.codeproject.com/KB/printing/printingtricksandtips.aspx提供的代码来创建一个DIB从GDI位图传递给StretchDIBits。谢谢! – 2009-01-22 19:29:46