У меня возникла проблема с GDI +, когда пользовательские рисовали пунктирные прямоугольники.
Вертикальная часть пунктирных прямоугольников отображается в виде сплошных непрерывных линий при увеличении размера окна или при прокрутке вверх / вниз. Более быстрое перемещение мыши приводит к меньшему количеству сплошных участков. Любопытно, что горизонтальные линии не демонстрируют это поведение и выглядят как ожидалось.
До сих пор было два неоптимальных решения: установить ResizeRedraw = true
или вызвать Invalidate()
во время OnResize()
и OnScroll()
. Я, конечно, хотел бы избежать этого, поскольку то, что я на самом деле рисую, является более сложным, и эти медленные вызовы разрушают текучее впечатление. Я также пытался аннулировать только недавно показанную область, но безрезультатно - кажется, что работает только полный Invalidate.
Есть какие-нибудь указатели о том, как это решить?
Демонстрационный код:
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);
}
}
}
}
}