【问题标题】:Retaining drawings in gtkmm using queue_draw使用 queue_draw 在 gtkmm 中保留图纸
【发布时间】:2014-07-14 07:27:49
【问题描述】:

我想在绘图区绘制多个实体。每次调用 queue_draw 函数时都会绘制背景。

bool DrawingArea::on_draw(const Cairo::RefPtr<Cairo::Context>& cr)
{
cr->set_source_rgb(1.0, 1.0, 1.0);   // white background
cr->paint();

cr->set_line_width(2.0);

if(entity == 1)  // draw point
{
cr->set_source_rgb(0.0, 0.26, 0.26);
cr->save();
cr->arc(205.0, 110.0, 1.0, 0.0, 2 * M_PI); // full circle        
cr->restore();  
cr->stroke();
}

if(entity == 2)  // draw line
{
cr->set_source_rgb(0.0, 0.26, 0.26);
cr->save();
cr->move_to(0,0);
cr->line_to(100,100);
cr->restore();  
cr->stroke();
}
    return true;
}

当调用以下代码中的 queue_draw 函数时,上述代码有效:

void DrawingArea :: on_point_cb()
{
entity = 1;
queue_draw();
std::cout<<"Point created"<<std::endl;
}

当一个新实体被选中绘制时,前一个实体被删除。应该怎么做才能使之前绘制的实体持续存在?

【问题讨论】:

    标签: cairo gtkmm drawingarea


    【解决方案1】:

    不要在重绘事件上绘制到屏幕上,而是绘制到一个表面并保持该表面周围。

    调用 on_draw 函数时,只需重新绘制存储的表面,这样您就可以决定哪些保留,哪些不保留。

    绘制到存储的表面将在重绘期间保持更改,而绘制到 on_draw 函数内提供给您的 cairo 表面将始终在调用之间被擦除。

    希望它有所帮助,我知道这是一个老问题。

    【讨论】:

      猜你喜欢
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      • 2018-01-28
      • 2018-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多