Gtk+ X プログラミングの練習

  • ボタンレッスン
    ボタンとボタンの配置、ボタンをクリックしたときのコールバック
  • Simple Editor
    エディタを作る
  • ファイラー
    ツリー構造を表示

  • コンパイルオプション
    gcc -o window window.c `gtk-config --cflags` `gtk-config --libs`
    
    gcc -Wall -g helloworld.c -o hello_world `gtk-config --cflags` `gtk-config --libs`
    
    jeanne:~/appl/tools/gtk-prog/1$ gcc -Wall -g button01.c -o button01 `gtk-config --cflags` `gtk-config --libs`
    

    1-1.ウィンドウを作る
    これは単にwindow を作るだけで何もできません。 200x200ピクセルの ウィンドウを作る ----------window.c #include int main (int argc, char *argv[]) { GtkWidget *window; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_show (window); gtk_main (); return 0; } --------------------
    1-2 ウィンドウに ボタンを2つ(Menu1,Menu2と書かれたボタン)垂直に配置し、 それぞれのボタンを click すると Hello を出力する。
    -------------------------button01.c /*box 垂直*/ #include /* void callback (GtkWidget *widget, gpointer data) { g_print ("Hello again - %s was pressed\n", (char *) data); } void delete_event (GtkWidget *widget, GdkEvent *event, gpointer data) { gtk_main_quit (); } */ int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *vbox; GtkWidget *button; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_signal_connect (GTK_OBJECT (window),"destroy", GTK_SIGNAL_FUNC(gtk_main_quit), NULL); gtk_container_border_width (GTK_CONTAINER (window), 5); gtk_window_set_title (GTK_WINDOW (window), "My Menu"); /*コンテナに配置*/ vbox = gtk_vbox_new(FALSE, 0); gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show(vbox); /*ボックスに配置*/ button = gtk_button_new_with_label ("Menu1"); gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, FALSE, 0); gtk_widget_show(button); button = gtk_button_new_with_label ("Menu2"); gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, FALSE, 0); gtk_widget_show(button); gtk_widget_show(window); gtk_main (); return 0; } ----------------
    1-3 複数のボタンを垂直に配置、一番下に quit ボタンを置く。 それぞれのボタンをクリックすると Hello を返す。
    すべて同じ言葉を返す状態 Hello again - button 1 was pressed Hello again - button 2 was pressed Hello again - button 3 was pressed Quit ボタンのクリックでプログラムを終了する。 ---------------------------------------------(button022.c) #include /* コールバック(これはすべてひとつのコールバックになっている) * この関数に渡されたデータは標準出力に表示される */ void callback (GtkWidget *widget, gpointer data) { g_print ("Hello again - %s was pressed\n", (char *) data); } /* このコールバックはプログラムを終了させる */ void delete_event (GtkWidget *widget, GdkEvent *event, gpointer data) { gtk_main_quit (); } int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *button; GtkWidget *vbox; gtk_init (&argc, &argv); /* 新しいウィンドウを作成 */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* ウィンドウのタイトル */ gtk_window_set_title (GTK_WINDOW (window), "My Menu"); /* ただちに GTK を終了させるように delete_event ハンドラを設定 */ gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (delete_event), NULL); /* このウィンドウのボーダ幅を設定 */ gtk_container_border_width (GTK_CONTAINER (window), 10); /*コンテナに配置(ボタンを垂直に配置している)*/ vbox = gtk_vbox_new(FALSE, 0); gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show(vbox); /*ボックスに配置 ボタン1を作る */ button = gtk_button_new_with_label ("button1"); gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, FALSE, 0); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (callback), (gpointer) "button 1"); gtk_widget_show(button); /* ボタン2を作る */ button = gtk_button_new_with_label ("button2"); gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, FALSE, 0); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (callback), (gpointer) "button 2"); gtk_widget_show (button); /* ボタン3を作る */ button = gtk_button_new_with_label ("button3"); gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, FALSE, 0); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (callback), (gpointer) "button 3"); gtk_widget_show (button); /* "Quit" ボタンを作る */ button = gtk_button_new_with_label ("Quit"); /* Quit ボタンを置く*/ gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, FALSE, 0); /* ボタンが押された時に、"delete_event" 関数を呼び、プログラムを終 * 了させる */ gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (delete_event), NULL); gtk_widget_show (button); gtk_widget_show (window); gtk_main (); return 0; } /* example-end */ ---------------------------------------------
    1-3 複数ボタンをクリックしたとき、それぞれ違う言葉を出力する。
    コールバックのお試し
    Hello again - button 1 was pressed Hello, How are you? - button 2 was pressed You are Welcome - button 3 was pressed quit でプログラム終了 ---------------------------------------------(button023.c) #include /* コールバック。 * この関数に渡されたデータは標準出力に表示される */ void callback1(GtkWidget *widget, gpointer data) { g_print ("Hello again - %s was pressed\n", (char *) data); } void callback2(GtkWidget *widget, gpointer data) { g_print ("Hello, How are you? - %s was pressed\n", (char *) data); } void callback3(GtkWidget *widget, gpointer data) { g_print ("You are Welcome - %s was pressed\n", (char *) data); } /* このコールバックはプログラムを終了させる */ void delete_event (GtkWidget *widget, GdkEvent *event, gpointer data) { gtk_main_quit (); } int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *button; GtkWidget *vbox; gtk_init (&argc, &argv); /* 新しいウィンドウを作成 */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* そのウィンドウのタイトルを設定 */ gtk_window_set_title (GTK_WINDOW (window), "My Menu"); /* ただちに GTK を終了させるように delete_event ハンドラを設定 */ gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (delete_event), NULL); /* このウィンドウのボーダ幅を設定 */ gtk_container_border_width (GTK_CONTAINER (window), 10); /*コンテナに配置*/ vbox = gtk_vbox_new(FALSE, 0); gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show(vbox); /*ボックスに配置 ボタン1を作る */ button = gtk_button_new_with_label ("button1"); gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, FALSE, 0); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (callback1), (gpointer) "button 1"); gtk_widget_show(button); /* ボタン2を作る */ button = gtk_button_new_with_label ("button2"); gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, FALSE, 0); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (callback2), (gpointer) "button 2"); gtk_widget_show (button); /* ボタン3を作る */ button = gtk_button_new_with_label ("button3"); gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, FALSE, 0); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (callback3), (gpointer) "button 3"); gtk_widget_show (button); /* "Quit" ボタンを作る */ button = gtk_button_new_with_label ("Quit"); /* Quit ボタンを置く*/ gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, FALSE, 0); /* ボタンが押された時に、"delete_event" 関数を呼び、プログラムを終 * 了させる */ gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (delete_event), NULL); gtk_widget_show (button); gtk_widget_show (window); gtk_main (); return 0; } /* example-end */ ---------------------------------------------
    1-4 tabel に配置してみる。 GtkWidget *table; を使う。 ボタンを水平に配置し、下段にquit ボタン1つ置く。
    ボタンの位置 ______________ | 1 2 | | 3 quit | ------------- ----------------------------button024.c #include /* コールバック。 * この関数に渡されたデータは標準出力に表示される */ void callback1(GtkWidget *widget, gpointer data) { g_print ("Hello again - %s was pressed\n", (char *) data); } void callback2(GtkWidget *widget, gpointer data) { g_print ("Hello, How are you? - %s was pressed\n", (char *) data); } void callback3(GtkWidget *widget, gpointer data) { g_print ("You are Welcome - %s was pressed\n", (char *) data); } /* このコールバックはプログラムを終了させる */ void delete_event (GtkWidget *widget, GdkEvent *event, gpointer data) { gtk_main_quit (); } int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *button; GtkWidget *table; gtk_init (&argc, &argv); /* 新しいウィンドウを作成 */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* そのウィンドウのタイトルを設定 */ gtk_window_set_title (GTK_WINDOW (window), "My Menu"); /* ただちに GTK を終了させるように delete_event ハンドラを設定 */ gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (delete_event), NULL); /* このウィンドウのボーダ幅を設定 */ gtk_container_border_width (GTK_CONTAINER (window), 10); /* 3x2 テーブルを作成 */ table = gtk_table_new (3, 2, TRUE); /* メインウィンドウにテーブルを配置 */ gtk_container_add (GTK_CONTAINER (window), table); /*ボックスに配置 ボタン1を作る */ button = gtk_button_new_with_label ("button1"); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (callback1), (gpointer) "button 1"); /* テーブルの左上の左1 [quadrant] に button 1 を挿入 */ gtk_table_attach_defaults (GTK_TABLE(table), button, 0, 1, 0, 1); gtk_widget_show(button); /* ボタン2を作る */ button = gtk_button_new_with_label ("button2"); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (callback2), (gpointer) "button 2"); /*上段右*/ gtk_table_attach_defaults (GTK_TABLE(table), button, 1, 2, 0, 1); gtk_widget_show (button); /* ボタン3を作る */ button = gtk_button_new_with_label ("button3"); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (callback3), (gpointer) "button 3"); gtk_table_attach_defaults (GTK_TABLE(table), button, 0, 1, 1, 2); gtk_widget_show (button); /* "Quit" ボタンを作る */ button = gtk_button_new_with_label ("Quit"); /* Quit ボタンを置く*/ gtk_table_attach_defaults (GTK_TABLE(table), button, 1, 2, 1, 2); /* ボタンが押された時に、"delete_event" 関数を呼び、プログラムを終 * 了させる */ gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (delete_event), NULL); gtk_widget_show (button); gtk_widget_show (table); gtk_widget_show (window); gtk_main (); return 0; } /* example-end */ ----------------------------------------------