ホーム
C/C++チュートリアル
レイアウト
-
GUIプログラミングにおいて、GUIパーツ(GUI部品)の
レイアウト(layout、配置)は大事な問題です。
-
GTKでは GUIパーツのことを ウィジェット(widget)と呼びます。
-
そして、GTKでは、コンテナー(container)と呼ばれるものにウィジェットを
レイアウトしていきます。
-
コンテナーもウィジェットの一つですが、ほとんどのコンテナーは目には見えません。
ウィンドウ
-
ウィンドウは目に見えるコンテナーの一つです。
-
ウィンドウには一つのウィジェットしか配置できません。
-
そしてウィンドウに配置されたウィジェットは、ウィンドウ一杯に広がります。
window.c3>
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *button;
gtk_init(&argc, &argv);
window = gtk_window_new(0); // GTK_WINDOW_TOPLEVELは 0 です
gtk_window_set_title (GTK_WINDOW(window), "Window");
gtk_window_set_default_size (GTK_WINDOW(window), 320, 240);
gtk_window_set_position (GTK_WINDOW(window), 1);
/* GTK_WIN_POS_CENTER は 1 です */
gtk_container_set_border_width (GTK_CONTAINER(window), 15);
button = gtk_button_new_with_label("Button");
gtk_container_add(GTK_CONTAINER(window), button);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
実行結果
コード説明
- ボタンの型も、GtKWidget になります。
- GTK_WINDOW_TOPLEVEL は、数値の 0 を定数化したものです。
- ウィンドウのサイズを指定するには、gtk_window_set_default_size
関数を使います。第1引数が対象となるウィンドウ、第2引数が横のサイズ、
第3引数が縦のサイズになります。
- ウィンドウをスクリーン中央に表示するんみは、gtk_window_set_position
関数を使います。第1引数に対象となるウィンドウ、第2引数にGTK_WIN_POS_CENTER
定数を指定します。
コードの幅の都合で数値 1 を指定しています。
- gtk_container_border_width関数で
コンテナーの外側の枠の幅を設定できます。第1引数にコンテナーを、
第2引数に幅を指定します。
- gtk_button_new_with_label関数でボタンを作ります。
引数にボタンに表示される文字列を指定します。
- gtk_container_add関数で、コンテナーにウィジェットを配置します。
第1引数にコンテナー、第2引数にウィジェットを指定します。
ウィジェットはコンテナーに配置しなければ表示されません。
- gtk_widget_show_all関数で、引数にウィンドウを指定すると、
そのウィンドウに配置されたすべてのウィジェットが表示されます。
アライン
-
GTK3でアライメントalignmentが非推奨(deprecated)になり、
代わりに gtk_widget_set_halignとgtk_widget_set_valignを
使うことになりました。
-
アラインを使うと、配置するウィジェットの位置を、
左にするか右にするか、上にするか下にするかを、左右の中央にするか、
上下の中央にするかを設定できます。
-
なお、このサンプルはGTK3に対応しています。GTK2でコンパイルした場合は、
警告(warning)が出ますが、実行はできます。
align.c
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *button;
gtk_init(&argc, &argv);
window = gtk_window_new (0);
gtk_window_set_title (GTK_WINDOW(window), "Align");
gtk_window_set_default_size (GTK_WINDOW(window), 320, 240);
gtk_window_set_position (GTK_WINDOW(window), 1);
/* GTK_WIN_POS_CENTER は 1 です */
gtk_container_set_border_width (GTK_CONTAINER(window), 15);
button = gtk_button_new_with_label("Button");
gtk_widget_set_size_request (button, 100, 25);
gtk_widget_set_halign (button, GTK_ALIGN_END);
gtk_widget_set_valign (button, GTK_ALIGN_END);
gtk_container_add (GTK_CONTAINER(window), button);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
実行結果
コード説明
- gtk_widget_set_size_request(button, 100, 25);
gtk_widget_set_size_request関数でウィジェットのサイズを設定できます。
引数は次のとおりです。
- 第1引数にウィジェットを指定します
- 第2引数にウィジェットの横のサイズを指定します
- 第3引数にウィジェットの縦のサイズを指定します
- gtk_widget_set_halign(button, GTK_ALIGN_END);
gtk_widget_set_halign関数でウィジェットの左右の配置位置を設定します。
引数は次のとおりです。
- 第1引数にウィジェットを指定します
- 第2引数にウィジェットの配置位置を次の定数のどれかで指定します
- GTK_ALIGN_FILL、左右に拡大します。この値がデフォルトになっています
- GTK_ALIGN_START、左に配置します
- GTK_ALIGN_END、右に配置します
- GTK_ALIGN_CENTER、左右の中央に配置します
- GTK_ALIGN_BASELINE、ベースラインに配置します
- gtk_widget_set_valign(button, GTK_ALIGN_END);
gtk_widget_set_valign関数でウィジェットの上下の配置位置を設定します。
引数は次のとおりです。
- 第1引数にウィジェットを指定します
- 第2引数にウィジェットの配置位置を次の定数のどれかで指定します
- GTK_ALIGN_FILL、上下に拡大します。この値がデフォルトになっています
- GTK_ALIGN_START、上に配置します
- GTK_ALIGN_END、下に配置します
- GTK_ALIGN_CENTER、上下の中央に配置します
- GTK_ALIGN_BASELINE、ベースラインに配置します
-
次に、gtk_container_add関数でwindowコンテナーに
buttonを配置します。
- このようにすると、ウィンドウの中でも、自由にレイアウトできるようになります。
-
なお、このサンプルはGTK3に対応しています。GTK2でコンパイルした場合は、
警告(warning)が出ますが、実行はできます。
フィクスド
- 複数のウィジェットをウィンドウに配置するには、
- 複数のウィジェットを配置できるコンテナーをウィンドウに一つ配置します。
- そして、そのコンテナーに複数のウィジェットを配置します。
- フィクスド(fixed)は、複数のウィジェットを
固定位置に配置することができるコンテナーです。
- フィクスドコンテナーは、目に見えません。
fixed.c
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *fixed;
GtkWidget *button1;
GtkWidget *button2;
GtkWidget *button3;
gtk_init(&argc, &argv);
window = gtk_window_new (0);
gtk_window_set_title (GTK_WINDOW(window), "Fixed");
gtk_window_set_default_size (GTK_WINDOW(window), 320, 240);
gtk_window_set_position (GTK_WINDOW(window), 1);
/* GTK_WIN_POS_CENTER は 1 です */
fixed = gtk_fixed_new();
gtk_container_add (GTK_CONTAINER(window), fixed);
button1 = gtk_button_new_with_label("Button 1");
button2 = gtk_button_new_with_label("Button 2");
button3 = gtk_button_new_with_label("Button 3");
gtk_fixed_put (GTK_FIXED(fixed), button1, 30, 20);
gtk_fixed_put (GTK_FIXED(fixed), button2, 110, 100);
gtk_fixed_put (GTK_FIXED(fixed), button3, 190, 180);
gtk_widget_set_size_request (button1, 100, 25);
gtk_widget_set_size_request (button2, 100, 25);
gtk_widget_set_size_request (button3, 100, 25);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
実行結果
コード説明
- GtkWidget *fixed; というように、fixedコンテナーの型も
GtkWidget になります。
- フィクスドは、gtk_fixed_new関数で作ります。引数は指定しません。
- gtk_fixed_put関数で、第1引数のフィクスドに、第2引数のウィジェットを、
第3引数の横位置と、第4引数の縦位置に配置します。
- 横位置と縦位置は、ウィンドウのコンテンツが表示される部分の、左上からの
ピクセル数になります。
- gtk_widget_set_size_request関数は、第1引数のウィジェットを、
第2引数の横サイズ、第3引数の縦サイズに設定します。
ボックス
- Boxはウィジェットを横や縦に配置できるコンテナーです。
- ボックスコンテナーも目に見えません。
- このサンプルはGTK3対応です。GTK2ではコンパイルできません。
box.c
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *textview;
GtkWidget *swin;
GtkWidget *frame;
GtkWidget *ok;
GtkWidget *cancel;
GtkWidget *hbox;
GtkWidget *vbox;
gtk_init(&argc, &argv);
window = gtk_window_new (0);
gtk_window_set_title (GTK_WINDOW(window), "Box");
gtk_window_set_default_size (GTK_WINDOW(window), 320, 240);
gtk_window_set_position (GTK_WINDOW(window), 1);
gtk_container_set_border_width (GTK_CONTAINER(window), 15);
textview = gtk_text_view_new ();
swin = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(swin),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
frame = gtk_frame_new (NULL);
gtk_container_add (GTK_CONTAINER(swin),
textview);
gtk_container_add (GTK_CONTAINER(frame),
swin);
ok = gtk_button_new_with_label ("OK");
cancel = gtk_button_new_with_label ("Cancel");
gtk_widget_set_size_request (ok, 100, 25);
gtk_widget_set_size_request (cancel, 100, 25);
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 15);
gtk_box_pack_start (GTK_BOX(hbox), ok, 0, 0, 0);
gtk_box_pack_start (GTK_BOX(hbox), cancel, 0, 0, 0);
/* 第2引数と第3引数の0はFALSEという意味です。第4引数は数値の0です */
gtk_widget_set_halign (hbox, GTK_ALIGN_END);
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 15);
gtk_box_pack_start (GTK_BOX(vbox), frame, 1, 1, 0);
/* 第2引数と第3引数の0はTRUEという意味です。第4引数は数値の0です */
gtk_box_pack_start (GTK_BOX(vbox), hbox, 0, 0, 0);
gtk_container_add (GTK_CONTAINER(window), vbox);
g_signal_connect (G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
実行結果
コード説明
-
GTKで複数行の文字列を入力できるウィジェットを
テキストビュー(textview)と言います。
-
テキストビューは、gtk_text_view_new関数で作ります。引数にはテキストビューに
表示される文字列を指定します。何も指定しないこともできます。
-
gtk_scrolled_window_new関数で
テキストビューに付けるスクロールバーを作ります。引数は通常、NULL, NULL
とします。
-
gtk_scrolled_window_set_policy関数で
スクロールバーがどのタイミングで表示されるかを指定します。
第1引数に対象となるスクロールドウィンドウを、
第2引数に横スクロールの表示タイミングを、
第3引数に縦スクロールの表示タイミングを指定します。
表示タイミングには、常に表示されるGTK_POLICY_ALWAYSと、
必要な時に表示されるGTK_POLICY_AUTOMATICがあります。
-
gtk_frame_new関数で作られるフレームは、四角い枠線です。
中にウィジェットを配置できる目に見えるコンテナーです。
引数に文字列を渡すと、フレームにタイトルとして表示されます。
タイトルが欲しくない場合は、NULLとしなければなりません。
-
gtk_container_add関数で、スクロールドウィンドウにテキストビューを配置します。
-
gtk_container_add関数で、フレームコンテナーにテキストビューを配置します。
テキストビューには枠線がありませんので、枠線を表示するフレームに配置しました。
-
ボックス(box)コンテナーは、
複数のウィジェットを横や縦に配置できるコンテナーです。
- ボックスコンテナーは gtk_box_new関数で作ります。引数は次のとおりです。
- 第1引数に縦ボックスにするか横ボックスにするか指定します
- GTK_ORIENTATION_HORIZONTALを指定すると横ボックスになります
- GTK_ORIENTATION_VERTICALを指定すると縦ボックスになります
- 第2引数にボックスに配置するウィジェットの間のギャップ(gap、間隙)を
指定します
- 横ボックスではウィジェット同士の横のギャップを指定したことになります
- 縦ボックスではウィジェット同士の縦のギャップを指定したことになります
-
ボックスにウィジェットを配置する方法は、gtk_container_add関数も使えますが、
gtk_box_pack_start関数を使うと複数のウィジェットを配置できます。
引数は次のとおりです。
- 第1引数に対象となるボックス
- 第2引数に配置するウィジェット
- 第3引数に配置したウィジェットを拡大したい場合にはTRUEを、
拡大したくない場合はFALSEを指定
- 第4引数にウィジェットが、自身が割り当てられた領域を埋める場合はTRUEを、
埋めない場合はFALSEを指定します
- 第5引数にウィジェットの周りのギャップを指定します
テーブル、グリッド、ボックス
- GTK3のレイアウトで一番問題なのがこのウィジェットを格子状に配置するための
コンテナーです。
-
GTK3では従来使っていたテーブル(Table)が非推奨(deprecated)になり、
代わりにグリッド(Grid)を使うことになりました。
-
-
しかし、グリッドはテーブルほど柔軟なレイアウトがまだできません。
-
まずテーブルのサンプルを示します。GTK3でコンパイルした場合は 13 個の警告
(Warning)が出ますが、実行に問題はありません。
- GTK2では、コンパイルできません。
table.c
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *table;
GtkWidget *title;
GtkWidget *author;
GtkWidget *review;
GtkWidget *entry1;
GtkWidget *entry2;
GtkWidget *textview;
GtkWidget *swin;
GtkWidget *frame;
gtk_init(&argc, &argv);
window = gtk_window_new (0);
gtk_window_set_title (GTK_WINDOW(window), "Table");
gtk_window_set_default_size (GTK_WINDOW(window), 320, 240);
gtk_window_set_position (GTK_WINDOW(window), 1);
gtk_container_set_border_width (GTK_CONTAINER(window), 15);
table = gtk_table_new (3, 2, FALSE);
gtk_container_add (GTK_CONTAINER(window), table);
title = gtk_label_new ("Title");
author = gtk_label_new ("Author");
review = gtk_label_new ("Review");
entry1 = gtk_entry_new ();
entry2 = gtk_entry_new ();
textview = gtk_text_view_new ();
gtk_label_set_xalign (GTK_LABEL(title), 0);
gtk_label_set_yalign (GTK_LABEL(title), 0);
gtk_label_set_xalign (GTK_LABEL(author), 0);
gtk_label_set_yalign (GTK_LABEL(author), 0);
gtk_label_set_xalign (GTK_LABEL(review), 0);
gtk_label_set_yalign (GTK_LABEL(review), 0);
frame = gtk_frame_new (NULL);
swin = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(swin),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_container_add (GTK_CONTAINER(swin), textview);
gtk_container_add (GTK_CONTAINER(frame), swin);
gtk_table_attach (GTK_TABLE(table), title, 0, 1, 0, 1,
GTK_FILL, GTK_FILL, 5, 5);
gtk_table_attach (GTK_TABLE(table), author, 0, 1, 1, 2,
GTK_FILL, GTK_FILL, 5, 5);
gtk_table_attach (GTK_TABLE(table), review, 0, 1, 2, 3,
GTK_FILL, GTK_FILL, 5, 5);
gtk_table_attach (GTK_TABLE(table), entry1, 1, 2, 0, 1,
GTK_EXPAND|GTK_FILL, GTK_FILL, 5, 5);
gtk_table_attach (GTK_TABLE(table), entry2, 1, 2, 1, 2,
GTK_EXPAND|GTK_FILL, GTK_FILL, 5, 5);
gtk_table_attach (GTK_TABLE(table), frame, 1, 2, 2, 3,
GTK_EXPAND|GTK_FILL,
GTK_EXPAND|GTK_FILL, 5, 5);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
実行結果
コード説明
- テーブルは gtk_table_new関数で作ります。第1引数は行(row、縦の数)
第2引数には列(column、横の数)を指定します。
第3引数にTRUEを指定すると配置されるウィジェットが同じサイズになります。
FALSEを指定すると強制的に同じサイズになることはありません。
-
gtk_label_new関数でラベルというユーザーが変更できない文字列を作れます。
引数には表示される文字列を指定します。
-
gtk_entry_new関数で一行だけ入力できるエントリーというウィジェットを作れます。
引数には表示したい文字列を指定します。何も指定しないこともできます。
-
gtk_label_set_xalign関数でラベルの文字が表示される横の位置を指定できます。
0を指定すると左に、1を指定すると右に、0.5を指定すると中央になります。
-
gtk_label_set_yalign関数でラベルも文字が表示される縦の位置を指定できます。
0を指定すると上に、1を指定すると下に、0.5を指定すると中央になります。
-
テーブルにウィジェットを配置するには、gtk_table_attach関数を使います。
引数は次のとおりです。
- 第1引数に対象となるテーブル
- 第2引数に配置するウィジェット
- 第3引数にウィジェットが隣接する左の列番号(列番号は0から始まります)
- 第4引数にウィジェットが隣接する右の列番号
- 第5引数にウィジェットが隣接する上の行番号(行番号は0から始まります)
- 第6引数にウィジェットが隣接する下の行番号
- 第7引数に横方向に拡大するかどうか(GTK_EXPANDで拡大します
GTK_FILLは領域を埋めるという意味だけになります)
- 第8引数に縦方向に拡大するかどうか
- 第9引数に横方向のギャップ(gap、間隙)
- 第10引数に縦方向のギャップ
-
次にグリッド(Grid)を使った例を示します。
-
警告(Warning)は出なくなりますが、レイアウトがイマイチです。
- このサンプルはGTK3対応です。GTK2ではコンパイルできません。
grid.c
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *grid;
GtkWidget *title;
GtkWidget *author;
GtkWidget *review;
GtkWidget *entry1;
GtkWidget *entry2;
GtkWidget *textview;
GtkWidget *swin;
GtkWidget *frame;
gtk_init(&argc, &argv);
window = gtk_window_new (0);
gtk_window_set_title (GTK_WINDOW(window), "Grid");
gtk_window_set_default_size (GTK_WINDOW(window), 320, 240);
gtk_window_set_position (GTK_WINDOW(window), 1);
gtk_container_set_border_width (GTK_CONTAINER(window), 20);
grid = gtk_grid_new ();
gtk_container_add (GTK_CONTAINER(window), grid);
gtk_grid_set_column_spacing (GTK_GRID(grid), 10);
gtk_grid_set_row_spacing (GTK_GRID(grid), 10);
title = gtk_label_new ("Title");
author = gtk_label_new ("Author");
review = gtk_label_new ("Review");
entry1 = gtk_entry_new ();
entry2 = gtk_entry_new ();
textview = gtk_text_view_new ();
gtk_label_set_xalign (GTK_LABEL(title), 0);
gtk_label_set_yalign (GTK_LABEL(title), 0);
gtk_label_set_xalign (GTK_LABEL(author), 0);
gtk_label_set_yalign (GTK_LABEL(author), 0);
gtk_label_set_xalign (GTK_LABEL(review), 0);
gtk_label_set_yalign (GTK_LABEL(review), 0);
frame = gtk_frame_new (NULL);
swin = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(swin),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_container_add (GTK_CONTAINER(swin), textview);
gtk_container_add (GTK_CONTAINER(frame), swin);
gtk_grid_attach (GTK_GRID(grid), title, 0, 0, 1, 1);
gtk_grid_attach (GTK_GRID(grid), entry1, 1, 0, 1, 1);
gtk_grid_attach (GTK_GRID(grid), author, 0, 1, 1, 1);
gtk_grid_attach (GTK_GRID(grid), entry2, 1, 1, 1, 1);
gtk_grid_attach (GTK_GRID(grid), review, 0, 2, 1, 1);
gtk_grid_attach (GTK_GRID(grid), frame, 1, 2, 1, 1);
gtk_entry_set_max_width_chars (GTK_ENTRY(entry1), 10000);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
実行結果
コード説明
- グリッドは、gtk_grid_new関数で作ります。引数はありません。
- グリッドに配置されるウィジェット同士の横のスペースは、
gtk_grid_set_column_spacing関数で設定します。
- グリッドに配置されるウィジェット同士の縦のスペースは、
gtk_grid_set_row_spacing関数で設定します。
- グリッドにウィジェットを配置するには、gtk_grid_attach関数を使います。
引数は次のとおりです。
- 第1引数にグリッド
- 第2引数に配置するウィジェット
- 第3引数に配置する列番号(横の順序を表す列番号は0から始まります)
- 第4引数に配置する行番号(縦の順序を表す行番号は0から始まります)
- 第5引数に配置するウィジェットが使用する列(横)の数
- 第6引数に配置するウィジェットが使用する行(縦)の数
- グリッドの格子を個別に拡大する方法はありません。第2列については
エントリーのgtk_entry_set_max_width_chars関数を使って、
強制的に拡張しました。
- 第3行については、拡大する方法がありません。
例えば、第3行に多くの格子数を与え、行の均一特性(ホモジーニアス、homogeneous)を
TRUEにすると、拡大しないこともありません。しかし、ウィンドウの大きさを変えると、
通常、縦に拡大しないエントリーまでも拡大するようになってしまいます。
-
妥協案としてボックス(Box)を使ってみました。
-
このサンプルはGTK3対応です。GTK2ではコンパイルできません。
review.c
#include <gtk/gtk.h>
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *title;
GtkWidget *author;
GtkWidget *review;
GtkWidget *entry1;
GtkWidget *entry2;
GtkWidget *textview;
GtkWidget *swin;
GtkWidget *frame;
GtkWidget *hbox1;
GtkWidget *hbox2;
GtkWidget *hbox3;
GtkWidget *vbox;
gtk_init(&argc, &argv);
window = gtk_window_new (0);
gtk_window_set_title (GTK_WINDOW(window), "Review");
gtk_window_set_default_size (GTK_WINDOW(window), 320, 240);
gtk_window_set_position (GTK_WINDOW(window), 1);
gtk_container_set_border_width (GTK_CONTAINER(window), 20);
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
hbox1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
hbox3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
gtk_container_add (GTK_CONTAINER(window), vbox);
title = gtk_label_new ("Title");
author = gtk_label_new ("Author");
review = gtk_label_new ("Review");
entry1 = gtk_entry_new ();
entry2 = gtk_entry_new ();
textview = gtk_text_view_new ();
gtk_widget_set_size_request (title, 40, -1);
gtk_widget_set_size_request (author, 40, -1);
gtk_widget_set_size_request (review, 40, -1);
gtk_label_set_xalign (GTK_LABEL(title), 0);
gtk_label_set_yalign (GTK_LABEL(title), 0);
gtk_label_set_xalign (GTK_LABEL(author), 0);
gtk_label_set_yalign (GTK_LABEL(author), 0);
gtk_label_set_xalign (GTK_LABEL(review), 0);
gtk_label_set_yalign (GTK_LABEL(review), 0);
frame = gtk_frame_new (NULL);
swin = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(swin),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_container_add (GTK_CONTAINER(swin), textview);
gtk_container_add (GTK_CONTAINER(frame), swin);
gtk_box_pack_start (GTK_BOX(hbox1), title, 0, 0, 0);
gtk_box_pack_end (GTK_BOX(hbox1), entry1, 1, 1, 0);
gtk_box_pack_start (GTK_BOX(vbox), hbox1, 0, 0, 0);
gtk_box_pack_start (GTK_BOX(hbox2), author, 0, 0, 0);
gtk_box_pack_end (GTK_BOX(hbox2), entry2, 1, 1, 0);
gtk_box_pack_start (GTK_BOX(vbox), hbox2, 0, 0, 0);
gtk_box_pack_start (GTK_BOX(hbox3), review, 0, 0, 0);
gtk_box_pack_end (GTK_BOX(hbox3), frame, 1, 1, 0);
gtk_box_pack_end (GTK_BOX(vbox), hbox3, 1, 1, 0);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
実行結果
コード説明
- このレイアウト方法の場合、ラベルのサイズを
gtk_widget_set_size_request(title, 40, -1)関数で決めなければなりません。
第3引数の -1 はデフォルトのサイズという意味になります。
- ボックスにウィジェットを追加するには、ボックスの先頭から追加する
gtk_box_pack_start関数と、ボックスの末尾から追加する
gtk_box_pack_end関数があります。
- gtk_box_pack_start関数とgtk_box_pack_end関数の第3引数と第4引数で
使われている数字は 1 がTRUEで 0 がFALSEという意味です。
第5引数はウィジェット同士の空白のサイズを表す数値です。
Posted: Dec. 14, 2019
Update: Dec. 30, 2019