C#のWinFormsで直線を点滅させる。2

C# コンピュータ
C#

タイマーでDashPatternを変更しています。

namespace BlinkLine2;

using System.Drawing.Drawing2D;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        // 点滅フラグ
        bool blinkFlag = false;

        this.ClientSize = new Size(400, 400);

        // ペンを生成
        Pen pen1 = new (Brushes.Black, 2.0f)
        {
            DashStyle = DashStyle.Custom,
        };
        float[] dashPattern1 = new float[] {2.0F, 2.0F, 3.0F, 1.0F};
        float[] dashPattern2 = new float[] {3.0F, 1.0F, 2.0F, 2.0F};

        // グラフィックパスを生成
        GraphicsPath path1 = new();
        // 四角形を追加
        path1.AddRectangle(new Rectangle(50, 50, 300, 300));

        // タイマーオブジェクトの生成と初期化
        if (this.components == null) return;
        var timer = new System.Windows.Forms.Timer(this.components)
        {
            Interval = 200,
        };

        // ピクチャボックスの生成と登録
        var picbox = new PictureBox
        {
            Size = this.ClientSize,
        };
        this.Controls.Add(picbox);

        // ロードイベントでタイマースタート
        this.Load += (s, e) => timer.Start();
        
        // タイマーイベント・ピクチャボックス再描画
        timer.Tick += (s, e) => picbox.Invalidate();

        // ピクチャボックスのペイントイベント
        picbox.Paint += (s, e) =>
        {
            // クリア
            e.Graphics.Clear(picbox.BackColor);

            // パスを描画
            if (pen1.DashStyle == DashStyle.Custom)
            {
                // 点滅フラグを反転
                blinkFlag = !blinkFlag;
                pen1.DashPattern = blinkFlag ? dashPattern1 : dashPattern2;
            }
            e.Graphics.DrawPath(pen1, path1);
        };

        // クローズイベントでタイマー終了
        this.Closed += (s, e) => timer.Stop();
    }
}

コメント