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

Soyez le premier à donner votre avis sur cette source.

Vue 11 869 fois - Téléchargée 644 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
-
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
-
ca marche tres bien :)
cs_morel16
Messages postés
6
Date d'inscription
lundi 13 novembre 2000
Statut
Membre
Dernière intervention
5 août 2007
-
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.