如何在 Gtkmm DrawingArea 中绘制 cairo_surface_t

Posted

技术标签:

【中文标题】如何在 Gtkmm DrawingArea 中绘制 cairo_surface_t【英文标题】:How to draw a cairo_surface_t in a Gtkmm DrawingArea 【发布时间】:2019-06-01 15:56:13 【问题描述】:

我正在尝试在 Gtkmm DrawingArea 中绘制一个 cairo_surface_t。

cairo_surface_t * 可以用来初始化一个可以传递给 Cairo::Context::set_source 的 Glib::RefPtr 吗?

#include <gtkmm.h>
class CDrawingArea : Gtk::DrawingArea

public:
   CDrawingArea();
   virtual ~CDrawingArea();
   void DrawSurface (cairo_surface_t * surface); 
protected:
   bool on_draw(const Cairo::RefPtr<Cairo::Context>& cr);
   cairo_surface_t * m_surface;
;

#include "CDrawingArea.h"

CDrawingArea::CDrawingArea()



CDrawingArea::~CDrawingArea()



void CDrawingArea::DrawSurface (cairo_surface_t * surface)

   m_surface = surface;
   Glib::RefPtr<Gdk::Window> win = get_window();
   if (win)
   
      Gdk::Rectangle r(0, 0, get_allocation().get_width(), get_allocation().get_height());
      win->invalidate_rect(r, false);
   


bool CDrawingArea::on_draw(const Cairo::RefPtr<Cairo::Context>& cr)

   // Cairo::RefPtr<Cairo::Surface> refSurface  ??;
   // cr->set_source(refSurface, 0, 0);
   cr->paint();

【问题讨论】:

【参考方案1】:

你在找Surface的构造函数吗?

Cairo::Surface::Surface (   cairo_surface_t *   cobject,
bool    has_reference = false    
)           [explicit]
Create a C++ wrapper for the C instance.

This C++ instance should then be given to a RefPtr.

(复制和粘贴破坏了格式,抱歉) https://cairographics.org/documentation/cairomm/reference/classCairo_1_1Surface.html#a47b90669a5a85d187cc0d28dc99915c8

【讨论】:

我仍然不清楚如何使用它......当Surface被破坏时,正在传递的cobject会被破坏吗?

以上是关于如何在 Gtkmm DrawingArea 中绘制 cairo_surface_t的主要内容,如果未能解决你的问题,请参考以下文章

从opencv读取时gtkmm DrawingArea分段错误

显示尽可能大的所有小部件

将任何矩形绘制到 GTK+ DrawingArea 会填充整个 DrawingArea

DrawingArea:区域外的填充区域

gtkmm : 用 cairo 绘制文本

如何摆脱 Gtkmm 中的模糊像素?