0

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

我正在做的是绘制一条垂直(红色)线,指示当前位置。这个问题最好在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);
}

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

4

1 回答 1

1

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

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

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

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

于 2013-03-06T13:03:54.757 回答