c# - otf - incluir fuentes en css
Fuentes.ttf personalizadas para usar en ventanas C#. Formulario (3)
¿Cómo uso un archivo de fuente .tff personalizado que tengo con mi aplicación actual windows.forms? Leí un poco donde lo uso como un recurso incrustado, pero ¿cómo configuro el tipo System.Drawing.Font?
Use la función AddFontResourceEx API a través de p / invoke, pasando FR_PRIVATE para evitar la instalación de una fuente global. Entonces debería poder pasar el nombre de la fuente al constructor de la Font como de costumbre.
Editar: si usa PrivateFontCollection y carga la fuente desde un archivo externo, ni siquiera necesita esto. Si carga la fuente desde un recurso incrustado, use la solución de Ash.
Puede encontrarle útil un artículo de MSDN. Cómo: Crear una colección de fuentes privada .
En este artículo: Cómo incrustar una fuente de tipo verdadero muestra cómo hacer lo que pide en .NET.
Cómo incrustar una fuente True Type
Algunas aplicaciones, por razones estéticas o por un estilo visual requerido, incorporan ciertas fuentes poco comunes para que siempre estén allí cuando sea necesario, independientemente de si la fuente está realmente instalada en el sistema de destino.
El secreto de esto es doble. Primero, la fuente debe colocarse en los recursos agregándola a la solución y marcándola como un recurso incrustado. En segundo lugar, en tiempo de ejecución, la fuente se carga a través de una secuencia y se almacena en un objeto PrivateFontCollection para su uso posterior.
Este ejemplo utiliza una fuente que es poco probable que esté instalada en su sistema. Alpha Dance es una fuente gratuita de True Type que está disponible en la colección de fuentes gratuitas. Esta fuente se incrustó en la aplicación agregándola a la solución y seleccionando la acción de compilación "recurso incrustado" en las propiedades.
Una vez que el archivo se ha incluido correctamente en los recursos, debe proporcionar un objeto PrivateFontCollection en el que almacenarlo y un método mediante el cual se carga en la colección. El mejor lugar para hacer esto es probablemente la anulación de la carga de formulario o el controlador de eventos. La siguiente lista muestra el proceso. Observe cómo se usa el método AddMemoryFont. Requiere un puntero a la memoria en la que la fuente se guarda como una matriz de bytes. En C # podemos usar la palabra clave insegura para mayor conveniencia, pero VB debe usar las capacidades de las clases Marshal para el manejo de la memoria no administrada. La última opción está, por supuesto, abierta a los programadores de C # que simplemente no les gusta la palabra clave insegura. PrivateFontCollection pfc = new PrivateFontCollection ();
private void Form1_Load(object sender, System.EventArgs e)
{
Stream fontStream = this.GetType().Assembly.GetManifestResourceStream("embedfont.Alphd___.ttf");
byte[] fontdata = new byte[fontStream.Length];
fontStream.Read(fontdata,0,(int)fontStream.Length);
fontStream.Close();
unsafe
{
fixed(byte * pFontData = fontdata)
{
pfc.AddMemoryFont((System.IntPtr)pFontData,fontdata.Length);
}
}
}
Las fuentes pueden tener solo ciertos estilos disponibles y, desafortunadamente, seleccionar un estilo de fuente que no existe generará una excepción. Para superar esto, la fuente se puede interrogar para ver qué estilos están disponibles y solo se pueden usar los provistos por la fuente. La siguiente lista muestra cómo se usa la fuente Alpha Dance comprobando los estilos de fuente disponibles y mostrando todos los que existen. Tenga en cuenta que los estilos de subrayado y tachado son pseudo-estilos construidos por el motor de representación de fuente y no se proporcionan en forma de glifo.
private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
bool bold=false;
bool regular=false;
bool italic=false;
e.Graphics.PageUnit=GraphicsUnit.Point;
SolidBrush b = new SolidBrush(Color.Black);
float y=5;
System.Drawing.Font fn;
foreach(FontFamily ff in pfc.Families)
{
if(ff.IsStyleAvailable(FontStyle.Regular))
{
regular=true;
fn=new Font(ff,18,FontStyle.Regular);
e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic);
fn.Dispose();
y+=20;
}
if(ff.IsStyleAvailable(FontStyle.Bold))
{
bold=true;
fn=new Font(ff,18,FontStyle.Bold);
e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic);
fn.Dispose();
y+=20;
}
if(ff.IsStyleAvailable(FontStyle.Italic))
{
italic=true;
fn=new Font(ff,18,FontStyle.Italic);
e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic);
fn.Dispose();
y+=20;
}
if(bold && italic)
{
fn=new Font(ff,18,FontStyle.Bold | FontStyle.Italic);
e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic);
fn.Dispose();
y+=20;
}
fn=new Font(ff,18,FontStyle.Underline);
e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic);
fn.Dispose();
y+=20;
fn=new Font(ff,18,FontStyle.Strikeout);
e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic);
fn.Dispose();
}
b.Dispose();
}
La figura 2 muestra la aplicación en acción.
Consulte el controlador de eventos Form1_Paint, que muestra específicamente cómo establecer el tipo System.Drawing.Font. Se basa en el uso de la clase System.Drawing.Text.PrivateFontCollection.
Espero que esto ayude.