2009-06-09 20 views
10

Jaki jest najlepszy sposób drawString na środku rectangleF? Rozmiar czcionki tekstu można zmniejszyć, aby pasował. W większości przypadków tekst jest zbyt duży, aby zmieścił się w danej czcionce, więc należy zmniejszyć czcionkę.Narysuj tekst w centrum

Odpowiedz

3

To działa dla mnie znać. To, co zrobiłem

Size textSize = TextRenderer.MeasureText(Text, Font); 
float presentFontSize = Font.Size; 
Font newFont = new Font(Font.FontFamily, presentFontSize, Font.Style); 
while ((textSize.Width>textBoundary.Width || textSize.Height > textBoundary.Height) && presentFontSize-0.2F>0) 
{ 
    presentFontSize -= 0.2F; 
    newFont = new Font(Font.FontFamily,presentFontSize,Font.Style); 
    textSize = TextRenderer.MeasureText(ButtonText, newFont); 
} 
stringFormat sf; 
sf.Alignment = StringAlignment.Center; 
sf.LineAlignment = StringAlignment.Center; 
e.Graphics.DrawString(Text,newFont,Brushes.Black,textBoundary, sf); 
+0

Widziałem, że opublikowałeś swoje robocze rozwiązanie, kiedy opublikowałem moją wersję, ale pozwoliłem sobie na pozostanie, ponieważ jest bardziej wydajna (pobiera rozmiar czcionki bez pętli) i myślę, że twój kod może przeciekać pamięć, tworząc wiele obiektów czcionki, ale nie dzwonić Usuń je. –

+1

Co to jest wartość parametru "textBoundary"? Proszę go zadeklarować i zainicjować. –

+0

OK, JA DOSTAŁEM. textBoundary jest tworzony jak poniżej String imgsrc = "ŚCIEŻKA PLIKU OBRAZU NA DYSKU"; Bitmap bmp = new Bitmap (System.Drawing.Image.FromFile (imgsrc)); RectangleF textBoundary = new Rectangle (0, 0, bmp.Width, bmp.Height - 30); –

0

Określa rozmiar tekstu, który należy narysować, a następnie określa przesunięcie początku łańcucha od środka prostokąta F i narysuje go.

0

Pobierz szerokość/2 i wysokość/2 prostokąta, a następnie użyj System.Graphics.MeasureString, aby uzyskać wymiary ciągu, ponownie połowę ich i odejmij od swoich wcześniejszych wartości szerokości/wysokości, a skończysz z X , Współrzędna Y, aby narysować ciąg znaków w celu jego wyśrodkowania.

16

Kod ten centruje tekst w poziomie i pionie:

stringFormat sf; 
sf.Alignment = StringAlignment.Center; 
sf.LineAlignment = StringAlignment.Center; 
grp.DrawString(text, font, Brushes.Black, rectf, sf); 
+0

co z redukcją rozmiaru czcionki? – Prithis

10

I bawił się z nim trochę i znalazłem to rozwiązanie (zakładając, że są już zdefiniowane tak RectangleF rect i string text):

StringFormat stringFormat = new StringFormat() 
{ 
    Alignment = StringAlignment.Center, 
    LineAlignment = StringAlignment.Center 
}; 

using (Graphics g = this.CreateGraphics()) 
{ 
    SizeF s = g.MeasureString(text, this.Font); 
    float fontScale = Math.Max(s.Width/rect.Width, s.Height/rect.Height); 
    using (Font font = new Font(this.Font.FontFamily, this.Font.SizeInPoints/fontScale, GraphicsUnit.Point)) 
    { 
     g.DrawString(text, font, Brushes.Black, rect, stringFormat); 
    } 
} 
0

Łatwy do użycia :)

public static void DrawStringCenter(Image image, string s, Font font, Color color, RectangleF layoutRectangle) 
    { 
     var graphics = Graphics.FromImage(image); 

     var brush = new SolidBrush(color); 

     var format = new StringFormat 
     { 
      Alignment = StringAlignment.Center, 
      LineAlignment = StringAlignment.Center 
     }; 

     graphics.DrawString(s, font, brush, layoutRectangle, format); 
    }