gtkmm 3.0:如何触发DrawingArea重绘(无需传递Cairo上下文)
解决方案
1. 无需Cairo上下文触发重绘的方法
直接调用Anzeige实例的queue_draw()方法即可,这就是点击DrawingArea时自动重绘的底层触发命令。调用这个方法后,Gtk会自动安排重绘流程,在合适的时机创建Cairo上下文并调用你的on_draw方法,完全不需要你手动传递上下文。
比如当t_Elt_IST或t_Elt_SOLL更新后,执行:
your_anzeige_instance->queue_draw();
这样系统就会自动触发on_draw,用最新的数值完成绘制。
2. Cairo上下文的使用时机
- 由Gtk自动提供上下文的场景:绝大多数常规绘制都应该依赖
on_draw方法里的cr参数。这个上下文是Gtk在重绘周期中为当前控件创建的,已经正确关联了控件的绘图区域、窗口表面等状态,直接用它调用zeigeTemp这类绘制方法是安全且正确的。 - 自行创建上下文的场景:只有当你需要做离线渲染(比如绘制到内存中的Cairo表面,保存为图片),或者在非重绘周期进行临时绘制时,才需要自己创建Cairo上下文。
Gtk::Window::create_cairo_context容易出错是因为该方法要求窗口已经完成映射(即显示在屏幕上),且需要正确的绘制目标,一般业务场景下完全不需要这么做。
你之前尝试手动创建上下文导致段错误,就是因为没有满足该方法的调用条件,而实际上你根本不需要这么做——更新数值后调用queue_draw让系统处理上下文和重绘流程就足够了。
内容的提问来源于stack exchange,提问作者bejo
相关产品推荐
相关产品推荐

