0

オーディオ ファイルの波形を表示するカスタム ユーザー コントロールがあります。コントロールの 2 つのインスタンスをフォームに配置しました。2 番目のインスタンスは期待どおりに機能しますが、最初のインスタンスは前述の問題を引き起こします。

私がやっていることは、現在の位置を示す垂直 (赤) 線を描画することです。この問題は、YouTube ビデオで最もよく見られます。

これは私のカスタム コントローラーのコードです (OnPaint() - 赤い縦線の影響を受ける領域のみを無効にしていることに注意してください)。

protected override void OnPaint(PaintEventArgs e)
{
    [...]
    Invalidate(new Rectangle(x_pos-5, 0, x_pos, this.Height));
    using (Pen linePen = new Pen(Color.Red, 1.5f))
    {
        e.Graphics.DrawLine(linePen, x_pos, 0, x_pos, this.Height);
        Invalidate(new Rectangle(x_pos-2,0,x_pos+2,this.Height));
    }

    base.OnPaint(e);
}

Q: OnPaint メソッドは両方のコントロールで同等ですが、最初のコントロール (波形) を再描画するためにウィンドウを移動する必要があるのはなぜですか?

4

1 に答える 1

1

問題OnPaintは、ウィンドウが移動されたとき、サイズが変更されたとき、最小化された状態から戻った後、または別のウィンドウがその上に移動されたときなど、必要なときにのみ呼び出されることです。

Timerウィンドウ (またはその一部) を定期的に再描画するには、フォームに を追加し、そのTickイベントを実装する必要があります。

private void timer1_Tick(object sender, EventArgs e)
{
    this.Invalidate();
}

デフォルトでは、 (100 ミリ秒)Timer.Intervalに設定されています。100四角形を毎秒更新するだけの場合は、必要に応じてその値を増やすことができ1000ます。

于 2013-03-06T13:03:54.757 に答える