2013-03-06 48 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(如果需要)。