سؤال

ولدي الرسم البياني (في شكل صورة نقطية) أن أحاول تقديم لطابعة باستخدام 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 بدلا من ذلك على نظام التشغيل هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top