2017-04-04 20 views
0

私はカスタムユーザーコントロールを作成していますが、OnPaint()をオーバーライドすると、それは継続的に呼び出されません。
これは私のコードです:c#遅れなしにonpaintを連続して呼び出す方法

[ToolboxData("<{0}:ColoredProgressBar runat=server></{0}:ColoredPorgressBar>")] 
    public class ColoredProgressBar : ProgressBar 
    { 
     public Timer timer; 

     public ColoredProgressBar() 
     { 
      timer = new Timer(); 
      timer.Interval = 1000; 
      timer.Tick += new EventHandler(timer_Tick); 
      timer.Start(); 
      SetStyle(ControlStyles.DoubleBuffer, true); 
      SetStyle(ControlStyles.UserPaint, true); 
     } 
     public void timer_Tick(object sender , EventArgs e) 
     { 

     } 
     protected override void OnPaint(PaintEventArgs e) 
     { 
      base.OnPaint(e); 
      // Call methods of the System.Drawing.Graphics object. 
      e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), ClientRectangle); 
      Console.WriteLine("???"); 
     } 
    } 

私は10秒、メッセージを待っていた "???"私のコンソールに継続的に表示されるはずです バグは12メッセージだけが表示されます。私はInvalidate(true);を試しましたが、メッセージは連続的に表示されますが、フォームは非常に遅れています。

e.Graphics.DrawStringは非常に高価な方法ではありません。

どのようにしてOnPaint()をラグなく連続して呼び出すことができますか?

+0

さて、あなたは、そのコード内のどこかでウィンドウを再描画させているわけではありません。おそらく、 'this.Invalidate()'や 'this.Refresh()'のような 'timer_Tick()'の中で何かするべきでしょう... –

+0

この作品!たくさんありがとう!^_ ^ – Ben

答えて

1

コード内のすべてが正常に動作します。 WinFormsはWinApiとGDI +の上にあるフレームワークに過ぎないので、最初にWindows内部のメッセージポンプとそれが送信するメッセージについていくつかの知識を得る必要があります。hereを読むことができます。
ご覧のとおり、WinFormsがコントロールを再描画するために使用するWM_PAINTメッセージがあります。

すべてOnPaintイベントは、アプリケーションがWM_PAINTメッセージを受信した後に呼び出されます。あなたはもちろん、MSDNのページで述べたように、同期絵画ルーチンを強制されませんInvalidate()のようなメソッドを使用してこのメ​​ッセージを強制することができ、あなたはとして使用されるべき後Update()を呼び出す必要があります:

this.Invalidate(); 
this.Update(); 

それとも、直接することができますRefresh()メソッドを呼び出すと、コントロールの再描画とすべての子を強制的に再描画します。

関連する問題