GTK Widget学习文档及案例实现是本文要介绍的内容,主要是来了解并学习GTK Widget的应用及案例的实现,具体内容的实现来看本文详解。
一、gtk_widget_realize函数的作用
gtk_widget_realize这个函数是用来创建该widget对应的GdkWindow和相关资源的。一般我们用不到这个函数,一般是在创建自定义的widget的时候,需要用到。
我们一般不需要使用这个函数的原因是:当我们调用gtk_widget_show_all函数的时候,就会自动调用这个函数。但是 Foundations of GTK+ Developing一书中提到,对于GtkEventBox,_show_all函数并不会调用realize,所以我们需要手动调用一次这个函数。
而 且,调用这个函数之前,需要首先调用gtk_container_add这样类似的函数,这是因为GTK要确定eventbox要知道他的parent和 ancestor是谁。
这次写RTSP Player demo程序的时候,eventbox不是add到Top level的GtkWindow的,而是add到了一个GtkVBox中,用的是gtk_box_pack_start函数,我发现在调用了 gtk_box_pack_start之后,调用gtk_widget_realize在运行时会发生一个断言错误。
去掉这句代码就好了,而且看起来也没 有什么问题。这样看来,是不是使用了gtk_box_pack_start函数的话,就不需要用gtk_widget_realize了呢?
二、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);
小结:解析解析GTK Widget学习文档及案例实现的内容介绍完了,希望通过GTK Widget应用内容的学习能对你有所帮助!