gtkmm的gtk_widget_draw()替代方案

时间:2012-10-15 20:47:57

标签: c++ gtkmm gtk3

我正在寻找一种方法,将一些gtk小部件容器渲染到pixbuf,以便以后使用gtkmm3在drag'n'drop图标图像中使用。

正如我所研究的那样,在本机gtk3中执行此操作的正确方法是在所提供的cairo表面上使用gtk_widget_draw()。

创建这个表面不是问题,但是对gtk_widget_draw()本身的调用是。

只有在gtkmm-3.4.2源代码中直接提到的地方是Gtk :: Widget :: draw()函数(widget.cc:310),它被声明为“protected”。

所以我的问题是:如何在gtkmm3中正确执行这样的任务(将小部件渲染到pixbuf)?

此时我看到两个选项:

  • 子类Gtk :: Widget为受保护的draw()函数提供公共接口

  • 从Gtk :: Widget中提取gobj *实例,并在此实例上调用本机Gtk的gtk_widget_draw()。

问题是:哪种方式更可取,为什么?或者也许有其他[更好]的方法来做到这一点?

1 个答案:

答案 0 :(得分:2)

您可以使用GtkOffscreenWindowdocs收集小部件的pixbuf:

  

我们的想法是获取一个小部件并手动设置它的状态,然后添加它   到OffscreenWindow然后以Gdk :: Pixbuf检索快照。

和功能:

Glib::RefPtr<Gdk::Pixbuf> Gtk::OffscreenWindow::get_pixbuf  (       )   
Retrieves a snapshot of the contained widget in the form of a Gdk::Pixbuf.

您还可以从这个相关问题中收集一些示例代码(在python中)和其他提示:

How to draw any GTK widget on top of Cairo surface