2012-01-25 10 views
0

Canvasで呼び出されたControl.redraw(int, int, int, int, boolean)メソッドに関する次の問題が発生しました。私はダイアグラムエディタで作業しています。最近私は選択ツールを実装しました。これは図の四角い枠を示しています。問題は、マウスの助けを借りてこの選択ツールのサイズをすばやく変更すると、画面にアーティファクトが表示されることです。しかし、ツールのサイズをゆっくりと変更すると、すべてが正しく再描画されます。SWT再描画コマンドがスキップされて、画面にアーチファクトが表示されるようです。

SWT言語では、次のようになります。

マウスを使用して選択矩形のサイズを変更するたびに、最終的に対応する矩形領域を再描画するように指定するredrawメソッドを呼び出します。それから私はPaintEventをキャッチし、フレームをペイントします。マウスの動きが遅い場合、すべてが期待どおりに機能します。

質問は、描画イベントをスキップするか、再描画コマンドをスキップすることができますか?誰も似たような問題で遭遇しましたか?多分、設定すべきフラグがありますか?

私はsetRedraw(true)にしようとしましたが、何の効果もありませんでした。最後に、redraw(int, int, int, int, boolean)メソッドをredraw()に置き換えようとしましたが、アーティファクトが消えましたが、これは選択ツールのサイズ変更時に、特にWindows上で賢明な遅れが生じたため、許容できない解決策でした。

おかげ

答えて

1

あなたが再描画するためにすべての単一の呼び出しがペイントイベントと一致するかどうかを尋ねている場合、その答えはノーです。 OSがいくつかの再描画要求を1つのペイントイベントにマージすることを決定する可能性があります(それにもかかわらず、すべての元の要求の領域をカバーする必要があります)。ペイントリクエストは、update()メソッドを使用してトリガーできます。redraw()は、領域を無効にして再描画のマークを付けるだけで、再描画を明示的にはトリガーしません。

OSには再ペイントにいくつかの問題がある可能性がありますが、ペイントコード/再描画アルゴリズムに問題がある可能性は非常に高いです。

+0

あなたは正しいです。私の座標にはいくつかの問題があります。おそらく、アフィン変換が正しくない可能性があります。ありがとう。 –

+0

申し訳ありませんが、それは完全に私の間違いでした。 SWTは正常に動作します。更新する前に領域を再描画するための信号を送信することを忘れてしまった...選択ツールを更新した後でのみ行ったのですが。方程式とアフィン変換は絶対に正しいです。 –

関連する問題