2017-07-10 12 views
0

私はwinformにタイマーコントロールを追加しました(VS2017を使ってドラッグ&ドロップするだけです)。 このタイマーコントロールは、フォーム上で左から右に画像を移動します。有効になったとき。winformに流暢に画像を移動

private void timer1_Tick(object sender, EventArgs e) 
{ 
    int x = PictureBox1.Location.X + 1; 

    if (x < 400) 
     PixtureBox1.Location = new Point(x, 100); 
} 

問題は、この移動操作が流動的ではなく、その動きが不安定であることです。私はwinformに固執しなければならず、この不安定な動きについて何ができるのだろうか?

間隔を最小限にしようとした場合や、変位を大きくしようとしたが、揺れが続いた場合。

+0

どのような間隔を使用していますか? –

+0

Winformsでは、モニターの更新と同期できないため、流暢ではありません。場合によっては、浮動小数点数で追跡することもできますが、例は1ピクセルにつき1ピクセルしか移動しません。 - 揺れとちらつきの違いに注意してください。後者はダブルバッファリングによって無効になる可能性があります。 – TaW

+0

確かに、Winformsで少し難しい縫い目をしています。現在は、比較的滑らかで、間違いなく適切なスレッド遅延(確かではない)、またはティックタイムでのダイナミックな動きが良いかもしれません。そこに解決策を見つけることを望んでいましたが、それまでのすべての最適化では、それほど改善されていませんでした。解決策は不可能かもしれません。 – user3800527

答えて

0

アニメーションを行うには、OnPaint()メソッドを使用する必要があります。ここにはMSDN Documentationへのリンクがあります。 フレームレートの目標に対して発火するように設定されたタイマーを設定し、InvalidateRect()またはInvalidate(true)を呼び出してウィンドウ全体を再描画することができます。

フレームレートとは、アニメーションするコントロールの数を再描画する必要があることを意味します。フレームレートを30にしたい場合は、1000/30で1000ミリ秒= 1秒を計算します。

したがってtimer.Interval = 1000/30timer.Tick場合には、のOnPaint()イベントをトリガするInvalidate()を呼び出します。

+0

もう少し明確にして、記事を読んだことがありますが、フレームレートへの言及はなく、タイマーイベントをonpaintでどのように変更することができますか – user3800527

+0

@ user3800527いくつかの説明を含むように私の答えを編集しました。 –