我有一个 Gtk::DrawingArea,它位于 Gtk::ScrolledWindow 内。我正在尝试将 DrawingArea 保存到文件中,因此我在 DrawingArea signal_draw() 的处理程序中执行以下操作:
Cairo::RefPtr<Cairo::Surface> surf = context -> get_target();
surf -> write_to_png("image");
但这只会保存当前在 ScrolledWindow 中可见的绘图区域的一部分。如何保存完整图像,包括当前不可见的部分?
此外,我只能在 signal_draw 的处理程序中执行此操作,因为我可以获得 Cairo::Context。是否可以在其他任何地方获得此上下文?
编辑:
感谢 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) 来保持它们同步了吗?