0

破線の長方形をカスタムペイントしているときにGDI+で問題が発生しました。

ウィンドウサイズを大きくしたり、上下にスクロールしたりすると、破線の長方形の垂直部分が実線の実線で表示されます。マウスを速く動かすと、ソリッドセクションがますます少なくなります。不思議なことに、水平線はこの動作を示さず、期待どおりに表示されます。

これまでのところ、2つの最適でない解決策は、との間に設定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);
                }
            }
        }
    }
}
4

1 に答える 1

1

2 つの問題があると思います。ウィンドウの端に四角形が正しく描画されていない領域があるようです。長方形を互いに重ねて描いているため、ダッシュが正しく機能しません。

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);
   }
于 2009-04-17T04:34:31.720 に答える