Пунктирные прямоугольники отображаются сплошными при раскрытии окна Winform.
Вопрос
У меня возникла проблема с 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);
}