1. 程式人生 > 其它 >libgtk Gtk 視窗,控制元件,設定(新增圖片等)

libgtk Gtk 視窗,控制元件,設定(新增圖片等)

{

  //https://cloud.tencent.com/developer/article/1503060

  //本文參與騰訊雲自媒體分享計劃,歡迎正在閱讀的你也加入,一起分享。

}

{

1、關於視窗

 1     // 建立頂層窗體,後面有POPUP的
 2     GtkWidget *main_window;
 3     main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 4  
 5     // 設定title文字,注意UTF8格式的文字轉換,否則是亂碼
 6     gtk_window_set_title (GTK_WINDOW (main_window), g_locale_to_utf8("哈哈",-1,NULL,NULL,NULL));
 7  
 8     // 設定窗體圖示,用這條語句使所有窗體使用同一個圖示,也有獨立設定(GTK手冊)
 9     gtk_window_set_default_icon_from_file( ICON_WNDICON, NULL);
10  
11     // 設定邊框寬度,基本隨意
12     gtk_container_set_border_width (GTK_CONTAINER (main_window), 8);
13  
14     // 設定模式視窗
15     gtk_window_set_modal(GTK_WINDOW (window), TRUE);
16  
17     // 讓視窗總在最前
18     gtk_window_set_keep_above(GTK_WINDOW (window), TRUE);
19  
20     // 移動視窗位置
21     gtk_window_move(GTK_WINDOW (window), left, top); 
22     // 也是設定位置的,簡單點
23     gtk_window_set_position(GTK_WINDOW (main_window), GTK_WIN_POS_CENTER);
24  
25     // 這個讓叉叉無效
26     gtk_window_set_deletable(GTK_WINDOW (main_window), FALSE);

設定全屏顯示的幾種辦法:

 1 //a)簡單一點就用這個。
 2       gtk_window_maximize(GTK_WINDOW (main_window));
 3  
 4 //b)下面這個有邊框但都給擠到螢幕外面了
 5       gtk_window_fullscreen( GTK_WINDOW(main_window)); 
 6 //c)採用設定窗體大小等於screen大小的辦法,就是麻煩點
 7       GdkScreen *screen;
 8 
 9       screen = gtk_window_get_screen( GTK_WINDOW( main_window)); 
10       gtk_window_set_default_size( GTK_WINDOW( main_window), 
11       gdk_screen_get_width(screen), 
12       gdk_screen_get_height(screen));

讓窗體尺寸不可調整,但是好像與全屏使用時有些問題,會自動地調整視窗的大小

1       gtk_window_set_resizable(GTK_WINDOW(main_window),FALSE);
2 //或
3       gtk_window_set_policy(GTK_WINDOW(main_window), FALSE, FALSE, TRUE);

常用的訊號:

 1 //(a)點選叉叉
 2       gint delete_event (GtkWidget *widget, GdkEvent *event, gpointer data)
 3 
 4       g_signal_connect (G_OBJECT (main_window), "delete_event", G_CALLBACK (delete_event), NULL);
 5  
 6 //(b)視窗變化,gboolean返回TRUE就行了,繼續執行預設過程,同下
 7       gboolean window_state_event (GtkWidget *widget, GdkEventWindowState *event, gpointer user_data)
 8  
 9       g_signal_connect (G_OBJECT (main_window), "window_state_event", G_CALLBACK (window_state_event), main_window);
10 //(c)點選別的視窗
11       gboolean focus_out_event(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
12  
13       gtk_signal_connect (GTK_OBJECT(window), "focus-out-event", GTK_SIGNAL_FUNC(popuptoolbar_fout_event), window); 

POPUP視窗也不錯,而且不會在工作列出現。

1     window = gtk_window_new(GTK_WINDOW_POPUP);
2  
3     //用起來和這個差不多
4     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
5     gtk_window_set_decorated(GTK_WINDOW (window), FALSE);

設定一個背景圖片,對於整個窗體的,這還真需要點前期策劃和藝術細胞,不然效果挺嚇人。我還是喜歡後面的那一個辦法。

 1     GdkPixbuf *pixbuf;
 2     GdkPixmap *pixmap;
 3 
 4     gtk_widget_set_app_paintable (main_window, TRUE);
 5     gtk_widget_realize (main_window);
 6     pixbuf = gdk_pixbuf_new_from_file (ICON_BGPIC, NULL);
 7     gdk_pixbuf_render_pixmap_and_mask (pixbuf, &pixmap, NULL, 128);
 8     gdk_window_set_back_pixmap (main_window->window, pixmap, FALSE);
 9     g_object_unref (pixbuf);
10     g_object_unref (pixmap);

對一部分割槽域設背景圖,這個辦法比較隨意也簡單,麻煩一點的地方是需要先做個計算,screen在前面有獲得辦法。

同時有說到一個圖片縮放的辦法。

 1     GdkPixbuf *pixbuf;
 2 
 3     image = gtk_image_new_from_file (ICON_BGPIC);
 4     pixbuf = gtk_image_get_pixbuf (GTK_IMAGE(image));
 5     pixbuf = gdk_pixbuf_scale_simple(pixbuf, 
 6        gdk_screen_get_width(screen) - 16, // 16: window border SHIFT 
 7        gdk_screen_get_height(screen) - 140, // 140: height SHIFT
 8        GDK_INTERP_BILINEAR);
 9     gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf);
10     // 我放到fixed裡了,這個隨便
11     gtk_fixed_put(GTK_FIXED(fixed), image, 0, 0);

2、關於按鈕

 1     // 建立按鈕
 2     GtkWidget * button;
 3     button = gtk_button_new ();
 4  
 5     // 簡單一點的
 6     button = gtk_button_new_with_label ("XX");
 7  
 8     // 要產生那種能用鍵盤快捷鍵的按鈕
 9     button = gtk_button_new_with_mnemonic(g_locale_to_utf8("確定(_O)", -1,NULL,NULL,NULL));
10  
11     // 要好看一點就用一個圖片的
12     // 函式產生一個hbox,然後把botton當作容器放進去,GTK的widget幾乎都是容器,所以這個函式還是比較有用的,在產生toolbar的時候也用到。
13     GtkWidget * create_imagetext_hbox(const char *text,const char *image_path)
14     {
15         GtkWidget *box;
16         GtkWidget *label;
17         GtkWidget *image;
18 
19         image = gtk_image_new_from_file (image_path);
20         label = gtk_label_new (g_locale_to_utf8(text, -1,NULL,NULL,NULL));
21         box = gtk_hbox_new (FALSE, 0);
22         gtk_container_set_border_width (GTK_CONTAINER (box), 2);
23         gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 3);
24         gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 3);
25  
26         gtk_widget_showall (box);
27         return box;
28     }
29     GtkWidget * create_image_button(const char *text,const char *image_path)
30     {
31         GtkWidget * button;
32         GtkWidget *box;
33  
34         box = create_imagetext_hbox(text, image_path);
35  
36         button = gtk_button_new ();
37         gtk_container_add (GTK_CONTAINER (button), box);
38         gtk_widget_show (button);
39         return button;
40     }
41  
42     // clicked訊號定義
43     void user_function (GtkButton *button, gpointer user_data)

