1

我想有人可能会觉得它微不足道,但我在这里问它,因为我找不到一个直截了当的答案。

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

拥有多个图像的资源以及不断使用这些图像的 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++ 地图并将我的图标放入其中。然后,我想从地图中获取图像指针。我做了这样的事情:

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*

4

1 回答 1

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.h,APImake_refptr_for_instance(T_CppObject* object)应该为您完成这项工作。

如果你真的想创建Glib::RefPtrtype Gdk::Pixbuf,你可以通过调用得到它:

Glib::RefPtr<Gdk::Pixbuf> imageForIcon1 = make_refptr_for_instance<Gdk::Pixbuf>(map_images["icon1"]); // assumption: map_images already has an element with key "icon1"

希望能帮助到你。

于 2018-12-29T14:16:10.913 回答