試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

C言語でGTK+ 2を扱う上での幾つかのメモ(第2回)

「C言語でGTK+ 2を扱う上での幾つかのメモ(第1回)」の続き。

基本的な形

用いるヘッダファイル

ヘッダファイルはgtk/gtk.hを参照する。GTK+ 2ではGLib 2の関数(「g_」で始まる名前の関数)を用いることも多いが、GLib 2のヘッダファイル(glib/glib.h)はプログラムから直接参照する必要はない。

流れ

C言語でGTK+を直接用いる場合の流れの例としては

  1. メッセージの国際化に関する処理(任意/メッセージ国際化を行う場合のみ)
  2. gtk_init()による初期化
  3. GUI部品の処理(作成や表示,各種設定など)
  4. GUI部品ごとにイベント(GObjectシグナル)とハンドラ関数を関連付け(接続)
  5. gtk_main()によるメインループ開始
  6. メインループを抜けた後に行う必要のある処理がある場合、必要に応じて記述

のようになる。

#include <gtk/gtk.h>
#include <stdlib.h>

int
main (int argc, char **argv)
{
  /* メッセージの国際化を行う場合にはbindtextdomain()などの関数をここで呼ぶ */

  gtk_init (&argc, &argv);

  /* ここにGUI部品の処理とシグナル接続などを記述... */

  gtk_main ();

  /* gtk_main_quit()によりメインループを抜けたときに行いたい処理がある場合はここに記述 */

  return EXIT_SUCCESS;
}

この他、コマンド行引数の解析などの別の処理が必要であれば、最初の段階で行う。

非常にシンプルな例

下は「Hello」と書かれた情報ダイアログを表示し、閉じると終了する。これはダイアログの実行のみでメインループは用いていない。
[任意]ファイル名: infodialogtest.c

#include <gtk/gtk.h>
#include <stdlib.h>

/*
 * gcc -O2 -Wall -Wextra $(pkg-config --cflags --libs gtk+-2.0) infodialogtest.c -o infodialogtest
 */

int
main (int argc, char **argv)
{
  /* ダイアログのGUI部品 */
  GtkWidget *dialog;
  /* GTK+の初期化 */
  gtk_init (&argc, &argv);
  /*
   * メッセージダイアログを作成
   * http://library.gnome.org/devel/gtk/stable/GtkMessageDialog.html#gtk-message-dialog-new
   */
  dialog = gtk_message_dialog_new (NULL,               /* 親ウィンドウ or NULL */
                                   0,                  /* ダイアログの設定フラグ */
                                   GTK_MESSAGE_INFO,   /* ダイアログの種類 */
                                   GTK_BUTTONS_CLOSE,  /* ボタンの並びの種類 */
                                   "Hello");           /* メッセージ内容 */
  /* ダイアログを実行 */
  gtk_dialog_run (GTK_DIALOG (dialog));  /* 「GtkDialog *」型を要求 マクロで型変換する */
  /* GUI部品を破棄,中に部品を含む場合はそれも含めて破棄する */
  gtk_widget_destroy (dialog);
  /* ダイアログを出すだけのプログラムなのでメインループは回さないで終了する */
  return EXIT_SUCCESS;
}


データの型とgtk_dialog_run()の行のような型変換,gtk_widget_destroy()の処理などについては別記事で扱う。

(「C言語でGTK+ 2を扱う上での幾つかのメモ(第3回)」に続く)

関連記事: