2013-03-06 49 views
0

我有一个显示音频文件波形的自定义用户控件。我在窗体上放置了两个控件实例。第二种情况按预期工作,而第一种情况导致所述问题。只有当窗口移动时,用户控制重绘

我正在做的是绘制垂直(红色)线,表示当前位置。这个问题最好在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方法是等效对于两个控件,为什么我需要移动窗口来重新绘制第一个控件(波形)?

+0

问题是...? – Nolonar 2013-03-06 12:51:31

+0

winform或WPF? – David 2013-03-06 12:51:48

+0

Winforms。忘了提及它。还更新了这篇文章 - 问题在最后。 – 2013-03-06 12:53:02

回答

1

OnPaint的问题在于,只有在必要时才会调用它,例如,当窗口被移动,调整大小,从最小化状态恢复后,或者当另一个窗口移动到顶部时,它才会被调用。

为了定期重新绘制窗口(或其中的一部分),您需要在窗体中添加Timer并执行Tick事件。

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

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