如何创建Gdk :: Pixbuf实例的std :: map并将其用于Gdk :: Cairo

时间:2018-12-29 12:47:10

标签: c++ cairo gtkmm gtkmm3

我想可能会发现它很琐碎,但是我在这里问,因为我找不到简单的答案。

让我们深入研究这个问题:

具有多个图像资源以及cairo上下文,该资源不断使用这些图像。当然,我可以这样做,如下所示:

Glib::RefPtr<Gdk::Pixbuf>  image;
image = Gdk::Pixbuf::create_from_resource("/image/icon1"); //there are numerous icons out there

然后我可以将其与Cairo上下文指针一起使用:

bool MyClass::on_draw(const Cairo::RefPtr<Cairo::Context> &cr)
{
 // ... some code
 Gdk::Cairo::set_source_pixbuf(cr, image, x0 , y0); //x0 , y0 : somewhere in the context
 cr->paint();
 return true;
}

图像没有变化,但是每次都会创建Pixbuf实例。我想使用 c ++ map 并将其图标放入其中。然后,我想从地图上获取图像指针。我做了这样的事情:

std::map<Glib::ustring , GdkPixbuf*> map_Images;
// ..
map_images.insert(pair<Glib::ustring , GdkPixbuf* >("icon1" , image->gobj() )); // I do the same with all of my frequently referred icons

现在,我不知道该如何命名此地图以用于开罗上下文。换句话说,我应该如何从基础对象制作一个 Glib :: RefPtr ,例如 GdkPixbuf *

1 个答案:

答案 0 :(得分:1)

我建议您将map_Images映射为std::map<Glib::ustring , Glib::RefPtr<Gdk::Pixbuf> >类型的映射,并使其成为MyClass的数据成员。因为Glib::RefPtr将在所有引用都丢失到该指针后将取消分配该对象。

我想说的是,如果您有与此类似的代码:

... some function, say fun1 
{
    Glib::RefPtr<Gdk::Pixbuf>  image;
    image = Gdk::Pixbuf::create_from_resource("/image/icon1");

    map_images.insert(pair<Glib::ustring , GdkPixbuf* >("icon1" , image->gobj() ));
} // image object will die here. So, Gdk::Pixbuf held by Glib::RefPtr will be deallocated

现在,如果您尝试从地图访问Gdk::Pixbuf *,则将获得悬空指针。

在这种情况下,请跳过。否则,请继续阅读。

创建Glib::RefPtr类型的Gdk::Pixbuf似乎很简单。根据我在GitHub上找到的源代码:https://github.com/GNOME/glibmm/blob/master/glib/glibmm/refptr.hmake_refptr_for_instance(T_CppObject* object) API应该可以为您完成这项工作。

如果您确实要创建类型为Glib::RefPtr的{​​{1}},则可以通过以下方式获得它:

Gdk::Pixbuf

希望有帮助。