2012-04-08 7 views
0

私のアプリケーションは外部ハードウェアからデータを受け取り、それをパネルにプロットします(実際には "コントロール"の他の子かもしれません)。ペイントは現在、 "OnPaint"コールバックで行われます。リストは最近受信したデータを格納するために使用され、OnPaint内のグラフ全体を再描画して、比率などを得ることができます。ウィンドウのサイズが変更されます。C++/CLI/Windows Formsで25 FPSでパネル上のグラフを更新するには?

グラフ自体は、2つのデータ点の間の線を使用してe->Graphics要素で描画されます。

これはうまくいきますが、50msごとに新しいデータが到着すると(グラフ全体を再描画)、すぐにグラフがちらつき始めます。より多くのデータをプロットする必要があるほど、ちらつきが強くなります(コントロールの右側に到達すると、データキャッシュがクリアされるので、グラフには最大限のデータポイント数が存在します)。

私のコードの主要な部分:私はちらつきを取り除くために絵を最適化する方法

void Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) 
{ 
    Size^ s = m_Control->Size; 
    Bitmap^ bmp = gcnew Bitmap(s->Width, s->Height); 
    Graphics^ g = Graphics::FromImage(bmp); 

    for each(double y in m_Data) 
    { 
     /* ...calculations etc... */ 
     g->DrawLine(Pens::Blue, recentX, recentY, currentX, currentY); 
    }   

    e->Graphics->DrawImageUnscaled(bmp, 0, 0); 
} 

任意の提案?前もって感謝します!

+2

フォームコンストラクターで、this-> DoubleBufferedプロパティーをtrueに設定します。簡単なピースの方法。 –

+0

@ハンス:はい、そうではありませんが、フォームの代わりにパネルに設定すべきではありませんか?そして、既存のコードはすでにダブルバッファされています... –

+0

パネル上の "DoubleBuffered"にアクセスしようとするとエラーが発生します。 @HansPassantそれはそれをより良くしたが、問題を解決しなかったありがとう、ありがとう。 – Niko

答えて

1

ちらつきは、ペイントハンドラを呼び出す前にWinFormsがバックグラウンドを消去したことに起因します。

Panelから継承した独自のカスタムコントロールを作成し、何もしないようにするにはOnPaintBackgroundを上書きする必要があります(特に、ベースクラスのバージョンを呼び出さないでください)。

+0

ありがとう、これはかなりうまくいきます。しかし、フォームのサイズが変更されると、バックグラウンドが再描画されなくなるため、奇妙なことが起こります。どのように私はその問題を解決することができますか? – Niko

+0

@ニコ:あなたが提供したコードから、コントロールのサイズのビットマップを作成し、最後のステップとしてコントロールにコピーしています。あなたが見ているゴミはそのビットマップから来ています。あるいは、フォームの背景自体が絵ではないと言っていますか?私はちょうどフォーム全体ではなく、Panel上で 'OnEraseBackground'を短絡することを提案しました。 –

+0

すばらしい、ありがとう!ビットマップの背景を白い色で塗りつぶすと、そのゴミの問題が解決されました。 – Niko

1

あなたのプラットフォームや言語とは独立して言えば、これは主にフレームレートの管理という方法を使用して解決される種類の問題です。

あなたはペイントメソッドを呼び出し、ペイントに費やされた時間を見積もります。今では、ステップ中にどれくらいの時間を費やしたのか、そしてあなたのリフレッシュ間隔がどれくらいの時間であるかを知ることができます。スレッドを(間隔 - 時間間隔)ミリ秒間スリープ状態にすることができます。

ところで、それは私の最初の答えであり、私はものを説明するのがひどいことを知っています。

関連する問題