فشل StretchBlt عند الطباعة
سؤال
ولدي الرسم البياني (في شكل صورة نقطية) أن أحاول تقديم لطابعة باستخدام StretchBlt
. عند رسم على الشاشة، StretchBlt
يعمل بشكل جيد. عند رسم إلى طابعة CutePDF، فإنها ترجع 0، يحدد الخطأ الأخير إلى ERROR_INVALID_HANDLE
، ويعمل على أي حال. عندما تقترب من pdf995 طابعه أو طابعة HP المادية، فإنها ترجع 0، يحدد الخطأ الأخير إلى ERROR_INVALID_HANDLE
، ويفشل في رسم أي شيء.
وماذا يسبب StretchBlt
فشل لأجهزة معينة؟ لقد التحقق من الصورة النقطية مصدر هو بنك دبي الإسلامي وأن الوجهة تدعم StretchBlt
بالدعوة GetDeviceCaps
.
وهنا قانون بلدي، في حال انها ذات الصلة: (هو مكتوب في C + + منشئ، لذلك يستخدم VCL دلفي، TCanvas يلتف على HDC، وTBitmap يلتف على HBITMAP يوفر 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);
}
}
المحلول
ويتم تقسيم StretchBlt
على بعض برامج تشغيل الطابعة (PDF995 هو مثال بارز).
وأنا مرة واحدة encontered هذا الخطأ يحدث على نظام التشغيل Windows 2003 Server فقط (لأنها عملت على XP).
وحاول إعادة إنشاء المشكلة على نظام التشغيل الأخرى، وأنه لم يحدث ذلك، تنظر فيه OS محددة واستخدام StretchDIBits
بدلا من ذلك على نظام التشغيل هذا.