gpt4 book ai didi

c++ - 在绘图信号上保留 DrawingArea 'image'

转载 作者:行者123 更新时间:2023-11-28 04:48:02 25 4
gpt4 key购买 nike

我正在尝试制作简单的正方形,您可以在其中使用鼠标进行绘画。问题是,每当绘制信号发生时,cairo 表面似乎已完全清除。我理解这一点,因为在第一个 queue_draw() 之后,白色背景消失了,我看到了我的 GTK 主题颜色(灰色)。

我以为我可以保存表面或上下文,但你不能只在 cairo 中创建空表面,而且我无法使用 this->get_window()->create_cairo_surface() 创建它(其中 this 是从 Gtk::DrawingArea 继承的类的对象)因为当调用构造函数时,小部件尚未附加到任何窗口,因此它是一个空指针.我的意思是,我可以创建一些名为 you_are_added_to_window_create_cairo_surface() 的公共(public)函数,但我真的不想这样做。

所以我真的不知道该怎么做,我对开罗有什么不了解。

如何保留或保存“ Canvas ”当前状态,以便实际绘制的内容仅应用于现有绘图?

这是我的类的回调函数:

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;
}

最佳答案

删除 first_draw而不是 dots_queue.pop() , 只需遍历 dots_queue并每次都重新绘制。

draw功能并不意味着“我想添加一些绘图”。相反,它是“嘿,窗口系统不知道这里应该画什么,请用内容填充它”。这就是开罗表面被清除的原因。

关于c++ - 在绘图信号上保留 DrawingArea 'image',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48834718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com