2009-06-09 34 views
10

Cách tốt nhất để drawString ở giữa hình chữ nhật là gì? Kích thước phông chữ văn bản có thể được giảm để phù hợp với nó. Trong hầu hết trường hợp, Văn bản quá lớn để vừa với phông chữ đã cho nên phải giảm phông chữ.Vẽ văn bản ở giữa

Trả lời

3

Nó đang làm việc cho tôi biết. Đây là những gì tôi đã làm

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

Tôi thấy rằng bạn đã đăng giải pháp làm việc của mình khi đăng phiên bản nhưng tôi để tôi ở lại vì nó hiệu quả hơn (kích thước phông chữ không lặp) và tôi nghĩ rằng mã của bạn có thể bị rò rỉ bộ nhớ, tạo nhiều đối tượng phông chữ không gọi Dispose lên chúng. –

+1

Giá trị của tham số 'textBoundary' là gì? Vui lòng khai báo và khởi tạo nó. –

+0

OKAY TÔI ĐÃ NÓ. textBoundary được tạo như sau String imgsrc = "PATH OF IMAGE FILE ON DISK"; Bitmap bmp = bitmap mới (System.Drawing.Image.FromFile (imgsrc)); RectangleF textBoundary = Hình chữ nhật mới (0, 0, bmp.Width, bmp.Height - 30); –

0

Xác định kích thước của văn bản sẽ được vẽ và sau đó xác định độ lệch cho phần bắt đầu của chuỗi từ tâm của hình chữ nhật và vẽ nó.

0

Nhận chiều rộng/2 và chiều cao/2 của hình chữ nhật, sau đó sử dụng System.Graphics.MeasureString để lấy kích thước của chuỗi của bạn, một nửa nữa và trừ các giá trị chiều rộng/chiều cao trước đó của bạn và bạn kết thúc bằng X , Y phối hợp để vẽ chuỗi của bạn theo thứ tự để nó được căn giữa.

16

Mã này tập trung các văn bản ngang và dọc:

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

điều gì về việc giảm kích thước phông chữ? – Prithis

10

tôi đã chơi đùa với nó một chút và tìm thấy giải pháp này (giả định rằng RectangleF rectstring text được đã được xác định):

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

Dễ sử dụng :)

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); 
    } 
Các vấn đề liên quan