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 Forms Discussion :

Charger une police depuis ressource incorporée


Sujet :

Windows Forms

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Charger une police depuis ressource incorporée
    Bonjour,

    J'ai tenté de charger une police depuis une ressource incorporée, mais cela ne fonctionne pas

    Voilà comment je procède:

    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
    PrivateFontCollection pfcFontCollec = new PrivateFontCollection();
     
    Assembly asm = Assembly.GetEntryAssembly();
    string[] result = asm.GetManifestResourceNames();
    Stream fontStream = asm.GetManifestResourceStream("TripleTriad.visitor1.ttf");
     
    // buffer
    byte[] fontData = new byte[fontStream.Length];
     
    // read
    fontStream.Read(fontData, 0, (int)fontStream.Length);
     
    IntPtr data = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(byte)) * fontData.Length);
     
    // copy to unsafe memory block
    Marshal.Copy(fontData, 0, data, fontData.Length);
     
    // add to font collection
    pfcFontCollec.AddMemoryFont(data, fontData.Length);
     
    // clean up
    fontStream.Close();
    Marshal.FreeHGlobal(data);
     
    Font testFont = new Font(pfcFontCollec.Families[0], 10, FontStyle.Regular);
    Par contre en chargeant la même police via le fichier, ça fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pfcFontFileCollec.AddFontFile("visitor1.ttf");
    Si vous avez une autre idée ou si vous avez remarqué une faute, merci de m'aider.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Comment ça, ça ne marche pas ? Tu obtiens une erreur ? Si oui laquelle ?

    Je me demande si ce n'est pas parce que tu libères la mémoire utilisée par la police... à mon avis il faudrait le faire quand tu n'utilises plus la police. A moins que PrivateFontCollection ne s'en charge tout seul...

    EDIT : as-tu appelé Application.SetCompatibleTextRenderingDefault(true) ? La doc de AddMemoryFont dit qu'il faut le faire...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Comment ça, ça ne marche pas ? Tu obtiens une erreur ? Si oui laquelle ?
    Non, je n'obtiens pas d'erreur, la police par défaut est utilisée à la place de celle que je voudrais.

    J'ai essayé avec SetCompatibleTextRenderingDefault et aussi UseCompatibleTextRendering mais sans résultats supplémentaire...

    J'ai regardé les objets créés avec les différentes méthodes (via le fichier et via la ressource) et apparement le contenu des objets via le débug n'est pas identique...

    J'ai trouvé une source en VB sur un sujet qui se rapproche, je vais tester leur manière de faire et je mettrai un feedback si ça ne marche toujours pas...

    Si vous avez d'autres idées je suis preneur

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    J'ai encore essayé ce matin mais sans résultat...

    J'ai testé sur une forme avec deux boutons, la méthode "classique" en chargeant depuis le fichier fonctionne (bouton 2) alors que l'autre ne fonctionne pas.

    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
    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing.Text;
    using System.Drawing;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public PrivateFontCollection pfc = new PrivateFontCollection(); 
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                Assembly asm = Assembly.GetEntryAssembly();
                string[] result = asm.GetManifestResourceNames();
                Stream fontStream = asm.GetManifestResourceStream("WindowsFormsApplication1.finalf.ttf");
     
                int streamLength = (int)fontStream.Length;
     
                IntPtr data = Marshal.AllocCoTaskMem(streamLength);
     
                byte[] fontdata = new byte[streamLength];
     
                fontStream.Read(fontdata, 0, streamLength);
                Marshal.Copy(fontdata, 0, data, streamLength);
     
     
                pfc.AddMemoryFont(data, streamLength);
     
                this.Font = new Font(pfc.Families[0], 20, FontStyle.Bold);
     
                fontStream.Close();
                Marshal.FreeCoTaskMem(data);
            }
     
            private void button2_Click(object sender, EventArgs e)
            {
                pfc.AddFontFile("finalf.ttf");
     
                this.Font = new Font(pfc.Families[0], 20, FontStyle.Bold);
            }
        }
    }
    Via le débug on peut bien voir que les objets font en sortie ne sont pas identiques (voir image) je suppose donc que je me trompe lors du chargement de la police, mais je ne vois vraiment pas où...

    Si vous avez des idées, merci de votre aide.


    Edit: Je n'avais pas vu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.SetCompatibleTextRenderingDefault(false);
    dans le programme, je l'ai mis sur true et ça fonctionne, je vais voir pourquoi ça ne fonctionne pas sur mon autre application mais ça ne devrait pas poser de problème, désolé pour le dérangement

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

Discussions similaires

  1. Charger une image depuis les ressources projets
    Par Flackou dans le forum DirectX
    Réponses: 2
    Dernier message: 04/06/2007, 14h34
  2. Charger une page depuis un menu déroulant ?
    Par tomguiss dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 14/10/2005, 08h32
  3. [FONT] Charger une police d'un fichier
    Par mercure2039 dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 21/04/2005, 17h46
  4. [Applet][JAR]Charger une applet depuis un fichier jar
    Par CappCorp dans le forum Applets
    Réponses: 8
    Dernier message: 23/11/2004, 13h08
  5. [GNU Pascal] [GRX] Charger une police en mode graphique
    Par seedle-san dans le forum Autres IDE
    Réponses: 2
    Dernier message: 17/04/2004, 03h06

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