解析GTK Widget學(xué)習(xí)文檔及案例實現(xiàn)
GTK Widget學(xué)習(xí)文檔及案例實現(xiàn)是本文要介紹的內(nèi)容,主要是來了解并學(xué)習(xí)GTK Widget的應(yīng)用及案例的實現(xiàn),具體內(nèi)容的實現(xiàn)來看本文詳解。
一、gtk_widget_realize函數(shù)的作用
gtk_widget_realize這個函數(shù)是用來創(chuàng)建該widget對應(yīng)的GdkWindow和相關(guān)資源的。一般我們用不到這個函數(shù),一般是在創(chuàng)建自定義的widget的時候,需要用到。
我們一般不需要使用這個函數(shù)的原因是:當(dāng)我們調(diào)用gtk_widget_show_all函數(shù)的時候,就會自動調(diào)用這個函數(shù)。但是 Foundations of GTK+ Developing一書中提到,對于GtkEventBox,_show_all函數(shù)并不會調(diào)用realize,所以我們需要手動調(diào)用一次這個函數(shù)。
而 且,調(diào)用這個函數(shù)之前,需要首先調(diào)用gtk_container_add這樣類似的函數(shù),這是因為GTK要確定eventbox要知道他的parent和 ancestor是誰。
這次寫RTSP Player demo程序的時候,eventbox不是add到Top level的GtkWindow的,而是add到了一個GtkVBox中,用的是gtk_box_pack_start函數(shù),我發(fā)現(xiàn)在調(diào)用了 gtk_box_pack_start之后,調(diào)用gtk_widget_realize在運行時會發(fā)生一個斷言錯誤。
去掉這句代碼就好了,而且看起來也沒 有什么問題。這樣看來,是不是使用了gtk_box_pack_start函數(shù)的話,就不需要用gtk_widget_realize了呢?
二、GTK編程中如何準(zhǔn)確獲知當(dāng)前widget的size
1、用gtk_widget_get_request_size/gtk_widget_size_request取出來的都是當(dāng)初request的size,不是widget當(dāng)前的size
2、使用gdk_drawable_get_size函數(shù)可以取出當(dāng)前widget的size。注意,gdk_window_get_size函數(shù)有一樣的效果,不過這個函數(shù)已經(jīng)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);
小結(jié):解析解析GTK Widget學(xué)習(xí)文檔及案例實現(xiàn)的內(nèi)容介紹完了,希望通過GTK Widget應(yīng)用內(nèi)容的學(xué)習(xí)能對你有所幫助!