ウィンドウには一つのウィジェットしか配置できません。これでは困るのでコンテナーと呼ばれるレイアウト専用 のウィジェットを使います。コンテナーには任意の数のウィジェットを配置できます。ウィンドウにコンテナーを 配置して、その上に(その中に)複数のウィジェットを配置していきます。コンテナーには様々なものがありますが、今回は Box と Grid を紹介します。
以下のファイルを box.c という名前で記述してください。
/*************************************
box.c
copyright : vivacocoa.jp
last modified: Mar. 16, 2025
************************************/
#include <gtk/gtk.h>
static void
count (GtkButton *button, gpointer data)
{
static int count = 0;
char str[20];
//g_print("%s\n",gtk_button_get_label(button));
if (strcmp(gtk_button_get_label(button), "+")==0)
{
sprintf(str, "%d", ++count);
} else {
sprintf(str, "%d", --count);
}
gtk_label_set_text(data, str);
}
static void
activate (GtkApplication *app, gpointer data)
{
GtkWidget *window;
GtkWidget *vbox, *hbox;
GtkWidget *label;
GtkWidget *plus, *minus;
window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "Box");
gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,5);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5);
gtk_window_set_child(GTK_WINDOW(window), vbox);
label = gtk_label_new("0");
//gtk_widget_set_size_request(label, 200, 133);
gtk_widget_set_vexpand(label, 1);
plus = gtk_button_new_with_label("+");
minus = gtk_button_new_with_label("-");
g_signal_connect(plus, "clicked", G_CALLBACK(count), label);
g_signal_connect(minus, "clicked", G_CALLBACK(count), label);
gtk_box_append(GTK_BOX(vbox), label);
gtk_box_append(GTK_BOX(vbox), hbox);
gtk_box_append(GTK_BOX(hbox), minus);
gtk_box_append(GTK_BOX(hbox), plus);
gtk_widget_set_hexpand(minus, 1);
gtk_widget_set_hexpand(plus, 1);
gtk_window_present(GTK_WINDOW(window));
}
int
main (int argc, char **argv)
{
GtkApplication *app;
int status;
app = gtk_application_new("jp.vivacocoa.box", G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}
以下のとおりです。Windows の場合は通常版でも ARM64版 でも mingw64 で行ってください。
// コンパイル
cc `pkg-config --cflags gtk4` box.c -o box `pkg-config --libs gtk4`
もしくは
gcc $(pkg-config --cflags gtk4) -o box box.c $(pkg-config --libs gtk4)
// 実行
./box
+ ボタンをクリックするとカウントアップして、- ボタンをクリックするとカウントダウンします。ウィンドウのサイズを変えても、レイアウトは崩れません。
以下のファイルを grid.c という名前で記述してください。
/*************************************
grid.c
copyright : vivacocoa.jp
last modified: Mar. 16, 2025
************************************/
#include <gtk/gtk.h>
static void
count (GtkButton *button, gpointer data)
{
static int count = 0;
char str[20];
//g_print("%s\n",gtk_button_get_label(button));
if (strcmp(gtk_button_get_label(button), "+")==0)
{
sprintf(str, "%d", ++count);
} else {
sprintf(str, "%d", --count);
}
gtk_label_set_text(data, str);
}
static void
activate (GtkApplication *app, gpointer data)
{
GtkWidget *window;
GtkWidget *grid;
GtkWidget *label;
GtkWidget *plus, *minus;
window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "Grid");
gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
grid = gtk_grid_new();
gtk_grid_set_column_homogeneous(GTK_GRID(grid), TRUE);
//gtk_grid_set_row_homogeneous(GTK_GRID(grid), TRUE);
gtk_window_set_child(GTK_WINDOW(window), grid);
label = gtk_label_new("0");
gtk_widget_set_vexpand(label, TRUE);
plus = gtk_button_new_with_label("+");
minus = gtk_button_new_with_label("-");
g_signal_connect(plus, "clicked", G_CALLBACK(count), label);
g_signal_connect(minus, "clicked", G_CALLBACK(count), label);
gtk_grid_attach(GTK_GRID(grid), label, 0, 0, 2, 1);
gtk_grid_attach(GTK_GRID(grid), minus, 0, 1, 1, 1);
gtk_grid_attach(GTK_GRID(grid), plus, 1, 1, 1, 1);
gtk_grid_set_column_spacing(GTK_GRID(grid),5);
gtk_grid_set_row_spacing(GTK_GRID(grid), 5);
gtk_window_present(GTK_WINDOW(window));
}
int
main (int argc, char **argv)
{
GtkApplication *app;
int status;
app = gtk_application_new("jp.vivacocoa.box", G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}
以下のとおりです。Windows の場合は通常版でも ARM64版 でも mingw64 で行ってください。
// コンパイル
cc `pkg-config --cflags gtk4` grid.c -o grid `pkg-config --libs gtk4`
もしくは
gcc $(pkg-config --cflags gtk4) -o grid grid.c $(pkg-config --libs gtk4)
// 実行
./grid
+ ボタンをクリックするとカウントアップして、- ボタンをクリックするとカウントダウンします。ウィンドウのサイズを変えても、レイアウトは崩れません。