【问题标题】:gtk_widget_draw() alternative for gtkmm3gtk_widget_draw() 替代 gtkmm3
【发布时间】:2012-10-16 05:31:25
【问题描述】:

我正在寻找一种将 gtk 小部件容器渲染到 pixbuf 的方法,以便以后使用 gtkmm3 拖放图标图像。

据我研究,在本机 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()。

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

【问题讨论】:

    标签: c++ gtkmm gtk3


    【解决方案1】:

    您可以使用 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

    【讨论】:

      猜你喜欢
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      相关资源
      最近更新 更多