我正在尝试制作简单的正方形,您可以在其中用鼠标绘画。问题是,每当绘制信号发生时,cairo 表面似乎完全被清除了。我理解这一点,因为在第一个queue_draw()
白色背景消失后,我看到了我的 GTK 主题颜色(灰色)。
我以为我可以保存表面或上下文,但你不能只在 cairo 创建空表面,而且我不能使用this->get_window()->create_cairo_surface()
(this
继承自的类对象在哪里)创建它,Gtk::DrawingArea
因为当调用构造函数时,小部件未附加到任何窗口,所以它是一个空指针。我的意思是,我可以创建一些名为的公共函数,you_are_added_to_window_create_cairo_surface()
但我真的不想这样做。
所以我真的不知道该怎么做,我不了解开罗。
如何保留或保存“画布”当前状态,以便实际绘制的内容仅应用于现有绘图?
这是我班级的回调函数:
bool MyDrawingArea::on_draw(const Cairo::RefPtr<Cairo::Context> & cr) {
/* clear and fill background with white in the beginning */
if (first_draw) {
cr->save();
cr->set_source_rgb(255.0, 255.0, 255.0);
cr->paint();
cr->restore();
first_draw = false;
}
cr->save();
cr->set_source_rgb(0.0, 0.0, 0.0);
cr->begin_new_path();
while (!dots_queue.empty()) {
auto dot = dots_queue.front();
cr->line_to(dot.first, dot.second);
dots_queue.pop();
}
cr->close_path();
cr->stroke();
cr->restore();
return false;
}