使用queue_draw在gtkmm中保留图纸

时间:2014-07-14 07:27:49

标签: cairo gtkmm drawingarea

我想在绘图区域中绘制多个实体。每次调用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;
}

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

1 个答案:

答案 0 :(得分:1)

与其在重绘事件上绘制到屏幕上,不如在表面上绘制并保持该表面周围。

调用on_draw函数时,只需重新粉刷存储的表面,就可以确定哪些持久存在,哪些不持久。

在已存储的表面上进行绘制将保留重绘之间的更改,在on_draw函数内部提供给您的cairo曲面上的绘制将始终在两次调用之间被擦除。

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