TOC

もっとウインドウに詰めこんでみましょう

前回、gtk_container_add()を用いて、ラベルをウインドウに追加しました。これで、ウインドウに一つのオブジェクトを追加することはできたわけですが、もっとたくさんのものをウインドウに追加しなければ、面白くありません。

そのためには、boxかtableを使用します。

boxは縦、横一方向にならべる場合、tableは任意の大きさの行と列をもつテーブルを作成します。縦方向のboxはvbox、横方向のboxはhboxです。

ここでは簡単のため、vboxを用いて、ラベルを縦に二つならべる方法を紹介します。一部書き直しがありますので注意して下さい。

#include <gtk/gtk.h>

int main(int argc,char *argv[]){
  GtkWidget *window;
  GtkWidget *label;
  /* ここから */
  GtkWidget *label2;
  GtkWidget *box;
  /* ここまで */
  gtk_init(&argc,&argv);
  window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  label=gtk_label_new("Hello World");
  /* ここから */
  label2=gtk_label_new("Hoge Hoge");
  box=gtk_vbox_new(FALSE,0);
  gtk_container_add(GTK_CONTAINER(window),box);
  gtk_box_pack_start(GTK_BOX(box),label,TRUE,TRUE,0);
  gtk_box_pack_start(GTK_BOX(box),label2,FALSE,TRUE,0);
  gtk_widget_show(box);
  gtk_widget_show(label2);
  /* ここまで */
  gtk_widget_show(label);
  gtk_widget_show(window);
  g_signal_connect(window,"destroy",gtk_main_quit,NULL);
  gtk_main();
  return 0;
}

上のプログラムの解説

  GtkWidget *label2;
  GtkWidget *box;

新しいラベルとboxのためのWidgetを定義します。

    label2=gtk_label_new("Hoge Hoge");

gtk_label_new()で新しいラベルを作ります。

  box=gtk_vbox_new(FALSE,0);

gtk_vbox_new()で新しい縦型のboxをつくります。引数は二つとり、追加するオブジェクトのスペースを同じにするかどうか(TRUE:同じにする , FALSE:別にする)とオブジェクト間のスペースの大きさです。今回は特に必要ないため、FALSEと0にしておきます。

  gtk_container_add(GTK_CONTAINER(window),box);

boxをwindowに追加します。

  gtk_box_pack_start(GTK_BOX(box),label,TRUE,TRUE,0);
  gtk_box_pack_start(GTK_BOX(box),label2,FALSE,TRUE,0);

boxにlabelとlabel2を詰めこみます。gtk_box_pack_startは引数を5つとります。

一つめは、boxの名前で、ここでは「box」です。boxの前のGTK_BOXがないと、コンパイル時に警告がでますが、うまくいきます。

二つめは、boxに詰めこむオブジェクトを指定します。

三つめは、「そのオブジェクトができるかぎり大きな領域を占めようとするか?」です。縮小しているとわかりにくいですが、このように拡大すると違いが良くわかります。

四つめは、空き領域をうめるかどうかです。vboxの場合は、横方向に広げるか、hboxの場合は、縦方向に広げるか、と考えればわかりやすいでしょう。

五つめはオブジェクト間の間隔の大きさです。

  gtk_widget_show(box);
  gtk_widget_show(label2);

boxは直接目には見えませんが表示させる必要があります。

戻る / index / 次へ