用户控件仅在窗口移动时重新绘制

时间:2013-03-06 12:50:20

标签: c# winforms repaint invalidation

我有一个自定义用户控件,可以显示音频文件的波形。我在表单上放了两个控件实例。第二个实例按预期工作,而第一个实例导致提到的问题。

我正在做的是画一条垂直(红色)线,表示当前位置。问题最好见于youtube video

这是我的自定义控制器的代码(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);
}

问:由于OnPaint方法对于两个控件都是等效的,为什么我需要移动窗口重新绘制第一个控件(波形)?

1 个答案:

答案 0 :(得分:1)

OnPaint的问题在于它只在必要时被调用,例如当窗口被移动,调整大小,从最小化状态恢复后,或者在其上移动另一个窗口时。 / p>

为了定期重新绘制窗口(或部分窗口),您需要在表单中添加Timer并实施其Tick事件。

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

默认情况下,Timer.Interval设置为100(100毫秒)。如果您只想每秒更新一次矩形,可以根据需要将该值增加到1000