3、關於entry

 1     // 建立entry
 2     GtkWidget *entry;
 3     entry = gtk_entry_new ();
 4  
 5     // 讓entry顯示****
 6     gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE);
 7  
 8     // 讓entry直接響應回車
 9     gtk_signal_connect (GTK_OBJECT(entry), "activate", GTK_SIGNAL_FUNC(enter_event), usrdata);
10  
11     // 讀/寫entry,讀出的資料指標指向entry的widget內部,不能直接釋放。
12     gchar *gtk_entry_get_text (GTK_ENTRY (entry))
13     gtk_entry_set_text (GTK_ENTRY (entry), "XX")

4、關於label

 1  // 簡單一點
 2     label = gtk_label_new("XX");
 3  
 4     // 讓label接受鍵盤快捷鍵,並聚焦到某widget
 5     label = gtk_label_new_with_mnemonic (g_locale_to_utf8("輸入(_I)", -1,NULL,NULL,NULL));
 6     gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget);
 7  
 8     // 使用<span></span>控制顯示
 9     gtk_label_set_markup(GTK_LABEL(label), <span background='red'>"XXXX"</span>);
10     // -----------還有好多label用法,慢慢加

5、BOX引數小記

 1     // 建立box
 2     box = gtk_hbox_new (gboolean homogeneous, gint spacing);
 3    // 或
 4     box = gtk_vbox_new (gboolean homogeneous, gint spacing);
 5  
 6     homogeneous:TRUE,內部widget平均分配box空間,Widget大小不變,只是佔地大了,其他地方padding;一般用FALSE即可,是否平均可在pack指定的widget時進行控制。
 7     spacing:內部widget間的間隔,pixel單位。
 8  
 9    // 結合gtk_container_set_border_width (GTK_CONTAINER (box), 8);效果也不錯。
10  
11     // Pack指定widget到box中
12     gtk_box_pack_start (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding);
13     //或
14     gtk_box_pack_end (GTK_BOX (box), widget, FALSE, FALSE, 0);

expand:TRUE,對所有TRUE引數打包進來的widget平均分配box中剩餘的空間,但並不填充,仍保持widget原大小。

fill:TRUE,只有在expand為TRUE時有效,widget改變大小填充滿其在box中佔有的空間。

padding:widget與他後面的控制元件的間隔,pixel單位,最後一個widget將作為與box邊緣的間隔。

box其樂無窮呀!

X、封裝的程式碼

雖然喪失了一定的隨意性,但是平常也就這些應用了。

1     X.1 treeview => LGX_storeview
2         lgx_storeview的說明和程式碼
3  
4     X.2 toolbar
5  
6     X.3 calendar
7  
8     X.4 inputdialog

Y、Widget的一些常用方法

Y.1、設定大小

1       gtk_widget_set_usize(widget, x, y);

Y.2、使其“變灰色”

1   gtk_widget_set_sensitive(widget, FALSE);
2   gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
3 
4   PangoFontDescription *fontdesc;
5   fontdesc = pango_font_description_from_string("uming 15");
6   gtk_widget_modify_font(treeview, fontdesc);
7   pango_font_description_free(fontdesc);
8   fontdesc = pango_font_description_from_string("uming");
9   pango_font_description_set_size (font_desc, 12*PANGO_SCALE);

Z、其他小技巧

Z.1 獲得widget的上下左右

1   widget->allocation.x
2   widget->allocation.y
3   widget->allocation.height
4   widget->allocation.width

轉載來自:http://www.cnblogs.com/linge1949/archive/2013/02/26/2934232.html

本文參與騰訊雲自媒體分享計劃,歡迎正在閱讀的你也加入,一起分享。

}