如何创建 std::map 个 Gdk::Pixbuf 个实例并在 Gdk::Cairo 中使用它
How to create std::map of Gdk::Pixbuf instances and use it in Gdk::Cairo
我猜有人可能会觉得它微不足道,但我在这里问是因为我找不到直接的答案。
让我们深入探讨这个问题:
拥有多个图像资源以及不断使用这些图像的 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*
我建议您制作 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 *
,您将得到悬挂指针。
如果是这样,跳过后面的部分。否则,请继续阅读。
创建 Gdk::Pixbuf
类型的 Glib::RefPtr
似乎很简单。根据我在 GitHub 上找到的源代码:https://github.com/GNOME/glibmm/blob/master/glib/glibmm/refptr.h、make_refptr_for_instance(T_CppObject* object)
API 应该可以为您完成这项工作。
如果你真的想创建 Gdk::Pixbuf
类型的 Glib::RefPtr
,你可以调用:
Glib::RefPtr<Gdk::Pixbuf> imageForIcon1 = make_refptr_for_instance<Gdk::Pixbuf>(map_images["icon1"]); // assumption: map_images already has an element with key "icon1"
希望对您有所帮助。
我猜有人可能会觉得它微不足道,但我在这里问是因为我找不到直接的答案。
让我们深入探讨这个问题:
拥有多个图像资源以及不断使用这些图像的 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*
我建议您制作 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 *
,您将得到悬挂指针。
如果是这样,跳过后面的部分。否则,请继续阅读。
创建 Gdk::Pixbuf
类型的 Glib::RefPtr
似乎很简单。根据我在 GitHub 上找到的源代码:https://github.com/GNOME/glibmm/blob/master/glib/glibmm/refptr.h、make_refptr_for_instance(T_CppObject* object)
API 应该可以为您完成这项工作。
如果你真的想创建 Gdk::Pixbuf
类型的 Glib::RefPtr
,你可以调用:
Glib::RefPtr<Gdk::Pixbuf> imageForIcon1 = make_refptr_for_instance<Gdk::Pixbuf>(map_images["icon1"]); // assumption: map_images already has an element with key "icon1"
希望对您有所帮助。