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

Windows Discussion :

Listage des polices de caractères


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut Listage des polices de caractères
    Salut,

    Je test actuellement CodeBlocks et wxWidgets, je suis définitivement passé à l'unicode, j'en ai profité pour faire un programme comme extension d'adobe Acrobat, mais pas que, et sans faire de plug-in.

    Une des fonctionnalités serait le listage des polices du système (). À cet effet, j'utilise EnumFontFamiliesExW, mais je n'obtiens pas le résultat attendu, déjà différent de "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" , en plus je suis obligé de filtrer les doublons, le résultat est localisé, j'ai gras au lieu de "bold", oblique et tout.

    Mon objectif est d'avoir un résultat proche des sorties d'Acrobat. Je verrais à l'occasion si freetype peut faire ça. Le dernier recourt étant d'interragir directement avec les dll d'acrobat, mais j'aimerait évité...

    Aussi, ça fait des années que j'ai pas codé, peut-être que quelque chose m'échappe, et ce sans parler du point virgule que j'oublie à tour de bras:

    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
    Citation Envoyé par MSDN
    lfCharSet = DEFAULT_CHARSET
    lfFaceName = '\0'

    Enumerates all uniquely-named fonts within all character sets. If there are two fonts with the same name, only one is enumerated.
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
    Citation Envoyé par MSDN
    DEFAULT_CHARSET is set to a value based on the current system locale. For example, when the system locale is English (United States), it is set as ANSI_CHARSET.

    J'ai fait une ébauche dans un fichier unique et compilable pour isoler le problème, si ça peut être plus parlant :

    Code C++ : 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
    80
    //-----------------------------------------------------------------------------<
    //@F:main.cpp               // v:00 r:000 a:009 01.05.2012, EOF=., LEN=., DEBUG;
    //@C:mingw32
    //@L:libgdi32.a,
     
     
    #include <windows.h>
    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <vector>
     
     
    using namespace std;
     
     
     
    //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    int CALLBACK
    EnumFontFamiliesExProc(
        ENUMLOGFONTEXW *lpelfe, NEWTEXTMETRICEXW *lpntme, int FontType,
        LPARAM lParam){
    //==============================================================================
      static wstring s1;
      wstring s2 = lpelfe->elfFullName;
      vector<wstring> *array = (vector<wstring> *)lParam;
      if (s1==s2){
        s1.assign(s2);
        return 1;
      }
     
      s1.assign(s2);
      array->push_back(s2);
      return 1;
    }
     
     
     
    //¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    int main(){
    //==============================================================================
     
      HDC hDC = GetDC(NULL);
      vector<wstring> array;
      LOGFONTW lf = {0, 0, 0, 0, 0, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, L"\0"};
     
      ::EnumFontFamiliesExW(
          hDC, &lf, (FONTENUMPROCW)EnumFontFamiliesExProc, (LPARAM) &array, 0);
     
      sort(array.begin(), array.end());
     
      /*
      for (unsigned int i=0; i<array.size(); ++i)
        wcout<< array[i]<< endl;
     
      wcout<< L"done.\n"<< endl;
      //*/
     
      vector<wstring> array2;
      for (unsigned int i=0; i<array.size(); ++i){
        //wcout <<L"* " <<array[i] << endl;
        wcsncpy(lf.lfFaceName, array[i].c_str(), LF_FACESIZE);
        ::EnumFontFamiliesExW(
            hDC, &lf, (FONTENUMPROCW)EnumFontFamiliesExProc, (LPARAM) &array2, 0);
      }
     
      sort(array2.begin(), array2.end());
      for (unsigned int i=0; i<array2.size(); ++i)
        wcout << array2[i] << endl;
     
      //wcout<< L"done2.\n"<< endl;
     
      ReleaseDC(NULL, hDC);
      return 0;
    }
     
     
     
     
    //



    Merci.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Ceci semble bizarre:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      if (s1==s2){
        s1.assign(s2);
        return 1;
      }
    D'autant que s1 n'est pas initialisé (à part son constructeur par défaut) et est donc probablement une chaîne vide. Edit: Non minute, je n'avais pas vu que s1 était static.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Oui, j'utilise ça pour filtrer les doublons, mais d'après MSDN, je n'ai normalement pas à le faire, car Windows est censé le faire pour moi si j'assigne une chaine vide à lfFaceName. En ANSI, apparemment, pas de problème, mais en Unicode ça ne fonctionne pas comme attendu.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Ce que je veux dire, c'est que je ne vois pas l'utilité du assign() si les deux chaînes sont déjà égales.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Ça n'a aucune utilité ici, c'est une erreur d'inattention, un oubli. Cette ligne peut être effacée. Voici le bout de code de mon projet dont cette portion dérive, que j'avais copier-coller avant de le convertir en SL.

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      //if (!s1.IsSameAs(s2)){
        s1=s2;
        array->Add(s2);
      //}
     
      /*
      code supplémentaire
      */
     
      return 1;

    Pour le code d'illustration, je pense que j'ai voulu faire un retour en amont de code supplémentaire, qui a de toute façon été effacé dans la foulée.

    Mais c'est cool de l'avoir relevé. Un +1(x2) bien mérité.

    P.-S. T'en auras dix autres si tu trouves une explication à mon problème

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Attention, tu ne termines pas tes chaînes par un caractère nul après l'appel à wcsncpy.

    Et le champ elfFullName possède une taille maximale de 64 alors que lfFaceName a une taille maximale de 32. Pourquoi n'utilises-tu pas plutôt lpelfe->elfLogFont.lfFaceName ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Charger des polices de caractères (ttf) sans les installer
    Par Arkham46 dans le forum Contribuez
    Réponses: 0
    Dernier message: 08/01/2009, 10h49
  2. Quelle bibliothèque pour gérer des polices de caractères ?
    Par khayyam90 dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 04/01/2008, 20h35
  3. Les extensions des polices de caractère
    Par koKoTis dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 25/08/2006, 14h32
  4. Réponses: 7
    Dernier message: 09/09/2005, 15h14
  5. Adresse des polices de caractères dans la RAM video ?
    Par Anonymous dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 27/05/2002, 17h29

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