如何在gtkmm 3.0中为DrawingArea对象触发on_draw方法

How to trigger on_draw method in gtkmm 3.0 for a DrawingArea object

提问人:bejo 提问时间:2/2/2023 更新时间:2/5/2023 访问量:184

问:

使用 gtkmm 3.0,在 Gtk::Window 对象中,我有一个名为 Anzeige 的 Gtk::D rawingArea 派生的自定义类的对象。

#include <gtkmm/drawingarea.h>

class Anzeige : public Gtk::DrawingArea
{
public:
  Anzeige();
  virtual ~Anzeige(); 
  
private:
  //Override default signal handler:
  bool on_draw(const Cairo::RefPtr<Cairo::Context>& cr) override;
  void zeigeTemp(const Cairo::RefPtr<Cairo::Context>& cr, float t_IST, float t_SOLL, int x, int y);

  //member data
  //...//
  float t_Elt_IST;
  float t_Elt_SOLL;
};

on_draw 方法的重写函数存在,并获取 Cairo::Context 作为名为 cr 的参数。在此on_draw覆盖的函数定义中,我成功地利用 cr 来显示位图和一些 pango 布局。函数 zeigeTemp 在位置 x 和 y 处显示 pango 布局。 zeigeTemp 在 on_draw 函数中被调用并获取相同的 Cairo::Context cr。

当在我的程序中更新值时,我想手动调用 on_draw 方法或 zeigeTemp,以便屏幕是最新的。但是为了调用这些方法,我需要将 Cairo::Context 传递给它们。

到目前为止,我还没有在我的代码中的其他任何地方显式使用 Cairo::Context。on_draw 方法由程序自行神奇地调用,并且使用了一些 Cairo::Context。

有没有一种更简单的方法可以告诉 Gtk 重新绘制 DrawingArea 而不必指定 Cairo::Context?当我在 DrawingArea 中单击时,它会在没有额外输入的情况下重新绘制。所以一定有办法让Gtk按照命令来做这件事。这是哪个命令?

当我尝试使用create_cairo_context方法从Gtk::Window中提取Cairo::Context时,我在运行时出现分段错误。我不明白,当 Gtk 本身使用 Cairo::Context 时,以及当我需要创建它以将其传递给例如方法 zeigeTemp 时。

Cairo OnDraw GTKMM3 绘图区域

评论


答:

1赞 Uli Schlachter 2/5/2023 #1

我在 https://developer-old.gnome.org/gtkmm/stable/classGtk_1_1DrawingArea.html 上搜索了“重绘”,找到了这一段:

你也可以使用Gtk::Widget::queue_draw_region()、Gtk::Widget::queue_draw_area()或Gtk::Widget::queue_draw()添加到绘图区域窗口的“损坏区域”来强制重绘。