2010-06-12 3 views

Répondre

5

Il est possible d'incorporer une police dans une application et de l'utiliser si cette police n'est pas disponible sur le système de l'utilisateur.

Vous créez simplement un PrivateFontCollection et le peupler avec vos polices puis vous pouvez les utiliser comme vous s'il vous plaît. Selon MSDN, cette méthode ne concerne pas les systèmes d'exploitation avant que Windows 2000.

De Remarques section de PrivateFontCollection.AddFontFile méthode:

Lorsque vous utilisez une police privée sur les systèmes d'exploitation avant Windows 2000, la police par défaut, généralement Microsoft Sans Serif, sera remplacée.

Si vous avez l'intention de votre application à utiliser sur Windows 2000 et plus récent, vous pouvez suivre ce code que j'ai écrit pour voir comment mettre en œuvre les polices privées.

Public Class Form1 
    Dim pfc As System.Drawing.Text.PrivateFontCollection 
    Dim ifc As System.Drawing.Text.InstalledFontCollection 

    Sub New() 

     ' This call is required by the designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 
     pfc = New System.Drawing.Text.PrivateFontCollection() 
     ifc = New System.Drawing.Text.InstalledFontCollection() 

     LoadPrivateFonts({My.Resources.Series_60_ZDigi, My.Resources.Times_NR_Phonetics_2}) 
    End Sub 

    ''' <summary>Loads the private fonts.</summary> 
    ''' <param name="fonts">The fonts to be loaded into the private font collection.</param> 
    Private Sub LoadPrivateFonts(ByVal fonts As IEnumerable(Of Byte())) 
     For Each resFont In fonts 
      pfc.AddMemoryFont(Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(resFont, 0), resFont.Length) 
     Next 
    End Sub 

    ''' <summary>Gets the FontFamily whose name matches the one specified.</summary> 
    ''' <param name="fontName">Name of the FontFamily to be returned.</param> 
    ''' <param name="defaultFamily"> 
    ''' Optional. The default font family to be returned if the specified font is not found 
    ''' </param> 
    Private Function GetFontFamily(ByVal fontName As String, Optional ByVal defaultFamily As FontFamily = Nothing) As FontFamily 
     If String.IsNullOrEmpty(fontName) Then 
      Throw New ArgumentNullException("fontName", "The name of the font cannont be null.") 
     End If 

     Dim foundFonts = From font In ifc.Families.Union(pfc.Families) Where font.Name.ToLower() = fontName.ToLower() 

     If foundFonts.Any() Then 
      Return foundFonts.First() 
     Else 
      Return If(defaultFamily, FontFamily.GenericSansSerif) 
     End If 
    End Function 

    Private Sub Form1_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed 
     'free the resources used by the font collections 
     pfc.Dispose() 
     ifc.Dispose() 
    End Sub 

    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint 
     Dim g = e.Graphics 

     Using br As Brush = Brushes.Black 
      g.DrawString("1234567890ABCDEF", New Font(GetFontFamily("Series 60 ZDigi"), 18), br, New Point(20, 20)) 
      g.DrawString("ABCDEFGHIJKLMNOP", New Font(GetFontFamily("Times NR Phonetics 2"), 18), br, New Point(20, 100)) 
     End Using 
    End Sub 
End Class 

je charge les deux polices que j'utilise dans l'application (série 60 ZDigi, une police de mon téléphone Nokia et Times NR Phonétique 2, une police de mon application dictionnaire) à partir des ressources dans la collection de la police privée dans le Sub New().
Ensuite, j'appelle la méthode GetFontFamily pour obtenir la police désirée à peindre sur le formulaire.

Il ne devrait pas être trop difficile à intégrer dans vos applications.

Cheers.

0

Vous ne pouvez pas. À l'heure actuelle, il n'existe pas de norme multiplate-forme pour les polices incorporées dans une application Winforms standard. Le mieux que vous puissiez faire est d'intégrer des fichiers de polices spécifiques à un système d'exploitation, de détecter le système d'exploitation sur lequel vous vous trouvez et d'installer la police par programme. D'autre part, une application WPF dans VB.net pourrait fonctionner pour vos besoins, mais j'ai le sentiment que ce n'est pas là où vous allez. Pour plus d'informations sur le package des polices avec une application WPF, voir this MSDN article.

+1

Je déteste faire éclater ta bulle mais ** Ca peut être fait **. Il peut ne pas fonctionner sur tous les systèmes d'exploitation, mais il fonctionne à partir de Win2k. Voir ma réponse pour savoir comment cela est fait. –

Questions connexes