تظهر مستطيلات متقطع صلبة عند توسيع نافذة WinForm

StackOverflow https://stackoverflow.com/questions/758761

  •  09-09-2019
  •  | 
  •  

سؤال

أعاني من مشكلة مع GDI + أثناء طلاء مخصص مستطيلات متقطعة.

تظهر الجزء الرأسي من المستطيلات المتنقلة كخطوط صلبة مستمرة عند زيادة حجم النافذة أو عند التمرير لأعلى / لأسفل. نقل الماوس أسرع النتائج في الأقسام الصلبة أقل وأقل. من الغريب أن الخطوط الأفقية لا تظهر هذا السلوك وتظهر كما هو متوقع.

حتى الآن تم تعيين الحلول غير المثلى ResizeRedraw = true أو للاتصال Invalidate() خلال OnResize() و OnScroll(). وبعد كنت بالطبع مثل تجنب ذلك لأن ما أنا حقا رسم أكثر تعقيدا وهذه المكالمات البطيئة تدمر تجربة السوائل. لقد حاولت أيضا إبطال المنطقة المعرضة حديثا فقط دون جدوى - يبدو أن إبطال كامل فقط يعمل.

أي مؤشرات حول كيفية العمل هذا؟

الرمز التجريبي:

using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

public class Form1 : Form
{
    static void Main()
    {
        Application.Run(new Form1());
    }

    public Form1()
    {
        this.ClientSize = new System.Drawing.Size(472, 349);

        DoubleBuffered = true;
        //ResizeRedraw = true;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        int dimensions = 70;

        using ( Pen pen = new Pen(Color.Gray) )
        {
            pen.DashStyle = DashStyle.Dash;

            for ( int x = 0; x < 20; ++x )
            {
                for ( int y = 0; y < 20; ++y )
                {
                    Rectangle rect = new Rectangle(x * dimensions, y * dimensions, dimensions, dimensions);

                    e.Graphics.DrawRectangle(pen, rect);
                }
            }
        }
    }
}
هل كانت مفيدة؟

المحلول

أعتقد أن هناك مشكلتان: يبدو أن هناك منطقة على حافة النافذة حيث لا يتم رسم المستطيلات بشكل صحيح؛ وأنت ترسم المستطيلات فوق بعضها البعض، لذلك لن يعمل التحفيز بشكل صحيح.

استبدل حلقة OnPaint الخاصة بك بما يلي:

   for (int y = 0; y < Height; y += dimensions)
   {
       e.Graphics.DrawLine(pen, 0, y, Width, y);
   }
   for (int x = 0; x < Width; x += dimensions)
   {
       e.Graphics.DrawLine(pen, x, 0, x, Height);
   }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top