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 :

Ressource avec GTK+ ?


Sujet :

GTK+ avec C & C++

  1. #1
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut Ressource avec GTK+ ? Comment afficher un texte long ?
    Bonjour,

    avec la bibliothèque Win APi je plaçais mes longs textes dans une "STRINGTABLE" d'un fichier ressource. Comme cela je pouvais les appeler et les afficher facilement

    Sous GTK+ je cherche à faire la même chose, mais je ne trouve pas l'équivalent. Peut-on utiliser les mêmes fichiers ressources ? Si oui comment afficher le texte d'une STRINGTABLE dans un label ? Sinon, comment faire pour ne pas formater des lignes et des lignes de texte dans le code ?


    Merci !

  2. #2
    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 : 46
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Je ne sais pas si cela existe mais tu peux utiliser un fichier de style configuration comme un par exemple un format XML, il y'a même un parseur XML avec la GLib.
    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 !

  3. #3
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut
    Je n'ai pas tout bien compris ce que tu m'as répondu mais je me suis orientée comme tu le conseilles vers un fichier de style. Donc pour compléter le sujet voilà où j'en suis :

    J'ai créé un fichier texte avec les balises de Pango qu'on peut trouver par exemple dans le manuel de référence en anglais
    Ce fichier txt ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <span background="#757575" foreground ="#FFFFFF"> <b>Voilà comment 
    on peut intégrer un long texte dans un label sans avoir à taper tout le texte 
    dans le code.</b></span>
    Dans ma fonction main.c j'appelle une fonction que j'ai écrite pour créer le label, la voici :
    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
     
     
    void creerLabel ( GtkWidget* p_fenetre,GtkWidget* p_label,gchar* p_adresse)
    {
        // Chaîne vide de taille TAILLE_TEXTE-->définie dans le header
        gchar texte[TAILLE_TEXTE] = "";
        gchar * texteTraduit;
     
              /*charger le texte du label--> voir le code ci-dessous*/
        chargerTexte(p_adresse, texte);
            //traduire la chaîne de caractères au format utf8
        texteTraduit=g_locale_to_utf8(texte,-1,NULL,NULL,NULL);
            //créer le label
        p_label=gtk_label_new(texteTraduit);
            //dire qu'on utilise les balises de Pango
        gtk_label_set_use_markup (GTK_LABEL(p_label), TRUE);
            //ajouter le label à la fenêtre
        gtk_container_add(GTK_CONTAINER(p_fenetre),p_label);
            //libérer la mémoire de texteTraduit
        g_free(texteTraduit);
            //mettre le texte à gauche
        gtk_label_set_justify(GTK_LABEL(p_label),GTK_JUSTIFY_LEFT);
    }
    Dans cette fonction j'appelle la fonction chargerTexte que j'ai créée pour charger le texte du fichier txt.
    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
     
     
    void chargerTexte(gchar *p_adresse, gchar *p_texte)
    {
     
        FILE* fichier = NULL;
        char texteLigne[TAILLE_MAX] = ""; // Chaîne vide de taille TAILLE_MAX
     
        //ouvrir le fichier
        fichier=fopen(p_adresse,"r");
     
       if (fichier != NULL)
        {
     
        // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
             while (fgets(texteLigne, TAILLE_MAX, fichier) != NULL)
            {
                strcat(p_texte,texteLigne);
            }
        //fermer le fichier
       fclose(fichier);
        }
        else
        {
            // On affiche un message d'erreur si on veut
            printf("Impossible d'ouvrir le fichier texte ");
        }
    }
    Pour être complète voici le header avec la déclaration des deux fonctions et
    la définition de TAILLE_MAX et TAILLE_TEXTE:
    #ifndef DEF_HEADER // pour éviter une lecture multiple
    #define DEF_HEDEAR

    #define TAILLE_MAX 250
    #define TAILLE_TEXTE 3000

    //fonctions
    void chargerTexte(gchar * , gchar *);
    void creerLabel( GtkWidget*,GtkWidget*, gchar*);

    #endif

  4. #4
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut
    Une question :
    Quand j'utilise cette méthode elle fonctionne dans code::blocks.
    Mais si j'exécute le fichier compilé de l'application, la fenêtre s'affiche normalement mais sans le texte...Pourquoi ? Les fichiers du projet sont tous dans le même répertoire.

  5. #5
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut
    Suite des zaventures dans le monde merveilleux de l'affichage du texte.

    J'ai essayé de changer le chemin d'accès du fichier texte, j'ai mis le chemin entier et ça marche. Mais le programme n'est pas portable alors. Donc je me suis décidée à inclure tout de même le texte dans le code. Mais comment pour que ça ne face pas trop fouilli. En fait j'ai trouvé une solution qui ressemble bcp aux ressources de WIN API. Elle est simple et je pense que je m'e suis pris la tête pour pas grand chose.
    J'ai créé une fonction ou je vais concentrer tous les textes de mon application. Chaque texte correspondra à un identifiant (numéro) et j'appelerai la fonction à l'aide de cette identifiant. Pour ce qui est de la présentation du texte dans la fonction, ce n'est pas plus compliqué que dans une ressource WIN API? c'est même plus simple. Voici la forme de cette fonction et la façon dont je l'appelle.

    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
     
    void texteCharge (gchar* texte,long n)
    {
     
    switch (n)
    {
       case 1:
       strcpy (texte,"\n\n<span background=\"#757575\" foreground =\"#FFFFFF\" size = \"xx-large\"> <b>");
       strcat(texte,"           ICI ON PEUT METTRE UN TITRE !</b></span>\n\n");
     
     
       strcat(texte,"<span background=\"#757575\" foreground =\"#FFFFFF\" size = \"medium\"> <b>");
       strcat(texte,"On peut écrire un texte plus ou moins long,\n");
       strcat(texte,"sur plusieurs lignes.\n");
       strcat(texte,"Pour sauter une ligne il faut utiliser l'antislash et le n comme ceci ->\n\n");
       strcat(texte,"</b></span>");
        break;
        default:
        strcpy(texte,"pas de texte");
    }
    }
    Appelle de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    gchar texte [TAILLE_TEXTE]={0};
    texteCharge(texte,1);
    Mais comme rien n'est parfait j'ai des warning dans mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ..... :warning implicit declaration of function 'strcpy'
    ..... :warning incompatible implicit declaration of built-in function 'strcpy'
    ..... :warning implicit declaration of function 'strcat'
    ..... :warning incompatible implicit declaration of built-in function 'strcat'

  6. #6
    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 : 46
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par acryline
    Mais le programme n'est pas portable alors
    Pourquoi il ne le serait pas ? Si tu utilises les fonctions standards du C et GTK+ ... voir éventuellement des fonctions POSIX.1 il n'y a aucune raisons qu'il ne le soit pas !

    Citation Envoyé par acryline
    Mais comme rien n'est parfait j'ai des warning dans mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ..... :warning implicit declaration of function 'strcpy'
    ..... :warning incompatible implicit declaration of built-in function 'strcpy'
    ..... :warning implicit declaration of function 'strcat'
    ..... :warning incompatible implicit declaration of built-in function 'strcat'
    Il faut inclure le header string.h
    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 !

  7. #7
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut
    Si je mets tout le chemin d'accès du fichier texte, il y aura des répertoires perso qui ne seront pas forcément chez tout le monde. Bon ok je pourrais trouver une fonction qui cherche le répertoire courant... mais je ne la connais pas encore.
    Et je préfère ma deuxième méthode. Sauf qu'elle n'est pas adaptée à la traduction d'un programme, mais je n'en suis pas encore là !

    Pour les warning !! C'était ça ! Merci !

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

Discussions similaires

  1. [utf-8] problème d'accents avec gtk+
    Par over_score dans le forum Général Python
    Réponses: 3
    Dernier message: 14/12/2005, 01h43
  2. [GTK]problème avec GTK+ sur DEV-C++
    Par afrikha dans le forum Dev-C++
    Réponses: 7
    Dernier message: 01/10/2005, 14h13
  3. [GTK]installer Dev-C++ avec gtk 1.2 ...
    Par vbcasimir dans le forum Dev-C++
    Réponses: 2
    Dernier message: 02/02/2004, 13h34

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