TOC

アプリらしいアプリに

メニューバーとステータスバーがつくと、プログラムも本格的にアプリらしくなります。

#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)が必要となります。

上のプログラムのメニューバー付近の手順は、

  1. メニューバーの作成(gtk_menu_bar_new())
  2. vboxにメニューバーをセットする(gtk_box_pack_start())
  3. メニューを作成する(gtk_menu_new()) 注) ここではサブメニューとして作成する
  4. アイテムを作成する(gtk_menu_item_new_with_label()) 注) ラベル無しのときはwith_labelはいらない。
  5. メニューにアイテムを追加する(gtk_menu_shell_append())
  6. メニューをサブメニューとして登録する(gtk_menu_item_set_submenu())
  7. サブメニューをメニューバーに追加する(gtk_menu_shell_append())
  8. それぞれを表示する(gtk_widget_show())

です。

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つとり、ステータスバーの名前、識別番号、表示する文字列です。

index / 次へ