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 :

rotation de texte


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Avril 2010
    Messages : 85
    Par défaut rotation de texte
    Bonjour, je souhaite afficher un texte verticalement dans une drawing area.

    J'ai opté pour une solution "bricolage" : créer un pixmap à part, écrire le texte dedans, récupérer le pixbuf, faire une rotation, dessiner le pixbuf dans ma drawing area. cela sonne ça :

    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
     
                GdkPixmap* pxm = gdk_pixmap_new(NULL,30,30,24);
                GdkGC* GC = gdk_gc_new(GDK_DRAWABLE(pxm));
     
                gdk_draw_string(GDK_DRAWABLE(pxm),font, GC,10,10,"0k");//mon texte = Ok
     
                GdkPixbuf* pxb = gdk_pixbuf_get_from_drawable(NULL,GDK_DRAWABLE(pxm),gdk_drawable_get_colormap(GDK_DRAWABLE(pxm)),0,0,0,0,30,30);
     
                //rotation
                pxb = gdk_pixbuf_rotate_simple(pxb,GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE);
     
                gdk_draw_pixbuf(GDK_DRAWABLE(Pixmap), gc,pxb,0,0,100,100,30,30,GDK_RGB_DITHER_MAX,0,0); //Pixmap et gc = drawing area
     
                gdk_pixmap_unref(pxm);
                gdk_gc_unref(GC);
                gdk_pixbuf_unref(pxb);
    Comme résultat, je vois bien le texte vertical, mais tout barré par des hachures, trucs noirs...

    Qu'est-ce qui ne va pas ? Je me doute que mon code n'est pas très propre. Je souhaiterais eviter de passer par Cairo.

    merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Avril 2010
    Messages : 85
    Par défaut
    Solution partielle :

    si on ajoute un fond avant le texte (rectangle blanc), je n'ai plus de hachures,gribouillis.

    Y-a t'il un moyen de purger l'image avant ?
    Peut-in avoir un fond transparent par cette méthode ?

  3. #3
    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
    Histoire de me faire un peu la main avec les nouvelles technologies et aussi pour apporter une solution plus actuelle, je te donne un exemple avec l'utilisation de Cairo. Simple et efficace :
    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
    #include <gtk/gtk.h>
     
    /* Fonction d'affichage du drawingarea. */
    gboolean
    callback_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
    {
      cairo_t *context = NULL;
     
      context = gdk_cairo_create (widget->window);  // Récupération du context.
     
      cairo_move_to(context, 100, 100);       // Placement de l'origine du texte
      cairo_rotate (context, -1.57);          // Rotation de 90°
     
      cairo_show_text (context, "test 90°");  // Affichage du tout.
     
      cairo_destroy (context);                // Suppression du context inutile.
     
      return FALSE;
    }
     
    gint
    main (gint argc, gchar *argv[])
    {
      GtkWidget *window = NULL;
      GtkWidget *drawingarea= NULL;
     
      gtk_init (&argc, &argv);
     
      /* Création de la fenêtre principale.*/
      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_window_set_default_size (GTK_WINDOW(window), 400, 400);
     
      /* Création d'un GtkWidgetArea.*/
      drawingarea = gtk_drawing_area_new();
      gtk_container_add(GTK_CONTAINER(window), drawingarea);
     
      /* Connexion des signaux.*/
      g_signal_connect (G_OBJECT(drawingarea), "expose_event", G_CALLBACK(callback_expose_event), NULL);
      g_signal_connect (window, "delete-event", G_CALLBACK(gtk_main_quit), NULL);
     
      /* On affiche le tout */
      gtk_widget_show_all (window);
     
      /* On lance la boucle principale gtk. */
      gtk_main ();
     
      return 0;
    }

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Avril 2010
    Messages : 85
    Par défaut
    oui, merci.

    En fait, je souhaite eviter de mélanger mes textes, lignes gdk avec de jolis textes tout jolis, anti-aliasés etc...

    J'ai pas envie de repenser tout le programme avec Cairo. Je suis pas anti-Cairo attention !

  5. #5
    Membre confirmé Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Par défaut
    Citation Envoyé par superZozo Voir le message
    oui, merci.

    En fait, je souhaite eviter de mélanger mes textes, lignes gdk avec de jolis textes tout jolis, anti-aliasés etc...

    J'ai pas envie de repenser tout le programme avec Cairo. Je suis pas anti-Cairo attention !
    Bah en même temps, si tu veux que ton programme reste compatible, t'auras pas trop le choix, vu que les fonctions de dessins de Gdk sont marquées obsolètes et vont être supprimées dans gtk+-3.0. De plus, il me semble que la version 2.22 est la dernière version de gtk+-2.0

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Avril 2010
    Messages : 85
    Par défaut
    Un des trucs qui me rebute pour utiliser cairo, c'est que j'ai un apriori sur la vitesse d'affichage. Là, mon prog a du calcul en temps réel (transformée de fourier, et autres) et j'ai peur que cela rame avec cairo du fait de l'affichage. En restant pur gdk, c'est fluide. Bon, je me trompe peut-être.

    J'ai regardé d'assez loin la migration gtk 2->3 (cela fait moins d'un an que je me suis remis au C et mis à GTK...). La migration signifie-t-elle disparition de ce type de fonctions ? Il ne pourra pas y a avoir de coexistence de 2 bibliothèques...

  7. #7
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      cairo_rotate (context, -1.57);          // Rotation de 90°
    Reste en radians plutôt que de mettre une valeur en degrés, c'est plus lisible d'écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     cairo_rotate (context, -M_PI/2.0);          // Rotation de 90°
    Voir aussi la doc de cairo_arc:
    Angles are measured in radians. An angle of 0.0 is in the direction of the positive X axis (in user space). An angle of M_PI/2.0 radians (90 degrees) is in the direction of the positive Y axis (in user space). Angles increase in the direction from the positive X axis toward the positive Y axis. So with the default transformation matrix, angles increase in a clockwise direction.

    (To convert from degrees to radians, use degrees * (M_PI / 180.).)

  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
    Je ne 'lai pas écrit comme ca parce que gcc n'en voulait pas. Voulant donner un code rapidement je me suis résigner à écrire une valeur brute. Je ferais un effort supplémentaire la prochaine fois .

  9. #9
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    D'ailleurs, il semble que M_PI_2 soit la meilleure manière de l'écrire.

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

Discussions similaires

  1. probleme de rotation de texte
    Par Kobe70 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 14/03/2008, 14h36
  2. [Direct3D] Rotation de texte
    Par tnarol dans le forum DirectX
    Réponses: 4
    Dernier message: 26/01/2007, 18h13
  3. Tcanvas Rotation de texte et impression
    Par kilog dans le forum Delphi
    Réponses: 2
    Dernier message: 21/08/2006, 10h42
  4. [TLabel] rotation du text dans un label
    Par Bourak dans le forum Delphi
    Réponses: 1
    Dernier message: 16/05/2006, 18h08
  5. Rotation de texte et impression
    Par rizom dans le forum Langage
    Réponses: 6
    Dernier message: 16/11/2004, 20h46

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