我正在尝试使用 cairo 绘制 GtkLayout。布局很大,我需要获取容器窗口中可见的部分并仅更新该部分。使用 GTK2,公开事件数据足以做到这一点。我在 GTK3 上没有成功。
在处理“绘制”事件的函数中,我执行了以下操作:
GdkWindow *gdkwin; // window to draw
cairo_region_t *cregion; // update regions
cairo_rectangle_int_t crect; // enclosing rectangle
gdkwin = gtk_layout_get_bin_window(GTK_LAYOUT(layout));
cregion = gdk_window_get_update_area(gdkwin);
cairo_region_get_extents(cregion,&crect);
expy1 = crect.y; // top of update area
expy2 = expy1 + crect.height; // bottom of update area
问题是 cregion 有垃圾。gdk_window_get_update_area() 有问题,或者我没有使用正确的绘图窗口。
如下传递 GtkLayout 也不起作用(这是 g_signal_connect 的函数 arg):
void draw_function(GtkWidget *layout, cairo_t *cr, void *userdata)
无论通过什么都不是来自 g_signal_connect 的 GtkLayout,而是其他东西。
================= 更新 ====================
我找到了一种不使用 GtkLayout 来做我想做的事的方法。我在视口内使用 GtkDrawingArea 。我可以滚动到大型图形布局中的任何窗口并仅更新该窗口。一旦我弄清楚了神秘的文档,效果就很好。
scrwing = gtk_scrolled_window_new(0,0);
gtk_container_add(GTK_CONTAINER(vboxx),scrwing);
drwing = gtk_drawing_area_new();
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrwing),drwing);
gtk_scrolled_window_set_policy(SCROLLWIN(scrwing),ALWAYS,ALWAYS);
scrollbar = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrwing));