GTK编程:如何准确获知当前widget的size?
1. 用gtk_widget_get_request_size/gtk_widget_size_request取出来的都是当初request的size,不是widget当前的size
2. 使用gdk_drawable_get_size函数可以取出当前widget的size。注意,gdk_window_get_size函数有一样的效果,不过这个函数已经deprecated了。
还有一点,这个widget必须有window,像label, progressbar这些widget,他们是没有GdkWindow的(在Foundations of GTK+书中有描述,所以,像这样的widget如果要捕捉事件的话,要在他们下面套一个EventBox),虽然有window这个成员变量 (window这个成员变量定义在GtkWidget中,所以他们都有),但是他们的window这个成员变量,其实是他们的parent的window 变量(参看GtkWidget class手册中该成员变量的描述)。
OK,给出一段example代码,这段代码是一个eventbox,上面放了一个progressbar,取的是eventbox的size,其实也就是progressbar的size:
// Get the size of eventbox
gint width, height;
gdk_drawable_get_size(GDK_DRAWABLE(eventbox->window), &width, &height);
2. 使用gdk_drawable_get_size函数可以取出当前widget的size。注意,gdk_window_get_size函数有一样的效果,不过这个函数已经deprecated了。
还有一点,这个widget必须有window,像label, progressbar这些widget,他们是没有GdkWindow的(在Foundations of GTK+书中有描述,所以,像这样的widget如果要捕捉事件的话,要在他们下面套一个EventBox),虽然有window这个成员变量 (window这个成员变量定义在GtkWidget中,所以他们都有),但是他们的window这个成员变量,其实是他们的parent的window 变量(参看GtkWidget class手册中该成员变量的描述)。
OK,给出一段example代码,这段代码是一个eventbox,上面放了一个progressbar,取的是eventbox的size,其实也就是progressbar的size:
// Get the size of eventbox
gint width, height;
gdk_drawable_get_size(GDK_DRAWABLE(eventbox->window), &width, &height);