带有cairo的GTK3 GtkLayout,无法获取更新区域

带有cairo的GTK3 GtkLayout,无法获取更新区域,layout,cairo,gtk3,Layout,Cairo,Gtk3,我想用cairo画一个GtkLayout。布局是巨大的,我需要得到在容器窗口中可见的部分,并只更新该部分。使用GTK2,暴露事件数据足以做到这一点。我没有成功的GTK3 在处理“绘制”事件的函数中,我执行了以下操作: GdkWindow *gdkwin; // window to draw cairo_region_t *cregion; // update regions cairo_rectang

我想用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
问题是克里根有垃圾。gdk_window_get_update_area()有缺陷,或者我没有使用正确的绘图窗口

按如下方式通过GtkLayout也不起作用(这是g_signal_connect的函数arg):

通过的不是来自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));
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));