Gtk 描画領域は、スクロールされたウィンドウ内では常にレンダリングされるとは限りません。

Gtk 描画領域は、スクロールされたウィンドウ内では常にレンダリングされるとは限りません。

スクロール ウィンドウ内のビューポート内に描画領域があります。描画領域がスクロール ウィンドウ内に収まると、画像は適切にレンダリングされます。しかし、スクロール ウィンドウよりも大きいサイズを要求すると、上下にスクロールしたときに描画領域が再描画されないことがあります。親ウィンドウのサイズを変更した場合も同じことが起こります。スクロール ウィンドウ内に適切なサイズの領域が取得されますが、描画領域が存在しないか、描画領域に何も描画されていないように見えます。スクロール バーのランダムな位置で正しい描画が点滅することがあります。呼び出されるたびに "render" を出力する描画信号へのコールバックと、スクロールされるたびに画面に "adj" を出力するスクロール バーの調整値変更信号への別のコールバックを接続しました。ターミナル出力は次のようになります。

adj
adj
adj
adj
adj
1428919598 render
adj
adj
adj

そのため、adj が表示されるたびにキャンバスは空白に見えますが、<...> render が表示されると正しく描画されます。そのため、高速スクロールすると画像がちらつきます。原因は何でしょうか?

答え1

私はいくつかのコードを gtk2 から gtk3 に移植していました。問題は、現在「expose-event」に代わる新しいシグナル「draw」にあることが判明しました。古いバージョンでは、シグナル ハンドラでコンテキストを作成する必要がありましたが、新しいコールバックではそれが引数の 1 つとして含まれており、それが使用される必要があります。

関連情報