來自 https://blog.csdn.net/sjin_1314/article/details/39552879
1、關於窗口
// 創建頂層窗體,后面有POPUP的
GtkWidget *main_window;
main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
// 設置title文字,注意UTF8格式的文字轉換,否則是亂碼
gtk_window_set_title (GTK_WINDOW (main_window), g_locale_to_utf8("哈哈",-1,NULL,NULL,NULL));
gtk_window_set_title (GTK_WINDOW (main_window), g_locale_to_utf8("哈哈",-1,NULL,NULL,NULL));
// 設置窗體圖標,用這條語句使所有窗體使用同一個圖標,也有獨立設置(GTK手冊)
gtk_window_set_default_icon_from_file( ICON_WNDICON, NULL);
gtk_window_set_default_icon_from_file( ICON_WNDICON, NULL);
// 設置邊框寬度,基本隨意
gtk_container_set_border_width (GTK_CONTAINER (main_window), 8);
gtk_container_set_border_width (GTK_CONTAINER (main_window), 8);
// 設置模式窗口
gtk_window_set_modal(GTK_WINDOW (window), TRUE);
// 讓窗口總在最前
gtk_window_set_keep_above(GTK_WINDOW (window), TRUE);
// 移動窗口位置
gtk_window_move(GTK_WINDOW (window), left, top);
// 也是設置位置的,簡單點
gtk_window_set_position(GTK_WINDOW (main_window), GTK_WIN_POS_CENTER);
// 這個讓叉叉無效
gtk_window_set_deletable(GTK_WINDOW (main_window), FALSE);
gtk_window_set_deletable(GTK_WINDOW (main_window), FALSE);
設置全屏顯示的幾種辦法:
a)簡單一點就用這個。
gtk_window_maximize(GTK_WINDOW (main_window));
b)下面這個有邊框但都給擠到屏幕外面了
gtk_window_fullscreen( GTK_WINDOW(main_window));
gtk_window_fullscreen( GTK_WINDOW(main_window));
c)采用設置窗體大小等於screen大小的辦法,就是麻煩點
GdkScreen *screen;
screen = gtk_window_get_screen( GTK_WINDOW( main_window));
gtk_window_set_default_size( GTK_WINDOW( main_window),
gdk_screen_get_width(screen),
gdk_screen_get_height(screen));
screen = gtk_window_get_screen( GTK_WINDOW( main_window));
gtk_window_set_default_size( GTK_WINDOW( main_window),
gdk_screen_get_width(screen),
gdk_screen_get_height(screen));
讓窗體尺寸不可調整,但是好像與全屏使用時有些問題,會自動地調整窗口的大小
gtk_window_set_resizable(GTK_WINDOW(main_window),FALSE);
gtk_window_set_resizable(GTK_WINDOW(main_window),FALSE);
或
gtk_window_set_policy(GTK_WINDOW(main_window), FALSE, FALSE, TRUE);
gtk_window_set_policy(GTK_WINDOW(main_window), FALSE, FALSE, TRUE);
常用的信號:
a)點擊叉叉
gint delete_event (GtkWidget *widget, GdkEvent *event, gpointer data)
g_signal_connect (G_OBJECT (main_window), "delete_event", G_CALLBACK (delete_event), NULL);
b)窗口變化,gboolean返回TRUE就行了,繼續執行默認過程,同下
gboolean window_state_event (GtkWidget *widget, GdkEventWindowState *event, gpointer user_data)
g_signal_connect (G_OBJECT (main_window), "window_state_event", G_CALLBACK (window_state_event), main_window);
c)點擊別的窗口
gboolean focus_out_event(GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
gtk_signal_connect (GTK_OBJECT(window), "focus-out-event", GTK_SIGNAL_FUNC(popuptoolbar_fout_event), window);
POPUP窗口也不錯,而且不會在任務欄出現。
window = gtk_window_new(GTK_WINDOW_POPUP);
用起來和這個差不多
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_decorated(GTK_WINDOW (window), FALSE);
gtk_window_set_decorated(GTK_WINDOW (window), FALSE);
設置一個背景圖片,對於整個窗體的,這還真需要點前期策划和藝術細胞,不然效果挺嚇人。我還是喜歡后面的那一個辦法。
GdkPixbuf *pixbuf;
GdkPixmap *pixmap;
GdkPixmap *pixmap;
gtk_widget_set_app_paintable (main_window, TRUE);
gtk_widget_realize (main_window);
pixbuf = gdk_pixbuf_new_from_file (ICON_BGPIC, NULL);
gdk_pixbuf_render_pixmap_and_mask (pixbuf, &pixmap, NULL, 128);
gdk_window_set_back_pixmap (main_window->window, pixmap, FALSE);
g_object_unref (pixbuf);
g_object_unref (pixmap);
對一部分區域設背景圖,這個辦法比較隨意也簡單,麻煩一點的地方是需要先做個計算,screen在前面有獲得辦法。
同時有說到一個圖片縮放的辦法。
GdkPixbuf *pixbuf;
image = gtk_image_new_from_file (ICON_BGPIC);
pixbuf = gtk_image_get_pixbuf (GTK_IMAGE(image));
pixbuf = gdk_pixbuf_scale_simple(pixbuf,
gdk_screen_get_width(screen) - 16, // 16: window border SHIFT
gdk_screen_get_height(screen) - 140, // 140: height SHIFT
GDK_INTERP_BILINEAR);
gtk_image_set_from_pixbuf(GTK_IMAGE(image), pixbuf);
// 我放到fixed里了,這個隨便
gtk_fixed_put(GTK_FIXED(fixed), image, 0, 0);
gtk_fixed_put(GTK_FIXED(fixed), image, 0, 0);
2、關於按鈕
// 建立按鈕
GtkWidget * button;
button = gtk_button_new ();
button = gtk_button_new ();
// 簡單一點的
button = gtk_button_new_with_label ("XX");
// 要產生那種能用鍵盤快捷鍵的按鈕
button = gtk_button_new_with_mnemonic(g_locale_to_utf8("確定(_O)", -1,NULL,NULL,NULL));
// 函數產生一個hbox,然后把botton當作容器放進去,GTK的widget幾乎都是容器,所以這個函數還是比較有用的,在產生toolbar的時候也用到。
GtkWidget * create_imagetext_hbox(const char *text,const char *image_path)
{
GtkWidget *box;
GtkWidget *label;
GtkWidget *image;
{
GtkWidget *box;
GtkWidget *label;
GtkWidget *image;
image = gtk_image_new_from_file (image_path);
label = gtk_label_new (g_locale_to_utf8(text, -1,NULL,NULL,NULL));
box = gtk_hbox_new (FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (box), 2);
gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 3);
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 3);
gtk_container_set_border_width (GTK_CONTAINER (box), 2);
gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 3);
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 3);
gtk_widget_showall (box);
return box;
}
}
GtkWidget * create_image_button(const char *text,const char *image_path)
{
GtkWidget * button;
GtkWidget *box;
{
GtkWidget * button;
GtkWidget *box;
box = create_imagetext_hbox(text, image_path);
button = gtk_button_new ();
gtk_container_add (GTK_CONTAINER (button), box);
button = gtk_button_new ();
gtk_container_add (GTK_CONTAINER (button), box);
gtk_widget_show (button);
return button;
}
}
// clicked信號定義
void user_function (GtkButton *button, gpointer user_data)
3、關於entry
// 建立entry
GtkWidget *entry;
entry = gtk_entry_new ();
// 讓entry顯示****
gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE);
// 讓entry直接響應回車
gtk_signal_connect (GTK_OBJECT(entry), "activate", GTK_SIGNAL_FUNC(enter_event), usrdata);
// 讀/寫entry,讀出的數據指針指向entry的widget內部,不能直接釋放。
gchar *gtk_entry_get_text (GTK_ENTRY (entry))
gtk_entry_set_text (GTK_ENTRY (entry), "XX")
4、關於label
// 簡單一點
label = gtk_label_new("XX");
// 讓label接受鍵盤快捷鍵,並聚焦到某widget
label = gtk_label_new_with_mnemonic (g_locale_to_utf8("輸入(_I)", -1,NULL,NULL,NULL));
gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget);
gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget);
// 使用<span></span>控制顯示
gtk_label_set_markup(GTK_LABEL(label), <span background='red'>"XXXX"</span>);
// -----------還有好多label用法,慢慢加
5、BOX參數小記
// 建立box
box = gtk_hbox_new (gboolean homogeneous, gint spacing);
或
box = gtk_vbox_new (gboolean homogeneous, gint spacing);
homogeneous:TRUE,內部widget平均分配box空間,Widget大小不變,只是占地大了,其他地方padding;一般用FALSE即可,是否平均可在pack指定的widget時進行控制。
spacing:內部widget間的間隔,pixel單位。
結合gtk_container_set_border_width (GTK_CONTAINER (box), 8);效果也不錯。
// Pack指定widget到box中
gtk_box_pack_start (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding);
或
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、封裝的代碼
雖然喪失了一定的隨意性,但是平常也就這些應用了。
X.1 treeview => LGX_storeview
X.2 toolbar
X.3 calendar
X.4 inputdialog
Y、Widget的一些常用方法
Y.1、設定大小
gtk_widget_set_usize(widget, x, y);
Y.2、使其“變灰色”
gtk_widget_set_sensitive(widget, FALSE);
gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
PangoFontDescription *fontdesc;
fontdesc = pango_font_description_from_string("uming 15");
gtk_widget_modify_font(treeview, fontdesc);
pango_font_description_free(fontdesc);
fontdesc = pango_font_description_from_string("uming");
pango_font_description_set_size (font_desc, 12*PANGO_SCALE);
pango_font_description_set_size (font_desc, 12*PANGO_SCALE);
Z、其他小技巧
Z.1 獲得widget的上下左右
widget->allocation.x
widget->allocation.y
widget->allocation.height
widget->allocation.width
