IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

[Gtk/Gdk] Image de fond qui cache les widgets


Sujet :

GTK+ avec C & C++

  1. #1
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut [Gtk/Gdk] Image de fond qui cache les widgets
    Bonjour,

    J'ai trouvé ce code pour afficher une image de fond dans une fenêtre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     #include <gtk/gtk.h>
     
    void fond_ecran_set(GtkWidget *pWindow, gpointer user_data)
    {
    	GdkPixmap *pixmap_fond=(GdkPixmap*) user_data;
     
    	if (pixmap_fond)
    	{
    		gdk_window_set_back_pixmap (pWindow->window, pixmap_fond, FALSE);
    	}
    }
     
    gboolean fond_ecran_expose(GtkWidget *pWindow, GdkEventExpose *event, gpointer user_data)
    {
    	GdkPixmap *pixmap_fond=(GdkPixmap*) user_data;
     
    	if (pixmap_fond)
    	{
    		gdk_window_set_back_pixmap (pWindow->window, pixmap_fond, FALSE);
     
    		return TRUE;
    	}
     
    	return FALSE;
    }
     
    gint main(int argc, char **argv)
    {
    	GtkWidget *pWindow;
    	GdkPixbuf *pixbuf_fond=NULL;
    	GdkPixmap *pixmap_fond=NULL;
     
    	// Initialisation des librairies GTK+
    	gtk_init(&argc, &argv);
     
    	// Création d'une fenêtre principale.
    	pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_title(GTK_WINDOW(pWindow), "Fenêtre principale");
    	gtk_window_set_default_size(GTK_WINDOW(pWindow), 800, 600);
     
    	// Chargement de l'image dans un pixbuf à la taille de la fenêtre (pensez à changer le nom et le chemin)
    	pixbuf_fond=gdk_pixbuf_new_from_file_at_size("./08_1280x1024.jpg", 800,600, NULL);
     
    	/* Si le chargement a réussi on crée le pixmap qui sera utilisé pour le fond.
    	Dans le cas contraire pixmap_fond=NULL. Cette valeur étant transmise aux fcts
    	d'affichage, on peut a tout moment savoir si on peut afficher ou non.*/
    	if (pixbuf_fond)
    	{
                    // Création d'un GdkPixmap vierge
    		pixmap_fond=gdk_pixmap_new(pWindow->window,
                                                                        gdk_pixbuf_get_width(pixbuf_fond),
                                                                        gdk_pixbuf_get_height(pixbuf_fond),
                                                                        gdk_visual_get_system()->depth);
     
                    // insertion du GdkPixbuf (image chargée) dans le GdkPixmap.
    		gdk_draw_pixbuf(pixmap_fond, pWindow->style-> fg_gc[GTK_WIDGET_STATE (pWindow)], pixbuf_fond,0,0,0,0,
                                                 gdk_pixbuf_get_width(pixbuf_fond), gdk_pixbuf_get_height(pixbuf_fond),
                                                 gdk_visual_get_system()->depth,0,0);
     
                    // Supression du GdkPixbuf devenu inutile
    		g_object_unref(pixbuf_fond);
    	}
     
    	/* Signaux associés pour l'affichage de l'image de fond.
    	Vous pourrez y ajouter le signal "size-allocate" pour modifier la taille de
    	l'image de fond en fonction de la taille de la fenêtre.*/
    	g_signal_connect(G_OBJECT(pWindow), "realize", G_CALLBACK(fond_ecran_set), pixmap_fond);
    	g_signal_connect(G_OBJECT(pWindow), "expose-event", G_CALLBACK(fond_ecran_expose), pixmap_fond);
     
    	// Signaux associés à la fenêtre principale pour quitter.
    	g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
    	g_signal_connect(G_OBJECT(pWindow), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
     
    	// Boucle principale GTK+
    	gtk_widget_show_all(pWindow);
    	gtk_main();
     
    	return 0;
    }
    Le problème est que tous mes objets sont cachés

    Peux t-on résoudre ce problème ?

    Merci
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Salut.

    J'ai écris ce code il y a un bon moment maintenant. Malheureusement le défaut que tu décris est inhérent au fonctionnement de Gtk+.

    La seule méthode que j'ai trouvé et d'utiliser les GtkRc. Oubli le code précédent.

  3. #3
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    WhaoU... ca à l'air super compliqué pour un new en Gtk

    Tu pourrais me donner un exemple d'application ?

    Merci
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    L'explication complète se trouve bien sûr ici (en anglais).

    Maintenant un petit exemple ne fera pas de mal. Ce qu'il ne faut pas oublier c'est qu'un fichier GtkRc est écrit sous la forme d'une déclaration de style que l'on affecte ensuite à l'objet de notre choix. Dans l'exemple qui suit j'ai simplement affecté une image de fond ainsi qu'une couleur de fond à tous les objets de type GtkWidget*.

    Tout d'abord voici le code exemple qui ne fait qu'ouvrir une simple fenêtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #include <gtk/gtk.h>
     
     
    gint main (gint argc, gchar **argv)
    {
      GtkWidget *Window = NULL;
     
      gtk_init (&argc, &argv);
     
    	// Configuration aspect graphique de l'interface par un Gtkrc
    	gtk_rc_parse("./gtkrc.rc");
     
    	Window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
     
    	g_signal_connect(G_OBJECT(Window), "destroy", (GCallback)gtk_main_quit, NULL);
     
    	gtk_widget_show_all (Window);
     
    	gtk_main ();
     
      return 0;
    }
    Dans ce code on voit la ligne gtk_rc_parse("./gtkrc.rc");. Ici on charge le fichier de configuration dans lequel on aura décrit l'aspect graphique de nos différents widget.

    Voici ce fichier de configuration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    pixmap_path "./"
     
    style "Windows"
    {
    	bg_pixmap[NORMAL] = "info016.gif"
    	bg[NORMAL] = "#CC9664"
    	fg[NORMAL] = "yellow"
    	fg[INSENSITIVE] = "white"
    }
    class "GtkWindow" style "Windows"
    En première ligne on spécifie le répertoire dans lequel on trouvera les images utilisées.

    Je crée un nouveau style que j'appelle "Windows". Je configure ce style pour que l'image de fond soit "info016.gif" (change le nom de l'image en donnant une image valide sur ton disque), la couleur de fond (bg : BackGround) et la couleur d'avant plan (fg : ForeGround) en jaune.
    NORMAL, INSENSITIVE correspond à l'état de l'objet. Un bouton enfoncé ou relâché par exemple.

    Une remarque. Si ton image dispose d'un canal alpha, c'est à dire d'une information de transparence la couleur de fond spécifiée viendra remplir les parties correspondantes de l'image affectée.

    Une fois le style décrit je l'affecte au widget qui m'intéresse avec le mot clé class. Ici j'affecte le style "Window" aux objets du type GtkWindow.

    Tu peux créer autant de style que tu veux. J'ai tout de même remarqué que certains widget ne tiennent pas compte de ce genre de configuration. Mais ca permet tout de même d'apporter une touche personnelle à nos interfaces.

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Bonjour à tous,

    Je n ai qu une seule chose à dire : c est formidable.
    J étais sur le point de faire un message pour demander cela.
    Grâce à toi gerald3d je peux personnifier l interface que j ai fait pour une personne en particulier.
    Enfin quand j aurais trouvé comment faire pour que mon code fonctionne sur tous les ordinateurs....quand il s installe...

    Le petit point que je n ai pas bien saisi, c est comment rendre une image transparente. Je dois remplacer les valeurs de la ligne bg[NORMAL], mais je ne sais pas comment.

    Vraiment un grand merci.

    Shazad

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    L'image de fond doit déjà avoir l'information de transparence. The gimp peut te faire ca sans problème. Tu trouveras sur la toile des infos pour savoir comment faire.

    Ensuite l'information bg[NORMAL] donne une couleur de fond générale. Tu ne peux l'utiliser pour rendre le fond totalement transparent et "voir" sous la fenêtre affichée, si c'est ca que tu recherches.

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Bonjour gerald3d,

    En fait je cherche à mettre une image en fond de fenêtre, et faire en sorte que l on puisse voir en premier plan ce qu'il y a de marqué dans les GtkLabel.
    L image que j ai est assez sombre et donc comme le texte des GtkLabel est noir, alors on a du mal à les voir.
    Ce que je peux faire c est de mettre aux texte des GtkLabel, une couleur qui se verras. Rouge par exemple.
    Tiens d ailleurs c est marrant quand j ouvre the GIMP, la fenêtre qui comporte les outils prend à un endroit l image que je souhaite mettre dans mon interface.

    Je souhaiterais te poser une petite question stp :

    Je code cette interface avec Code Blocks. Le dossier est sur le "Bureau".
    J ai suivi le tutoriel de Nicolas Joseph pour installer le "gtk+-bundle" et le gtk2-themes. MinGW est donc installer à la racine de Code Block dans Program Files.
    Quand je lance Gtk2-thème et que je sélectionne "Clearlook" par exemple pour avoir une interface plus agréable, tout fonctionne correctement.
    Une fois que j ai compile mon programme avec Inno Setup pour en faire un exécutable et que je l installe sur l ordinateur j ai l interface dessiné par Windows qui est très moche.

    Il y aurait il une solution pour compiler mon programme et qu il s installe partout avec une interface que j ai choisis dans Gtk2-thème ?

    Merci par avance.

    Shazad

  8. #8
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    La programmation sous Windows? Heu! comment dire? Je n'y comprends rien

    D'autres pourront surement t'aider sur ce point.

  9. #9
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Zut c est dommage .
    Mais rien ne m empêche de remettre en route ma Mandriva et Kdevelop.
    Je vais peut être bien essayer.
    En tous les cas, encore merci.

    J espère qu'une âme charitable viendras à mon secours.

    Shazad

  10. #10
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Pour ma part, merci beaucoup !
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  11. #11
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    De rien

  12. #12
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Au fait, c'est normal que ca ne marche pas sur les Widgets GTKBOX ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    style "vbox"
    {
     
    /* bg_pixmap[NORMAL] = "cadre.gif"	*/
    /* bg[NORMAL] = "yellow" */
    base[NORMAL] = "yellow"
    }
    class "GtkVBox" style "vbox"
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  13. #13
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Comme je l'ai écrit certains widgets ne réagissent pas forcément à la programmation GtkRc. Maintenant les GtkVBox héritent des GtkBox. En affectant ton style plutôt à ces derniers tu auras peut être un meilleur résultat.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 5
    Par défaut
    J'ai également essayé de faire comme décrit, donc avec le fichier gtkrc.rc et la déclaration de style, mais à la compilation j'ai une erreur:
    "can't open file `style': No such file or directory"

  15. #15
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Un simple problème de chemin non résolu. Il ne trouve pas le fichier style que tu lui indiques. Vérifies la syntaxe.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/03/2009, 13h29
  2. Une image de fond qui s'adapte à la taille de son conteneur
    Par gifffftane dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/03/2008, 13h44
  3. [EasyPHP] Image de fond qui ne s'affiche pas en localhost
    Par Falcokeo dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 23/02/2008, 03h09
  4. image de fond qui occupe tout l'élément
    Par faamugol dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 06/12/2007, 23h04
  5. image en fond qui prenne toute la place de son conteneur
    Par funckfot dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 05/04/2006, 14h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo