سؤال

أنا واجهت مشكلة غريبة عند استخدام Graphics.DrawImage.

عند استخدام e.Graphics.DrawImage(Image, Point) في OnPaint أن ترسم صورة نقطية 'المخزن' على السيطرة ، يبدو أن أجزاء من الصورة يتم حذف.المخزن المؤقت بالسكان في بنفس الطريقة التي توجه مباشرة على Bitmap باستخدام Graphics شيدت من ذلك.عندما تحكم الدهانات ذاكرة التخزين المؤقت نقطية يتم رسمها على السيطرة.

لا شيء يبدو أن حذف الصورة النقطية في حد ذاته ، لأنه عندما أنقذ النقطية إلى القرص وفحصه ، كان كل شيء هناك.(انظر الصور أدناه)

هذا هو ما نقطية العازلة تبدو مثل:
buffer
(المصدر: zachjohnson.net)

هذا ما يظهر على التحكم:
displayed value
(المصدر: zachjohnson.net)

هذا هو كل شيء أقوم به في OnPaint:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    if (this.bufferInvalid)
    {
        this.UpdateBuffer();
    }

    if (this.buffer != null)
    {
        e.Graphics.DrawImage(this.buffer, Point.Empty);
    }
}
هل كانت مفيدة؟

المحلول

وعندما يتم استدعاء OnPaint، وقد ويندوز منطقة غير صالحة أنه يتيح اللوحة إلى، ويتم قص كل شيء آخر. عندما تريد أن يتم تحديث عنصر تحكم مستطيلة، يجب عليك الاتصال InvalidateRect في API Windows للتأكد من المستطيل كله هو جزء من منطقة غير صالحة. OnPaint سوف يطلق تلقائيا كلما كان هناك أي جزء من السيطرة غير صالحة.

نصائح أخرى

قد تتمكن من محاولة بضعة أشياء مختلفة.

  • إضافة رمز إلى "UpdateBuffer"
  • هل صورة نقطية.حفظ (أيالعازلة.حفظ) بعد updatebuffer الدعوة و تحقق ما نقطية يبدو.
  • التأكد من أن كافة عناصر التحكم التي تم رسمها الأولى و التي لا ضوابط يجري وضع شفافة الخ..
  • اتخاذ قانون "onpaint" و "التحديث العازلة" ووضعها في مشروع منفصل اختبار لمعرفة ما إذا كان يعمل.
  • إخراج "القاعدة.onpaint" وتحقق ما يحدث
  • محاولة دعوة إلى صورة نقطية.drawimageunscaled بدلا من الصورة النقطية.drawimage
  • حاول استخدام النقطة(0,0) بدلا من النقطة.فارغة (loooong النار ولكن كذلك لا تعرف أبدا...)

طن من خيارات التصحيح هذا مجرد مسألة تضييق عليه.

وتحقق من System.Windows.Forms.ControlStyles.ResizeRedraw

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