Message Dialog of Programming memorandum


HOME > Message Dialog

4種類のMessage Dialog

Message Dialogs

手本にしたコーディング例について

warningdialog.png
まず最初によく使われるMessage Dialogの使い方について書きとめたい。下記にもあるように非常によく使われるダイアログであるからである。"GTK+ dialogs"という標題のサイト(http://zetcode.com/gui/gtk2/gtkdialogs/)
に、”Messagedialogs”、”GtkAboutDialog”、”GtkFontSelectionDialog”、
”GtkColorSelectionDialog”について簡単な使用例が載っている。
そこでは最初に、次のように書かれている。
”In this part of the GTK+ programming tutorial, we work with dialogs. ”
”Dialog windows or dialogs are an indispensable part of most modern GUI applications. A dialog is defined as a conversation between two or more persons. In a computer application a dialog is a window which is used to "talk" to the application. A dialog is used to input data, modify data, change the application settings etc. ”
googleで翻訳すると
「ダイアログウィンドウやダイアログは、最も近代的なGUIアプリケーションの不可欠な一部です。ダイアログは2人以上の会話のように定義されています。コンピュータアプリケーションではダイアログがアプリケーションに「話す」ために使用されるウィンドウです。ダイアログは、データを入力するために使用される、等のアプリケーションの設定を変更し、データを変更します」
という事である。GNOMEのジャパニーズ英語みたいな英文と比べると、ここに書かれている文章はとてもまともで分かりやすい。機械翻訳のままでも良しとしょう。
ここに載っているのはGTK2.0についての記述であるから、少し注意しなければいけないが、割とスッキリまとめられていたので、Message dialogについては、これ(messagedialogs.c)を使用させてもらった。ただ、私の用途に合わせて変更したが、この方が様々な用途で実用的と考えている。

元のコードの変更点

momiji3.jpg写真のキャプションを入力します。(1)引数”GtkWidget *widget”を廃止した。
   例ではボタンを
      info = gtk_button_new_with_label("Info");
   のようにラベルとともに設定して、
      g_signal_connect(G_OBJECT(info), "clicked",
           G_CALLBACK(show_info), (gpointer) window);
   の中で、G_OBJECT(info)という形で呼び出しているが、私の使用方法を見れ
   ば分かるように確認のためのメッセージダイアログなので、ダイアログを表示
   して返答を待つ形にした。

(2)タイトルとメッセージを固定化しないで柔軟に設定できるように引数”char *title”と”char *message”を付加した。
   呼び出し側では、
      show_warning("処理エラー", "項目が選択されていません", (gpointer) window);
   のように直接タイトルやメッセージを書き込んでやれば、応答があるまで待ちの状態になる。もちろん、変数にメッ
   セージを設定してそのポインタを渡してもよい。

(3)Questionのダイアログだけはint型にして値を返すようにした。他はvoid型である。
      int show_question(char *title, char *message, gpointer window)
   ここだけは、”GTK_BUTTONS_YES_NO”であり、「OK」と「NO」の2つのボタンが表示される。
   他は”GTK_BUTTONS_OK”となっているので「OK」ボタンのみが表示され、”GTK_RESPONSE_OK = -5”しか返ってこない
   が、Questionのダイアログでは”GTK_RESPONSE_YES = -8”または”GTK_RESPONSE_NO = -9”が返ってくるので、
   その結果によって条件分岐する場合があるからである。

(4)gtk_message_dialog_new()の5番目の引数の追加。
   参考サイトのコードをコンパイルするとWarningが出る。動作する上では問題ないがたくさんのWarningは本当の
   エラーを見えにくくするので、参考2にしたがい”printf()-style format string, or NULL.”を用いた。下記の最初で
   は”GTK_MESSAGE_INFO”であるから改めて「情報:」というmessageの前の文言を表示したくなければ、
   ”"%s",message”のように表記すればよい。

メッセージダイアログのコード

/***************************************

  • メッセージダイアログ

****************************************/

#include <gtk/gtk.h>

void show_info(char *title, char *message, gpointer window) {
    GtkWidget *dialog;
    dialog = gtk_message_dialog_new(GTK_WINDOW(window),
                         GTK_DIALOG_DESTROY_WITH_PARENT,
                         GTK_MESSAGE_INFO,
                         GTK_BUTTONS_OK,
                         "情報:%s",message);
                         //messageの前にprintfの書式が必要。
    gtk_window_set_title(GTK_WINDOW(dialog), title);//情報
    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
}

void show_error(char *title, char *message, gpointer window) {
    GtkWidget *dialog;
    dialog = gtk_message_dialog_new(GTK_WINDOW(window),
                         GTK_DIALOG_DESTROY_WITH_PARENT,
                         GTK_MESSAGE_ERROR,
                         GTK_BUTTONS_OK,
                         "エラー:%s",message);
    gtk_window_set_title(GTK_WINDOW(dialog), title);//エラー
    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
}

int show_question(char *title, char *message, gpointer window) {
    int result;
    GtkWidget *dialog;
    dialog = gtk_message_dialog_new(GTK_WINDOW(window),
                         GTK_DIALOG_DESTROY_WITH_PARENT,
                         GTK_MESSAGE_QUESTION,
                         GTK_BUTTONS_YES_NO,
                         "質問:%s",message);
    gtk_window_set_title(GTK_WINDOW(dialog), title);//質問
    result = gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
    return result;//いきなりreturn gtk_dialog_run()とするとダイアログが消去されない
}

void show_warning(char *title, char *message, gpointer window) {
    GtkWidget *dialog;
    dialog = gtk_message_dialog_new(GTK_WINDOW(window),
                         GTK_DIALOG_DESTROY_WITH_PARENT,
                         GTK_MESSAGE_WARNING,
                         GTK_BUTTONS_OK,
                         "警告:%s",message);
    gtk_window_set_title(GTK_WINDOW(dialog), title);//警告
    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
}

参考
enum GtkResponseType

typedef enum {
    GTK_RESPONSE_NONE      = -1,
    GTK_RESPONSE_REJECT     = -2,
    GTK_RESPONSE_ACCEPT     = -3,
    GTK_RESPONSE_DELETE_EVENT = -4,
    GTK_RESPONSE_OK        = -5,
    GTK_RESPONSE_CANCEL     = -6,
    GTK_RESPONSE_CLOSE       = -7,
    GTK_RESPONSE_YES       = -8,
    GTK_RESPONSE_NO        = -9,
    GTK_RESPONSE_APPLY      = -10,
    GTK_RESPONSE_HELP        = -11
} GtkResponseType;
参考2(https://developer.gnome.org/gtk3/stable/GtkMessageDialog.html#gtk-message-dialog-new)
gtk_message_dialog_new ()
GtkWidget *
gtk_message_dialog_new (GtkWindow *parent,
                GtkDialogFlags flags,
                GtkMessageType type,
                GtkButtonsType buttons,
                const gchar *message_format,
                ...);

Creates a new message dialog, which is a simple dialog with some text the user may want to see. When the user clicks a button a “response” signal is emitted with response IDs from GtkResponseType. See GtkDialog for more details.

Parameters

          parent     transient parent, or NULL for none.
           flags     flags
           type     type of message
          buttons     set of buttons to use
     message_format     printf()-style format string, or NULL.
            ...      arguments for message_format

Returns
a new GtkMessageDialog.
使用法
次の”Radio Button Dialog”の中でint型のshow_question()の例を示す。