{ println!("Err: {}.", e); return; } Ok(p) => p }; DrawingAreaへの描画は、connect_draw()を使って、クロージャを登録する。 " />
るいもの戯れ言
#129
2017/01/13 02:54

GTK+のRustバインディングである、gtk-rsを研究中。

アプリケーションから自由に描画するには、DrawingAreaという部品を使うようだ。ここにイメージを表示する方法を調査。

まず画像ファイルを読むには、Pixbufを使うのが良いようだ。


let pix = match Pixbuf::new_from_file("images/moomoo.jpg") {
    Err(e) => {
        println!("Err: {}.", e);
        return;
    }
    Ok(p) => p
};

DrawingAreaへの描画は、connect_draw()を使って、クロージャを登録する。


drawingArea.connect_draw(move |widget, context| {
...
});

このcontextが、cairo::Contextなので、これを利用して描画すれば良いのだが、APIを見た感じ、pixbufを描画するメソッドが見つからない。

途方に暮れていたら、gdk::prelude::ContextExtを見つけた。Rustのtraitは非侵入的に拡張できてしまうので、普通にAPIを眺めていてもダメで、APIサイトの検索で探さないとダメだ。


extern crate gdk;
use gtk::prelude::*;
...
drawingArea.connect_draw(move |widget, context| {
    context.set_source_pixbuf(&ws.pix, 0f64, 0f64);
    context.paint();
    return Inhibit(false);
});

できた。

サンプルコード全体は、GitHubに置いておいた。