提问人:bejo 提问时间:2/2/2023 更新时间:2/5/2023 访问量:184
如何在gtkmm 3.0中为DrawingArea对象触发on_draw方法
How to trigger on_draw method in gtkmm 3.0 for a DrawingArea object
问:
使用 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 时。
答:
我在 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()添加到绘图区域窗口的“损坏区域”来强制重绘。
评论