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 :

Effet de clipping avec les GtkScrolledWindow


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Maintenant que le pb du window_scroll est résolu j'ai un nouveau pb au niveau du scrolling lui même .
    Pour illustrer le pb voici un exemple (vite fait) de ma fonction draw qui dessine 30 ligne de texte.

    Dans le main les attributs du window_scroll sont définis comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    myApp.pScrollBar = gtk_scrolled_window_new(NULL,NULL);
    gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(myApp.pScrollBar), myApp.pDrawArea);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(myApp.pScrollBar), GTK_POLICY_NEVER,GTK_POLICY_AUTOMATIC);
    Et la fonction draw:
    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
     
    void draw_cb(GtkWidget *drawArea, GdkEventExpose *event, gpointer userData)
    {
        APPLICATION *pApp = (APPLICATION*)userData;
     
       static int wScrn, hScrn = 0;
       if (pPixmap == NULL || wScrn != drawArea->allocation.width || hScrn != drawArea->allocation.height)
       {
        wScrn = drawArea->allocation.width;
        hScrn = drawArea->allocation.height;
        pPixmap = gdk_pixmap_new(drawArea->window, wScrn, hScrn, -1);//
        gdk_draw_rectangle(pPixmap, drawArea->style->white_gc, TRUE, 0, 0, wScrn, hScrn);
       }
     
       gdk_draw_drawable(drawArea->window, drawArea->style->fg_gc[GTK_WIDGET_STATE (drawArea)],
                                            pPixmap, event->area.x, event->area.y,
                                            event->area.x, event->area.y,
                                            event->area.width, event->area.height);
     
       PangoContext *pContext = gtk_widget_get_pango_context(drawArea);
       PangoLayout *pLayout = pango_layout_new(pContext);
       pango_layout_set_text (pLayout, "Test Draw", 10);
       int i;
       for(i = 0; i < 30; i++)
       {
         gdk_draw_layout (drawArea->window, drawArea->style->fg_gc[GTK_WIDGET_STATE(drawArea)],
                                                                                  0,i * 15, pLayout);
       }
       gtk_widget_set_size_request (pApp->pDrawArea, drawArea->allocation.width, i * 15);
       g_object_unref(pLayout);
    }
    Le pb est que lorsque je bouge le slider de bas en haut un peu rapidement il y a comme un effet de clipping.
    Est ce la façon de manipuler/redessiner la drawing area qui n'est pas bonne ou est ce que ça vient du système de scrolling ?

    Merci d'avance

  2. #2
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Je reprend ce post (resté sans réponse) pour clarifier un peu mon pb et aussi pour redemander de l'aide parce que là je ne m'en sors plus, ce pb devient insoluble.
    Je récapitule, j'ai une appli constituée d'une fenêtre, et d'une drawing area englobée par un scrolled window.
    Le pb est que lorsque je bouge un peu rapidement le slider de bas en haut j'ai un (gros) effet de clipping sur les bords (haut ou bas) de la drawing area.
    Pour illustrer clairement le pb j'ai fait une petite appli vite fait:
    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
     
    #include <gtk/gtk.h> 
    #define WIDTH 500 
    #define HEIGHT 300 
     
    typedef struct APPLICATION 
    { 
      GtkWidget *pWin; 
      GtkWidget *pDrawArea; 
      GtkWidget *pVBox; 
      GtkWidget *pScrollBar; 
     
    }APPLICATION; 
     
    GdkPixmap *pPixmap = NULL; 
     
    static gboolean configure_event(GtkWidget *widget, GdkEventConfigure *event) 
    { 
      if(pPixmap) g_object_unref(pPixmap); 
     
      pPixmap = gdk_pixmap_new(widget->window, widget->allocation.width, 
                                              widget->allocation.height, -1); 
      gdk_draw_rectangle (pPixmap, widget->style->white_gc, TRUE, 0, 0, 
                                                         widget->allocation.width, 
                                                         widget->allocation.height); 
      return TRUE; 
    } 
     
    static gboolean draw_cb(GtkWidget *drawArea, GdkEventExpose *event, gpointer userData) 
    { 
       gdk_draw_drawable(drawArea->window, drawArea->style->fg_gc[GTK_WIDGET_STATE (drawArea)], 
                                            pPixmap, event->area.x, event->area.y, 
                                            event->area.x, event->area.y, 
                                            event->area.width, event->area.height); 
     
       PangoContext *pContext = gtk_widget_get_pango_context(drawArea); 
       PangoLayout *pLayout = pango_layout_new(pContext); 
        int i; 
        for(i = 0; i < 30; i++) 
        { 
          pango_layout_set_text (pLayout, "Test clipping", 14); 
         gdk_draw_layout (drawArea->window, drawArea->style->fg_gc[GTK_WIDGET_STATE(drawArea)], 
                                                                             0,i * 15, pLayout); 
        } 
       g_object_unref(pLayout); 
       return FALSE; 
    } 
     
    int main (int argc, char *argv[]) 
    { 
      APPLICATION myApp; 
      gtk_init(&argc, &argv); 
     
      myApp.pWin = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
      gtk_window_set_default_size(GTK_WINDOW(myApp.pWin), WIDTH, HEIGHT); 
      g_signal_connect(G_OBJECT(myApp.pWin), "destroy", G_CALLBACK(gtk_main_quit), NULL); 
      myApp.pVBox = gtk_vbox_new(FALSE, 0); 
      gtk_container_add(GTK_CONTAINER(myApp.pWin), myApp.pVBox); 
      myApp.pScrollBar = gtk_scrolled_window_new(NULL,NULL); 
      gtk_box_pack_start(GTK_BOX(myApp.pVBox), myApp.pScrollBar, TRUE, TRUE, 0); 
      myApp.pDrawArea = gtk_drawing_area_new (); 
      gtk_box_pack_start(GTK_BOX(myApp.pScrollBar), myApp.pDrawArea, TRUE, TRUE, 0); 
      gtk_widget_set_size_request (myApp.pDrawArea, myApp.pWin->allocation.width, 500); 
      g_signal_connect(G_OBJECT(myApp.pDrawArea),"expose_event",G_CALLBACK(draw_cb), &myApp); 
      g_signal_connect(G_OBJECT(myApp.pDrawArea),"configure_event", G_CALLBACK (configure_event), NULL); 
      gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(myApp.pScrollBar), myApp.pDrawArea); 
      gtk_window_set_title(GTK_WINDOW(myApp.pWin), "GTK-Win"); 
      gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(myApp.pScrollBar), GTK_POLICY_NEVER,GTK_POLICY_AUTOMATIC); 
     
      gtk_widget_show_all (myApp.pWin); 
      gtk_main (); 
      return 0; 
    }
    Dernièrement un forumer à compilé ce code sur son systeme (Linux) et chez lui tout fonctionne normalement, pas de clipping
    J'ai aussi compilé le projet "Créer son propre Paint" en me disant qu'avec une appli codé par un pro tout devrait marcher,... et ben non, idem.

    Aussi, je n'arrive pas à comprendre qu'un pb aussi trivial (et visible) ai pu passer inaperçu.
    Je suis quand même pas le seul à utiliser GTK sous Windows (en supposant que le pb vienne de là).

    Si quelqu'un pouvait m'aider ce serait vraiment super.

    Merci d'avance

  3. #3
    Invité de passage
    Inscrit en
    Novembre 2006
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1
    Par défaut
    Salut,

    Si cela peut te rassurer j'ai le même problème sous windows. J'ai une hbox avec plus de 350lignes dans un viewport et ca fait le même effet. Je pense que l'implémentation du viewport n'est pas au point pour la version windows de GTK+.

    Il me semble que dans les premières versions 2.x de GTK sous windows il y avait ce problème avec les treestore mais à confirmer...

    La seul solution est de décendre la scrollbar doucement et d'attendre une nouvelle version de GTK.

    Bonne continuation...

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    J'ai compilé ton programme que tu as fournit plus haut mais je n'ai pas le moindre effet de clipping, j'ai le texte qui s'affiche correctement et je peut boude la slidebar aussi vite ou lentement que je veut l'affichage reste correcte !

    Je suis sous Linux Ubuntu Dapper Drake 6.06 avec GTK+ 2.8.20. Vive Linux
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. effet de bord avec les commentaires //
    Par awalter1 dans le forum Langage
    Réponses: 5
    Dernier message: 10/04/2012, 08h57
  2. Que se passe-t-il avec les movie clips créés dynamiquement
    Par Natural Born Camper dans le forum Flash
    Réponses: 0
    Dernier message: 23/05/2008, 20h19
  3. Etrange effet de texture avec les normales
    Par nicoenz dans le forum API graphiques
    Réponses: 5
    Dernier message: 07/03/2007, 16h45
  4. Effets avec les shaders
    Par chonos dans le forum OpenGL
    Réponses: 4
    Dernier message: 11/01/2006, 16h58
  5. Réponses: 6
    Dernier message: 09/11/2005, 17h35

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