Cuestión : ¿Cómo puedo forzar Graphics.MeasureString para considerar el estilo de fuente?

Estoy convirtiendo un reemplazo de MessageDialog que escribí hace algún tiempo para ser manejado completamente en vez de usar las llamadas del API para algunas de sus funciones.  Este diálogo puede tener un título principal y una opinión del subtítulo o del detalle, y ajusta automáticamente su fuente dependiing en el OS funcionando (Segoe UI para Vista y 7, Tahoma para XP).  De hay un título secundario entonces que el título se rinde en en negrilla, si no en el normal style.

para clasificar correctamente el diálogo utilizo Graphics.MeasureString y paso en la fuente para la comparación, usar el SizeF vuelto para calcular el tamaño de las etiquetas requeridas y así el tamaño del dialog.

However, cuando paso una fuente en negrilla a MeasureString el valor vuelto no hace caso del estilo en negrilla y vuelve un valor más pequeño que realmente necesario que haga típicamente la palabra pasada en el título ser desechado (probablemente es exterior el área calculada).  ¿El tamaño vuelto es siempre correcto para la versión no-en negrilla del texto provided.

How puede yo hace el tamaño correcto ser el tener en cuenta vuelta la diferencia de tamaño que la fuente en negrilla requiera?  Observar que he intentado las sobrecargas que aceptan un parámetro del stringformat y no diferencian ningún al result.

Chirs Bray
class= > " claro " del
> del " codeSnippet " del class= del
class= " lineNumbers " del
class= del
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:
class= " del id= " codeSnippet754129 del
-------------------------------
            
SizeF headingSize;
            SizeF subHeadingSize;

            Tamaños de la secuencia de la medida de //
            // que dirige tamaño 
            headingSize = MeasureString (título, this.headingLabel.Width, headingLabel.Font);

            this.headingLabel.Size = headingSize.ToSize ();

            Subtítulo de // (el tamaño será cero si el singleMessage)
            subHeadingSize = MeasureString (subtítulo, this.subHeadingLabel.Width, subHeadingLabel.Font);
 
------------------------------------------------------------       


tamaño privado MeasureString (str de la secuencia, maxWidth de la internacional, fuente de la fuente)
        {
            el usar (gráficos g = this.CreateGraphics ())
            {
                strRectSizeF de SizeF = g.MeasureString (str, fuente, maxWidth);
                g.Dispose ();

                nuevo tamaño de vuelta ((internacional) Math.Ceiling (strRectSizeF.Width), (internacional) Math.Ceiling (strRectSizeF.Height));
            }
        }
class= del

Respuesta : ¿Cómo puedo forzar Graphics.MeasureString para considerar el estilo de fuente?


el código que trabajó para mí para el auto-apresto está debajo… de mí agregó un control de la etiqueta con AutoSize = falso con un poco de texto con el asiduo de Arial 16 de la fuente con la frontera = el fixedsingle. Entonces en un tratante del tecleo del botón tenía el código below….cuando el botón chascó

dos cosas a la nota: utilicé label1.CreateGraphics () y label1.ClientSize (si está trabajando muy bien con tamaño, después mejor utilizar tamaño)
Esta muestra es de => http://msdn.microsoft.com/en-us/library/system.windows.forms.control.creategraphics.aspx
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
vacío privado button1_Click (remitente del objeto, EventArgs e)
        {
            // crea los gráficos se opone para el control.
            Gráficos g = label1.CreateGraphics ();

            Fuente N-F = nueva fuente (label1.Font, FontStyle.Bold);

            // consigue el tamaño necesitado para acomodar el texto formatado.
            El tamaño preferredSize = g.MeasureString (
               label1.Text, N-F) .ToSize ();

            label1.Font = N-F;
                        
            label1.ClientSize = nuevo tamaño (preferredSize.Width, preferredSize.Height); // usted podría agregar un cierto espacio del acolchado a la anchura y a la altura aquí

            // limpia el objeto de los gráficos.
            g.Dispose ();
        }
Otras soluciones  
 
programming4us programming4us