Programmation GTK2 en Pascal/GtkMessageDialog

Programmation GTK2 en Pascal

Présentation modifier

Pour simplifier l'affichage de message à l'aide d'une boîte de dialogue, Gtk+ offre un nouveau contrôle qui dérive directement de GtkDialog : le contrôle GtkMessageDialog. Ce contrôle permet de créer une boîte de dialogue complète avec une seule fonction.

Hiérarchie modifier

Hiérarchie
GObject
  └─GtkObject
      └─GtkWidget
          └─GtkContainer
              └─GtkBin
                  └─GtkWindow
                      └─GtkDialog
                          └─GtkMessageDialog

Utilisation de bases modifier

Création modifier

L'unique fonction de ce contrôle est celle permettant de créer la boîte de dialogue :

function gtk_message_dialog_new(parent : PGtkWindow; flags : TGtkDialogFlags;
  _type : TGtkMessageType; buttons : TGtkButtonsType; message_format : Pgchar;
  args : array of const) : PGtkWidget;

Les paramètres parent et flags sont identiques à ceux du contrôle GtkDialog, nous ne reviendrons donc pas dessus et allons nous concentrer sur les nouveaux paramètres.

Le tout premier _type, permet de définir le texte qui sera affiché dans la barre de titre de la boîte de dialogue ainsi que l'icône correspondant. Ce paramètre est de type GtkMessageType et peut prendre une des quatre valeurs suivantes :

  • GTK_MESSAGE_INFO : titre de la boîte « Information » ;
  • GTK_MESSAGE_WARNING : titre de la boîte « Avertissement » ;
  • GTK_MESSAGE_QUESTION : titre de la boîte « Question » ;
  • GTK_MESSAGE_ERROR : titre de la boîte « Erreur ».

Le deuxième nouveau paramètre buttons, de type GtkButtonsType, permet de définir les boutons qui seront présents en bas de la boîte de dialogue. Les valeurs autorisées sont les suivantes :

  • GTK_BUTTONS_NONE
  • GTK_BUTTONS_OK
  • GTK_BUTTONS_CLOSE
  • GTK_BUTTONS_CANCEL
  • GTK_BUTTONS_YES_NO
  • GTK_BUTTONS_OK_CANCEL

Et le dernier paramètre message_format est tout simplement le texte qui sera affiché à l'intérieur de la boîte de dialogue. Ce texte peut être formaté comme il est possible de le faire avec la fonction Format.

Programme exemple modifier

Nous allons créer une fenêtre comportant deux boutons. Le premier permettra d'afficher les informations habituelles d'une boîte de dialogue « À propos... ». Le deuxième offrira la possibilité de quitter le programme, en passant par une demande de confirmation à l'utilisateur.

Voici le fichier gtk004.pas :

program gtk004;

uses glib2, gtk2;

procedure OnBtnAProposClick(AWidget : PGtkwidget; AData : PGPointer); cdecl;
var
  pAbout : PGtkWidget;
  Site   : PGChar;
begin
  // Création de la boîte de message 
  // Type : Information -> GTK_MESSAGE_INFO 
  // Bouton : 1 OK -> GTK_BUTTONS_OK 
  Site := '- WikiLivres -';
  pAbout := gtk_message_dialog_new (GTK_WINDOW(AData),
              GTK_DIALOG_MODAL,
              GTK_MESSAGE_INFO,
              GTK_BUTTONS_OK,
              'Cours Gtk+ 2.0 en Pascal'#13#10'%s', [Site]);

  // Affichage de la boîte de message 
  gtk_dialog_run(GTK_DIALOG(pAbout));

  // Destruction de la boîte de message 
  gtk_widget_destroy(pAbout);
end;

procedure OnBtnQuitterClick(AWidget : PGtkwidget; AData : PGPointer); cdecl;
var
  pQuestion : PGtkWidget;
begin
  // Création de la boîte de message
  // Type : Question -> GTK_MESSAGE_QUESTION 
  // Boutons : 1 OUI, 1 NON -> GTK_BUTTONS_YES_NO 
  pQuestion := gtk_message_dialog_new(GTK_WINDOW(AData),
                 GTK_DIALOG_MODAL,
                 GTK_MESSAGE_QUESTION,
                 GTK_BUTTONS_YES_NO,
                 'Voulez vous vraiment'#13#10'quitter ce programme?');

  // Affichage et attente d'une réponse 
  case gtk_dialog_run(GTK_DIALOG(pQuestion)) of
    GTK_RESPONSE_YES : begin
      // OUI -> on quitte l application 
      gtk_main_quit;
    end;
    GTK_RESPONSE_NO : begin
      // NON -> on detruit la boite de message 
      gtk_widget_destroy(pQuestion);
    end;
  end;
end;

var
  pFenetre    : PGtkWidget;
  pVBox	      : PGtkWidget;
  pBtnAPropos : PGtkWidget;
  pBtnQuitter : PGtkWidget;
begin
  gtk_init(@argc, @argv);
  pFenetre := gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(pFenetre), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(pFenetre), 320, 200);
  gtk_window_set_title(GTK_WINDOW(pFenetre), 'Fenêtre principale');
  gtk_signal_connect(pGTKOBJECT(pFenetre), 'destroy', GTK_SIGNAL_FUNC(@gtk_main_quit), NULL);

  // Création de la GtkVBox
  pVBox := gtk_vbox_new(TRUE, 0);
  gtk_container_add(GTK_CONTAINER(pFenetre), pVBox);

  // Création des boutons
  pBtnAPropos := gtk_button_new_with_label('À propos...');
  gtk_box_pack_start(GTK_BOX(pVBox), pBtnAPropos, TRUE, FALSE, 0);
  g_signal_connect(pGTKOBJECT(pBtnAPropos), 'clicked', 
                   GTK_SIGNAL_FUNC(@OnBtnAProposClick), pGTKOBJECT(pFenetre));

  pBtnQuitter := gtk_button_new_from_stock(GTK_STOCK_QUIT);
  gtk_box_pack_start(GTK_BOX(pVBox), pBtnQuitter, TRUE, FALSE, 0);
  g_signal_connect(pGTKOBJECT(pBtnQuitter), 'clicked', 
                   GTK_SIGNAL_FUNC(@OnBtnQuitterClick), pGTKOBJECT(pFenetre));

  gtk_widget_show_all(pFenetre);
  gtk_main;
end.

Voila ce que donne l'exécution du programme gtk004 :

La fenêtre principale s'affiche et on clique sur le bouton « À propos... »

 

On clique sur « Valider » puis de retour dans la fenêtre principale on clique sur « Quitter »

 

Fenêtres : GtkWindow ~ GtkDialog ~ GtkMessageDialog