メニューバーとステータスバーがつくと、プログラムも本格的にアプリらしくなります。
#include <gtk/gtk.h> int main(int argc,char *argv[]){ GtkWidget *window; GtkWidget *vbox; GtkWidget *menubar; GtkWidget *label; GtkWidget *statusbar; GtkWidget *file_menu; GtkWidget *help_menu; GtkWidget *File_Item; GtkWidget *Load_item; GtkWidget *Quit_item; GtkWidget *Help_Item; GtkWidget *About_item; gtk_init(&argc,&argv); window=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window),"Program"); gtk_window_set_default_size(GTK_WINDOW(window),640,480); vbox=gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(window),vbox); menubar=gtk_menu_bar_new(); gtk_box_pack_start(GTK_BOX(vbox),menubar,FALSE,TRUE,0); file_menu=gtk_menu_new(); File_Item=gtk_menu_item_new_with_label("File"); Load_item=gtk_menu_item_new_with_label("Load"); Quit_item=gtk_menu_item_new_with_label("Quit"); gtk_menu_shell_append (GTK_MENU_SHELL (file_menu), Load_item); gtk_menu_shell_append (GTK_MENU_SHELL (file_menu), Quit_item); gtk_menu_item_set_submenu (GTK_MENU_ITEM (File_Item), file_menu); gtk_menu_shell_append (GTK_MENU_SHELL (menubar), File_Item); gtk_widget_show(Load_item); gtk_widget_show(Quit_item); gtk_widget_show(File_Item); gtk_widget_show(file_menu); help_menu=gtk_menu_new(); Help_Item=gtk_menu_item_new_with_label("Help"); About_item=gtk_menu_item_new_with_label("About"); gtk_menu_shell_append (GTK_MENU_SHELL (help_menu), About_item); gtk_menu_item_set_submenu (GTK_MENU_ITEM (Help_Item), help_menu); gtk_menu_shell_append (GTK_MENU_SHELL (menubar), Help_Item); gtk_widget_show(About_item); gtk_widget_show(Help_Item); gtk_widget_show(help_menu); gtk_widget_show(menubar); label=gtk_label_new("Hello World"); gtk_box_pack_start(GTK_BOX(vbox),label,TRUE,TRUE,0); gtk_widget_show(label); statusbar=gtk_statusbar_new(); gtk_box_pack_start(GTK_BOX(vbox),statusbar,FALSE,TRUE,0); gtk_statusbar_push(GTK_STATUSBAR(statusbar),1,"Hello World"); gtk_widget_show(statusbar); gtk_widget_show(vbox); gtk_widget_show(window); g_signal_connect(Quit_item,"activate",gtk_main_quit,NULL); g_signal_connect(window,"destroy",gtk_main_quit,NULL); gtk_main(); return 0; }
このプログラムのメニューバーにあるアイテムはFileサブメニューのなかに、Load、Quitが、HelpサブメニューのなかにAboutがありますので、アイテムをFile, Load, Quit, Help, Aboutの5つが必要となります。また、サブメニューはFile, Helpの2つがいります。File_Item, Load_item, Quit_item, Help_Item, About_item, File_menu, Help_menuがそれです。
また、それらを束ねるメニューバー(menubar)が必要となります。
上のプログラムのメニューバー付近の手順は、
です。
gtk_menu_shell_append()は引数を2つとり、メニューの名前と、アイテムの名前を、gtk_menu_item_set_submenu()は引数を2つとり、サブメニューの項目にするアイテム名と、メニューの名前です。
上のプログラムでは、file_menuとhelp_menu、File_ItemとHelp_Itemを別々に作成していますが、特に区別する必要がない場合は、同じ名前でOKです。
メニューの項目が選択されたかどうかはactivateシグナルで判断します。このプログラムでは、Quitを選択すると、プログラムが終了するようになっています。
ステータスバーの作成はメニューバーよりも簡単です。
gtk_statusbar_new()で作成してgtk_statusbar_push()で表示内容をステータスバーに登録します。gtk_statusbar_push()は引数を3つとり、ステータスバーの名前、識別番号、表示する文字列です。