Пунктирные прямоугольники отображаются сплошными при раскрытии окна 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