2

我有一个 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) 来保持它们同步了吗?

4

0 回答 0