解析GTK Widget學習文檔及案例實現
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應用內容的學習能對你有所幫助!

















