私はカスタムのスクロール可能なテキスト領域を作成しようとしています。私はGrid
の中にDrawingArea
とScrollBar
を作成しました。私は、DrawingArea
のイベントをScrollBar
の値を単に見て、Pango.Layout
を描画する前にCairo.Context
を適切に動かす方法をthis.on_draw
の方法に付けました。Gtk - 間違ったウィジェットに対して描画イベントが発生し、再描画されないウィジェット
最初の問題はScrollBar
でイベントを登録していなくてもScrollBar
に触れるたびにthis.on_draw
が呼び出されることです。どうすればこれを防ぐことができますか?
第二の問題は、this.on_draw
が起動されていてもScrollBar
値が0
または100
(100調整の上限値)付近にある場合を除き、Context
に加えた変更が表示されないことです。なぜこうなった?
私はDrawingArea
のqueue_redraw
を呼び出す方法にScrollBar
のvalue_changed
イベントをconnect
た場合、それはthis.on_draw
を起動し、それの後にそれを正しく表示するであろうことを知りました。しかし、第2の問題のために、私はthis.on_draw
が不必要に何回も呼び出されていると思います。それで、これを達成する「正しい」方法は何ですか?
using Cairo;
using Gdk;
using Gtk;
using Pango;
public class Texter : Gtk.Window {
private Gtk.DrawingArea darea;
private Gtk.Scrollbar scroll;
private string text = "Hello\nWorld!";
public Texter() {
GLib.Object (type: Gtk.WindowType.TOPLEVEL);
Gtk.Grid grid = new Gtk.Grid();
this.add (grid);
var drawing_area = new Gtk.DrawingArea();
drawing_area.set_size_request (200, 200);
drawing_area.expand = true;
drawing_area.draw.connect (this.on_draw);
grid.attach (drawing_area, 0, 0);
var scrollbar = new Gtk.Scrollbar (Gtk.Orientation.VERTICAL,
new Gtk.Adjustment(0, 0, 100, 0, 0, 1));
grid.attach (scrollbar, 1, 0);
this.darea = drawing_area;
this.scroll = scrollbar;
this.destroy.connect (Gtk.main_quit);
}
private bool on_draw (Gtk.Widget sender, Cairo.Context ctx) {
ctx.set_source_rgb (0.9, 0.9, 0.9);
ctx.paint();
var y_offset = this.scroll.get_value();
stdout.printf("%f\n", y_offset);
ctx.set_source_rgb (0.25, 0.25, 0.25);
ctx.move_to(0, 100 - y_offset);
var layout = Pango.cairo_create_layout(ctx);
layout.set_font_description(Pango.FontDescription.from_string("Sans 12"));
layout.set_auto_dir(false);
layout.set_text(this.text, this.text.length);
Pango.cairo_show_layout(ctx, layout);
return false;
}
static int main (string[] args) {
Gtk.init (ref args);
var window = new Texter();
window.show_all();
Gtk.main();
return 0;
}
}
また、上記のコードで見つかった場合は、(関連性のない)間違いを指摘してください。
これはどのバージョンのGTK +ですか?最初の問題はオーバーレイスクロールバーに起因すると思われますが、これはオーバーレイスクロールバーを持つGTK +を使用しているかどうかによって異なります。 – andlabs
@andlabs '--pkg gtk + -3.0'オプションでコンパイルし、インストールされたgtk3のバージョンは' 3.22'です。 「オーバーレイスクロールバー」とは、その上にマウスを置いたときに拡大するものを意味する場合、少なくとも視覚的にはそうではありませんでした。それは通常の古い3.0スクロールバーのように "見た目"です。 http://imgur.com/a/NpCui(ただし、それをホバリングしても、再描画イベントが発生したため、1つの動作をしました)どうすればその動作を無効にできますか? – John