How do I embed my own fonts in a WinForms app?

后端 未结 5 1324
醉酒成梦
醉酒成梦 2020-12-02 15:23

I want to embed fonts in my WinForms application so that I don\'t have to worry about them being installed on the machine. I\'ve searched a bit on the MSDN site and found a

相关标签:
5条回答
  • 2020-12-02 16:04

    I dragged and dropped a randomly downloaded font into my resources and this worked. Uses a file though. I guess you can use this as well to install fonts ?

    public Form1()
    {
        string filename = @"C:\lady.gaga";
        File.WriteAllBytes(filename, Resources.KBREINDEERGAMES);
        PrivateFontCollection pfc = new PrivateFontCollection();
        pfc.AddFontFile(filename);
    
        Label label = new Label();
        label.AutoSize = true;
        label.Font = new Font(pfc.Families[0], 16);
        label.Text = "hello world";
        Controls.Add(label);
    }
    
    0 讨论(0)
  • 2020-12-02 16:04

    i will go with knighter's way of embedding a font but when it comes to changing your font I choose this code:

    YourLabel.Font = new Font("Arial", 24,FontStyle.Bold);
    

    for more information: Easiest way to change font and font size

    0 讨论(0)
  • 2020-12-02 16:11

    Can't I just use the resource part of my app?

    Yes, but need to be native resources rather than .NET resources (i.e. using rc.exe, the native resource compiler).

    0 讨论(0)
  • 2020-12-02 16:17
    // specify embedded resource name
    string resource = "embedded_font.PAGAP___.TTF";
    
    // receive resource stream
    Stream fontStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource);
    
    // create an unsafe memory block for the font data
    System.IntPtr data = Marshal.AllocCoTaskMem((int)fontStream.Length);
    
    // create a buffer to read in to
    byte[] fontdata = new byte[fontStream.Length];
    
    // read the font data from the resource
    fontStream.Read(fontdata, 0, (int)fontStream.Length);
    
    // copy the bytes to the unsafe memory block
    Marshal.Copy(fontdata, 0, data, (int)fontStream.Length);
    
    // pass the font to the font collection
    private_fonts.AddMemoryFont(data, (int)fontStream.Length);
    
    // close the resource stream
    fontStream.Close();
    
    // free up the unsafe memory
    Marshal.FreeCoTaskMem(data);
    
    0 讨论(0)
  • 2020-12-02 16:18

    This is what worked for me in VS 2013, without having to use an unsafe block.

    Embed the resource

    1. Double-click Resources.resx, and in the toolbar for the designer click Add Resource/Add Existing File and select your .ttf file
    2. In your solution explorer, right-click your .ttf file (now in a Resources folder) and go to Properties. Set the Build Action to "Embedded Resource"

    Load the font into memory

    1. Add using System.Drawing.Text; to your Form1.cs file

    2. Add code above and inside your default constructor to create the font in memory (without using "unsafe" as other examples have shown). Below is my entire Form1.cs:

      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      using System.Windows.Forms;
      using System.Reflection;
      
      using System.Drawing.Text;
      
      namespace WindowsFormsApplication1
      {
          public partial class Form1 : Form
          {
              [System.Runtime.InteropServices.DllImport("gdi32.dll")]
              private static extern IntPtr AddFontMemResourceEx(IntPtr pbFont, uint cbFont,
                  IntPtr pdv, [System.Runtime.InteropServices.In] ref uint pcFonts);
      
              private PrivateFontCollection fonts = new PrivateFontCollection();
      
              Font myFont;
      
              public Form1()
              {
                  InitializeComponent();
      
                  byte[] fontData = Properties.Resources.MyFontName;
                  IntPtr fontPtr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(fontData.Length);
                  System.Runtime.InteropServices.Marshal.Copy(fontData, 0, fontPtr, fontData.Length);
                  uint dummy = 0;
                  fonts.AddMemoryFont(fontPtr, Properties.Resources.MyFontName.Length);
                  AddFontMemResourceEx(fontPtr, (uint)Properties.Resources.MyFontName.Length, IntPtr.Zero, ref dummy);
                  System.Runtime.InteropServices.Marshal.FreeCoTaskMem(fontPtr);
      
                  myFont = new Font(fonts.Families[0], 16.0F);
              }
          }
      }
      

    Use your font

    1. Add a label to your main form, and add a load event to set the font in Form1.cs:

      private void Form1_Load(object sender, EventArgs e)
      {
          label1.Font = myFont;
      }
      
    0 讨论(0)
提交回复
热议问题