none
Fuentes de paso fijo RRS feed

  • Pregunta

  • Hola a todos,

     

    Me gustaría haceros una pregunta. ¿Como puedo obtener información sobre como y que son la fuentes de paso fijo?. Hasta ahora se que son fuentes en las que todos los caracteres tienen la misma longitud. Necesito hacer un generador donde muestre el tipo de fuente que hay de paso fijo en el sistema.

     

    Hasta ahora con esta línea

    private InstalledFontCollection FuentesInstaladas = new InstalledFontCollection(); soy capaz de obtener las fuentes del sistema. Pero lo que no sé es como funciona una fuente de paso fijo y esto me impide hacer algún método que lo calcule.

     

    ¿Alguien me puede dar más información acerca de ello?¿hay alguien que ya lo haya implementado?. Me conformaré con que se me explique como funcionan o donde encontrar la información. Busqué en google, wikipedia y no encontré demasiada información(igual no busco por el nombre correcto).

     

    A la espera quedo, muchas gracias con antelación.

     

    Un Saludo

    jueves, 19 de julio de 2007 7:10
    Moderador

Respuestas

  • Hola,

     

    Muchas gracias a los dos, pero ya he creado mi propio método que expongo a continuación. Primero voy a explicar como lo he hecho. Una fuente de paso fijo tiene como característica que cada caracter es igual en tamaño que otro de esa misma fuente. A partir de ahí lo que hago es asignarle a un label una fuente, a continuación le añado al text la letra W y cogo su anchura y altura y los almaceno. Luego le asigno un espacio al label y vuelvo a comparar su anchura y altura. Si la anchura y altura de ambos coinciden es que es una fuente de paso fijo.

     

    Este es el código:

     

    Code Snippet

    private InstalledFontCollection FuentesInstaladas = new InstalledFontCollection();

    private void Obtener_Fuentes()

    {

    foreach(FontFamily familia in this.FuentesInstaladas.Families)

    {

    // Fuentes de paso fijo.

    if (this.EsFuentePasoFijo(familia.Name))

    { // lo meto en donde yo quiera }

    }

    }

    private bool EsFuentePasoFijo(string nombre_Fuente)

    {

    Label lbl = new Label();

    this.Controls.Add(lbl);

    lbl.Show();

    lbl.AutoSize = true;

    int posV_1 = 0;

    int posH_1 = 0;

    int posV_2 = 0;

    int posH_2 = 0;

    try

    {

    bool seguir = true;

    int cont = 0;

    while (seguir)

    {

    try

    {

    lbl.Font = new Font(nombre_Fuente, 10F, this.DameEstilo(cont), GraphicsUnit.Point);

    seguir = false;

    }catch

    {

    cont++;

    if (cont < 5)

    { seguir = true; }

    else { seguir = false; }

    }

    }

    lbl.Text = "W";

    posV_1 = lbl.Size.Height;

    posH_1 = lbl.Size.Width;

    lbl.Text = " ";

    posV_2 = lbl.Size.Height;

    posH_2 = lbl.Size.Width;

    lbl.Dispose();

    if ((posH_1 == posH_2) && (posV_1 == posV_2))

    { return true; }

    else { return false; }

    }

    catch { return false; }

    }

    private FontStyle DameEstilo(int numero)

    {

    switch (numero)

    {

    case 0: return FontStyle.Regular;

    case 1: return FontStyle.Bold;

    case 2: return FontStyle.Italic;

    case 3: return FontStyle.Strikeout;

    case 4: return FontStyle.Underline;

    }

    return FontStyle.Regular;

    }

     

    Espero que sirva en un futuro a alguien.

     

    Un Saludo

    jueves, 19 de julio de 2007 12:57
    Moderador

Todas las respuestas

  • He encontrado un hilo de discusión interesante sobre el tema, con un fragmento de código que creo que te puede resultar interesante. Trabaja con las API's de Windows, ya que .NET no ofrece ninguna clase para obtener información completa sobre una determinada fuente:

    http://groups.google.es/group/microsoft.public.dotnet.framework.drawing/browse_thread/thread/2ffcb916a0314c70/5ddc9832a4dfbb92?lnk=st&q=c%23+GetTextMetrics+monospaced&rnum=1&hl=es#5ddc9832a4dfbb92

     

    Espero que te pueda resutar útil.

     

    Salud!

    jueves, 19 de julio de 2007 7:55
  • Hola Fran:

     

    No sé si esto te puede servir:

     

    http://www.catch22.net/tuts/enumfont.asp

     

    Y creo que su traducción al inglés es: Fixed With Font

     

    http://www.google.es/search?hl=es&q=fixed+width+font+c%23&meta=

     

    Espero que te sirva Wink

     

    Salu2

     

    Colabora con el foro: Si la respuesta te es de utilidad marca la pregunta como respondida.

    Luis Ruiz Pavón

    MCP - MCTS

    Blog: http://geeks.ms/blogs/lruiz

    jueves, 19 de julio de 2007 7:56
  • Hola,

     

    Muchas gracias a los dos, pero ya he creado mi propio método que expongo a continuación. Primero voy a explicar como lo he hecho. Una fuente de paso fijo tiene como característica que cada caracter es igual en tamaño que otro de esa misma fuente. A partir de ahí lo que hago es asignarle a un label una fuente, a continuación le añado al text la letra W y cogo su anchura y altura y los almaceno. Luego le asigno un espacio al label y vuelvo a comparar su anchura y altura. Si la anchura y altura de ambos coinciden es que es una fuente de paso fijo.

     

    Este es el código:

     

    Code Snippet

    private InstalledFontCollection FuentesInstaladas = new InstalledFontCollection();

    private void Obtener_Fuentes()

    {

    foreach(FontFamily familia in this.FuentesInstaladas.Families)

    {

    // Fuentes de paso fijo.

    if (this.EsFuentePasoFijo(familia.Name))

    { // lo meto en donde yo quiera }

    }

    }

    private bool EsFuentePasoFijo(string nombre_Fuente)

    {

    Label lbl = new Label();

    this.Controls.Add(lbl);

    lbl.Show();

    lbl.AutoSize = true;

    int posV_1 = 0;

    int posH_1 = 0;

    int posV_2 = 0;

    int posH_2 = 0;

    try

    {

    bool seguir = true;

    int cont = 0;

    while (seguir)

    {

    try

    {

    lbl.Font = new Font(nombre_Fuente, 10F, this.DameEstilo(cont), GraphicsUnit.Point);

    seguir = false;

    }catch

    {

    cont++;

    if (cont < 5)

    { seguir = true; }

    else { seguir = false; }

    }

    }

    lbl.Text = "W";

    posV_1 = lbl.Size.Height;

    posH_1 = lbl.Size.Width;

    lbl.Text = " ";

    posV_2 = lbl.Size.Height;

    posH_2 = lbl.Size.Width;

    lbl.Dispose();

    if ((posH_1 == posH_2) && (posV_1 == posV_2))

    { return true; }

    else { return false; }

    }

    catch { return false; }

    }

    private FontStyle DameEstilo(int numero)

    {

    switch (numero)

    {

    case 0: return FontStyle.Regular;

    case 1: return FontStyle.Bold;

    case 2: return FontStyle.Italic;

    case 3: return FontStyle.Strikeout;

    case 4: return FontStyle.Underline;

    }

    return FontStyle.Regular;

    }

     

    Espero que sirva en un futuro a alguien.

     

    Un Saludo

    jueves, 19 de julio de 2007 12:57
    Moderador