【发布时间】:2018-02-16 20:56:09
【问题描述】:
我正在尝试制作简单的正方形,您可以在其中使用鼠标进行绘画。问题是,每当绘制信号发生时,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;
}
【问题讨论】: