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 :

Redimensionnement bug


Sujet :

GTK+ avec C & C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut Redimensionnement bug
    Bonjour,

    Je suis entrain de créer une interface avec 4 boutons et 1 pixbuf au milieu.
    J'utilise un tableau pour ça et j'essaye de redimensionner. Le fait d'agrandir la window fonctionne, mais reduire bug.. :/
    Je ne comprends pas et si quelqu'un sait pourquoi je veux bien savoir ! :p
    Voici le bout de code :

    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
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
    typedef struct		s_display
    {
        GtkWidget		*pWindow;
        GtkWidget		*pTable;
        GtkWidget		*pButton[5];
        GdkPixbuf		*pixbuf;
    }					t_display;
     
    t_display			win;
     
    void				resize_pixbuf(GtkWidget *window, GdkEventExpose *event, gpointer user_data)
    {
    	static gint		width = 1;
    	static gint		height = 1;
     
    	if ((window->allocation.width != width) || (window->allocation.height != height))
    	{
    		g_object_unref(win.pixbuf);
    		width = window->allocation.width;
    		height = window->allocation.height;
    		printf("width %d height %d\n", width, height);
    		win.pixbuf = gdk_pixbuf_new_from_file("./image.jpg", NULL);
    		win.pixbuf = gdk_pixbuf_scale_simple(win.pixbuf, width / 3, height / 3, GDK_INTERP_BILINEAR);
    		gtk_widget_destroy(win.pButton[4]);
    		win.pButton[4] = gtk_image_new_from_pixbuf(win.pixbuf);
    		gtk_table_attach_defaults(GTK_TABLE(win.pTable), win.pButton[4], 2, 8, 1, 5);
    	}
    	gtk_widget_show_all(window);
    }
     
    int					main(int argc, char **argv)
    {
    	gtk_init(&argc, &argv);
     
    	// creation de la window
        win.pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_default_size(GTK_WINDOW(win.pWindow), 500, 300);
        gtk_window_set_title(GTK_WINDOW(win.pWindow), "Epicam");
     
        // Creation et insertion de la table dans la window
        win.pTable = gtk_table_new(10, 10, TRUE);
        gtk_container_add(GTK_CONTAINER(win.pWindow), GTK_WIDGET(win.pTable));
     
    	// creation des boutons
    	win.pButton[0]= gtk_button_new_with_label("Module 1");
        win.pButton[1]= gtk_button_new_with_label("Module 2");
        win.pButton[2]= gtk_button_new_with_label("Module 3");
        win.pButton[3]= gtk_button_new_with_label("Preferences");
     
    	// ajout du pixbuf dans la table
        win.pixbuf = gdk_pixbuf_new_from_file("./image.jpg", NULL);
    	win.pixbuf = gdk_pixbuf_scale_simple(win.pixbuf, 300, 100, GDK_INTERP_BILINEAR);
    	win.pButton[4] = gtk_image_new_from_pixbuf(win.pixbuf);
        gtk_table_attach_defaults(GTK_TABLE(win.pTable), win.pButton[4], 2, 8, 1, 5);
     
    	// ajout des boutons dans la table
    	gtk_table_attach(GTK_TABLE(win.pTable), win.pButton[0], 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
        gtk_table_attach(GTK_TABLE(win.pTable), win.pButton[1], 1, 2, 4, 5, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
    	gtk_table_attach(GTK_TABLE(win.pTable), win.pButton[2], 8, 9, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
        gtk_table_attach(GTK_TABLE(win.pTable), win.pButton[3], 8, 9, 4, 5, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
     
    	g_signal_connect(G_OBJECT(win.pWindow), "size-request", G_CALLBACK(resize_pixbuf), &win);
    	g_signal_connect(G_OBJECT(win.pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
     	gtk_widget_show_all(win.pWindow);
    	gtk_main();
        return EXIT_SUCCESS; 
    }
    Merci d'avance.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Je sais pas ce que ça veut dire "réduire bug". Décris plus précisément ce qu'il se passe quand tu tentes de réduire, et ce que tu aimerais qu'il se passe, ça permettra de t'aider plus efficacement

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    Salut,

    Je viens de tester un peu plus le programme. En fait, même le fait d'agrandir petit a petit la fenêtre bug. Je ne sais pas pourquoi mais mes valeurs width et height dans resize_pixbuf continuent de s'incrementer.
    Si jamais t'as un peu le temps, le code est compilable avec une de tes images et tu comprendras peut-être mieux ou je veux en venir ^^.
    Merci.

  4. #4
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut
    Salut,

    Y'a un truc qui me chiffonne : pourquoi relis-tu l'image depuis le disque à chaque rafraichissement ? Je sais pas si le problème vient de là, mais ce n'est en tout cas pas très bon pour les performances...

    Laisse simplement l'image originale dans le win.pixbuf, puis dans la fonction resize_pixbuf, fais simplement un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    width = window->allocation.width;
    height = window->allocation.height;
    printf("width %d height %d\n", width, height);
    GdkPixbuf *pix = gdk_pixbuf_scale_simple(win.pixbuf, width / 3, height / 3, GDK_INTERP_BILINEAR);
    gtk_image_set_from_pixbuf(GTK_IMAGE(win.pButton[4]), pix);
    g_object_unref(G_OBJECT(pix));

    Note : je n'ai pas testé car je n'ai pas de quoi compiler du gtk

    -

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    Le truc c'est qu'après j'aurais besoin de recharger l'image a chaque fois sachant que je vais travailler avec une camera traitée avec opencv :/

  6. #6
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut
    Ah, OK, dans ce cas ça se tient.

    N'empêche que si j'étais toi, je ferais une fonction qui recharge l'image dans win.pixbuf à intervalle régulier, et une autre fonction qui gère seulement le redimensionnement.

    En effet, lors du redimensionnement, la fonction peut être appelée plusieurs dizaines de fois par seconde, d'où une perte de performances évitable.

    -

  7. #7
    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
    Le genre de problème que tu rencontre arrive souvent. Le fait de mettre l'image à taille exacte du conteneur provoque l'agrandissement de quelques pixels de ce même conteneur...et c'est sans fin.
    Il faut que tu enlèves quelques pixels à la taille de la nouvelle image par rapport à celle du conteneur. Par exemple 5 pixels de chaque côté.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    Merci de vos réponses .

    Une fonction le fait ou je dois faire un truc du style width / 3 - 5 ?

  9. #9
    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
    tu le fais toi-même.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    ok merci

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    Bonjour,

    J'ai trouve la solution du redimensionnement qui se fait infiniment, mais cela a engendre un autre.. Maintenant je ne peux plus réduire ma window.

    J'ai changé le calcul et enlevé les GTK_EXPAND lors de mes assignations des boutons dans la table.

    Savez vous pourquoi le fait d'enlever ces GTK_EXPAND m'empêchent de reduire la window ?

    Merci

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/11/2010, 20h58
  2. Réponses: 4
    Dernier message: 21/05/2010, 15h59
  3. Bug lors du redimensionnement de la fenêtre
    Par Slayor dans le forum EDT/SwingWorker
    Réponses: 0
    Dernier message: 21/09/2008, 02h09
  4. Bug IE6 avec label : petites div redimensionnées
    Par pacpacapero dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 15/12/2007, 11h46
  5. [CSS] Bug IE, redimensionnement d'une zone de saisie
    Par djflex68 dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 02/09/2006, 00h04

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