Gtk::ScrolledWindow 内に Gtk::DrawingArea があります。DrawingArea をファイルに保存しようとしているので、 DrawingArea signal_draw() の handler で次のことを行います。
Cairo::RefPtr<Cairo::Surface> surf = context -> get_target();
surf -> write_to_png("image");
ただし、これは現在 ScrolledWindow に表示されている描画領域の一部のみを保存します。現在表示されていない部分を含む画像全体を保存するにはどうすればよいですか?
また、Cairo::Context を取得できるため、signal_draw のハンドラーでのみこれを行うことができます。このコンテキストを他の場所で取得することは可能ですか?
編集:
andlabsのリンクのおかげで、私はそれを機能させました:
#include <gtkmm.h>
#include <cairomm/context.h>
#include <cairomm/enums.h>
bool draw(const Cairo::RefPtr<Cairo::Context>& c){
c->set_source_rgb(0,0,0);
c->rectangle(400,50,50,50);
c->fill();
return true;
}
int main(int argc, char* argv[]){
Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "my.test");
Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create();
builder -> add_from_file("gui.glade");
Gtk::DrawingArea* drawing;
Gtk::Window* win;
builder -> get_widget("window", win);
builder -> get_widget("drawing", drawing);
drawing->signal_draw().connect(sigc::ptr_fun(&draw));
Cairo::RefPtr<Cairo::Surface> surface;
surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32,500,300);
Cairo::RefPtr<Cairo::Context> c = Cairo::Context::create(surface);
draw(c);
surface->write_to_png("image");
app->run(*win);
}
DrawingArea のコンテキストを main() で作成されたコンテキストに設定できるので、同期を維持するために手動で draw(c) を呼び出す必要はありませんか?