Commentçamarche.net
CodeS-SourceS
Rechercher un code, un tuto, une réponse

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

5/5 (3 avis)

Vue 9 812 fois - Téléchargée 353 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

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.