2011-12-20 18 views
1

私は画面にルーラーを表示するプログラムを持っており、Xlibはカーソル位置を100msごとにポーリングして更新ディスプレイ。ディスプレイは数字/行などで構成されています。特に、カーソルの位置を示す行(これが更新される理由です)。カーソルで移動する線を描画する必要がありますが、100msごとにウィンドウ全体を再描画しないようにしたい

問題は、古い行を消去し、その下のコンテンツを復元する必要があるため、位置の変更を反映するためにウィンドウ全体を再描画する必要があるということです。これを10回行うと、非常にちらつきのあるプログラムになります。

私はカーソルが(すなわち定規の範囲内で)インジケータラインを変更する立場にあることを確認した後、私はのみ定規を再描画可能性がありますが、それだったとき、それはまだかなり悪いちらつくう更新する。

GTKとXlibの両方にnoobを並べ、すべてのアドバイスをいただければ幸いです。

コードはhttps://github.com/zjmichen/zRuler

+0

あなたはgtk-demos app、いくつかの手書きの例をチェックしてください。 – erick2red

答えて

2

さてあなたは、カーソルが実装されていた時に直面する最も初期の問題の一つに到着したのです!カーソルの変更は非常に頻繁で、毎回フルウィンドウを再描画するだけで意味がありません!あなたの問題に来て、必要なものを見てください。&あなたは何をしているのですか?カーソルが動いたときにフルウィンドウを更新する必要がありますか?いいえ。ウィンドウの一部のみを更新する必要があるので、ウィンドウ全体を更新しないでください。上から、私はフリッカーを減らす2つの方法を考えることができます:
1.簡単な方法はGdkCursorを使用することです。 pixmap(開発者ページに用意されているサンプル)から新しいカーソルを作成します。アプリケーションのメインウィンドウのGdkWindowのカーソルをAssociateに置き換えます。この方法では、カーソルを追跡する必要はありません&行を描画します。カーソル自体は行として表示されます(したがって、&を再描画することについては気にしないでください)。今度は、完全なウィンドウを再描画するタイマーコールバックで、カーソル位置の変更時に更新する必要があるコンポーネントのみを再描画します。これにより、すべてのコンポーネントを描画していないので、ちらつきを減らすことができます。
2. GdkCursorを使用しない場合は、カーソルの専用アプリケーションウィンドウの上に別の透明なウィンドウを作成することができます。この方法では、カーソルウィンドウの変更時に更新されるアプリケーションウィンドウ内のコンポーネントであるカーソルウィンドウ&のみを更新できます。この方法では、アプリケーションウィンドウ内の他のコンポーネントは再描画されません。毎回&これはうまくいけばフリッカーを減らすことができるはずです。
これが役立つことを願っています!

+0

返信いただきありがとうございます! 私はGdkCursorを正しく理解しているかどうかは分かりません。標準の矢印を単に別のピクスマップに置き換えただけで、カーソルがウィンドウの外に出たときに助けにならないと思いました。あなたの言うことから、カーソルがウィンドウの上にあってもウィンドウに表示されるように聞こえます。これは正しいですか? 問題は、カーソルがルーラーの上にあっても、ルーラーの端の間であっても更新するにはポジションラインが必要です。 私は方法2のようなものも考えていましたが、もっと単純な方法があれば正直言ってその問題には向かないでしょう。 –

+0

はい、あなたは正しいです。ウィンドウ内のカーソルを置き換えます。私はカーソルがアプリケーションウィンドウの外にあってもラインを更新する必要があることに気づいていませんでした。その場合、2番目の方法がうまくいくはずです。私が何か良いことを考えているか、他の誰かがより良い選択肢を提供できるかどうかを見てみましょう。がんばろう! –

関連する問題