[gtk+] fenêtre popup animée en bas à droite de l' écran

5/5 (3 avis)

Vue 12 923 fois - Téléchargée 744 fois

Description

Bonjour,
Voici une fenêtre popup animée sans bordure, qui apparait progressivement en bas à droite de l' écran.

Idéal pour des popups du genre "Vous avez quarante-douze nouveaux messages".

GTK+ permet non seulement une excellente portabilité du code, mais il induit une autre approche de la programmation GUI, plus simple que la programmation win32 classique. Le code est simple, court, et facilement lisible.

Le principe de la fenêtre popup repose sur une fonction appelée par le main().
Cette fonction crée la fenêtre et la faire apparaître.
La fenêtre est déplacée avec la méthode gtk_window_move à intervalle régulier grâce à la fonction g_timeout_add() qui exécute une fonction à intervalle régulier.
Cliquer sur le bouton pour la faire redescendre.

Source / Exemple :


#include <gtk/gtk.h>

 gint x, y, departY, destY;
 guchar intervalle=1;
 GtkWidget *fen;

void cbx_popup_new(gchar *caption, guchar vitesse);

int main( int argc, char **argv )
{
  gtk_init (&argc, &argv);
  cbx_popup_new (
	"<span face=\"Courier New\"><b>Courier New 10 Gras</b></span>\n\n"
        "<span font_desc=\"Times New Roman italic 12\" foreground=\"#0000FF\">"
		"Times New Roman\n12 Italique"
	"</span>", 98);
  gtk_main ();
  return 0;
}

gboolean Monter()
{
  y-=1;
  if (y < destY) return FALSE;
  gtk_window_move (GTK_WINDOW(fen), x, y);
  return TRUE;
}

gboolean Descendre()
{
  y+=1;
  if (y > departY) 
  {
   gtk_widget_destroy (fen);
   return FALSE;
  }
  gtk_window_move (GTK_WINDOW(fen), x, y);
  return TRUE;
}

void OK_Click()
{
  g_timeout_add(intervalle, (gpointer)Descendre, (gpointer)fen);
}

// Crée la fenêtre popup et démarre l' animation
void cbx_popup_new(gchar *caption, guchar vitesse)
{
  GtkWidget *vbox, *label, *button;
  GdkScreen *s;

  // Vitesse
    intervalle = (vitesse > 100) ? 1 : 101-vitesse;

  // Obtient résolution de l' écran
    s = gdk_screen_get_default();
    x = gdk_screen_get_width (s) - 240;
    departY = y = gdk_screen_get_height(s);
    destY   = y - 160;

  // Crée la fenêtre
  fen = gtk_window_new (GTK_WINDOW_POPUP);
    gtk_window_move    (GTK_WINDOW(fen), x, y);
    g_signal_connect(G_OBJECT(fen),"destroy",G_CALLBACK(gtk_main_quit),NULL);
    gtk_window_set_default_size     (GTK_WINDOW(fen), 200, 100);
    gtk_container_border_width(GTK_CONTAINER(fen),3);

  vbox = gtk_vbox_new (FALSE, 10);
  gtk_container_add (GTK_CONTAINER (fen), vbox);

  // Label
  label=gtk_label_new(NULL);
     gtk_label_set_markup(GTK_LABEL(label), caption);
     gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
  /*
  label = gtk_label_new (caption);
     gtk_label_set_line_wrap_mode (GTK_LABEL(label), PANGO_WRAP_WORD);

  • /
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 10); // Bouton fermer button = gtk_button_new_with_label ("OK"); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(OK_Click),(gpointer)fen); gtk_widget_show_all (fen); // On monte. g_timeout_add exécute la fonction Monter() à intervalle régulier g_timeout_add(intervalle, (gpointer)Monter, (gpointer)fen); }

Conclusion :


Pour compiler sous windows:
1) Télécharger le runtime d'exécution http://gtk.alkia.org/ et installez le dans Program Files/fichiers communs/GTK/2.0
2) Sous Dev-cpp installez le package du même site puis compiler/exécuter.

Pour compiler/exécuter sous linux:
1) Installez les headers de développement GTK+. Sous debian: # aptitude install libgtk2.0-dev
2) Pour compiler, pas besoin de makefile pour un projet aussi simple. Une commande:
$ gcc -Wall -s pop.c -o pop `gtk-config --cflags --libs gtk+-2.0`
et pour exécuter, double-cliquer sur l'exe ou saissiez cette commande:
$ ./pop

Codes Sources

A voir également

Ajouter un commentaire Commentaires
gusgusle Messages postés 3 Date d'inscription vendredi 2 septembre 2005 Statut Membre Dernière intervention 19 décembre 2008
19 déc. 2008 à 16:00
Je peux utiliser ton code sachant que j'utilise Qt ?
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
7 août 2007 à 06:44
ca marche tres bien :)
cs_morel16 Messages postés 3 Date d'inscription lundi 13 novembre 2000 Statut Membre Dernière intervention 5 août 2007
5 août 2007 à 11:51
Salut jo,

Pas mal ce code, peut-etre utile. :)
Si j'arrive à modifier un peu le code (Contour de la fenêtre... par exemple) je m'en servirai dans de futur programme.

Bonne continuation.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.