2008-11-21 31 views

Trả lời

4

Sử dụng Graphics.MeasureString Phương pháp

private void MeasureStringMin(PaintEventArgs e) 
{ 

    // Set up string. 
    string measureString = "Measure String"; 
    Font stringFont = new Font("Arial", 16); 

    // Measure string. 
    SizeF stringSize = new SizeF(); 
    stringSize = e.Graphics.MeasureString(measureString, stringFont); 

    // Draw rectangle representing size of string. 
    e.Graphics.DrawRectangle(new Pen(Color.Red, 1), 0.0F, 0.0F, stringSize.Width, stringSize.Height); 

    // Draw string to screen. 
    e.Graphics.DrawString(measureString, stringFont, Brushes.Black, new PointF(0, 0)); 
} 
1

Xem câu trả lời của tôi đến một câu hỏi tương tự here

Tôi đoán bạn sẽ phải sử dụng trên tất cả các nhân vật và tính toán trung bình mình

+1

Heh. Tôi yêu phương pháp vẽ chuỗi đó thành bitmap và sau đó đọc pixel để xem nó thực sự rộng đến mức nào. Không hiệu quả nhưng được đảm bảo hoạt động chính xác. :) – MusiGenesis

1

tôi chưa bao giờ thấy thuộc tính chiều rộng ký tự trung bình trong .NET. Bạn có thể nhận được chiều rộng của một chuỗi cụ thể trong một phông chữ cụ thể bằng cách sử dụng Graphics.MeasureString hoặc TextRenderer.MeasureString.

4

Không có độ rộng trung bình cho phông chữ vì kerning có thể có tác dụng tùy thuộc vào chữ cái nào trước và sau bất kỳ chữ cái nào.

Nếu bạn muốn phông chữ có kích thước không cố định được sử dụng trong một kịch bản có chiều rộng cố định, tùy chọn chính của bạn là để khoảng trắng các ký tự theo chiều rộng của chữ hoa "W".

Những người khác đã đưa ra một ví dụ về việc chiều rộng của một chuỗi chỉ định, nhưng để trả lời câu hỏi của bạn, để có được một trung bình thực sự của nhân vật có thể in bạn có thể muốn làm điều gì đó như:

StringBuilder sb = new StringBuilder(); 

// Using the typical printable range 
for(char i=32;i<127;i++) 
{ 
    sb.Append(i); 
} 

string printableChars = sb.ToString(); 

// Choose your font 
Font stringFont = new Font("Arial", 16); 

// Now pass printableChars into MeasureString 
SizeF stringSize = new SizeF(); 
stringSize = e.Graphics.MeasureString(printableChars, stringFont); 

// Work out average width of printable characters 
double average = stringSize.Width/(double) printableChars.Length; 
+0

Điều này không thực sự hiệu quả vì một số ký tự liền kề trong printableChars có thể có cặp kerning. –

+3

Tôi đã nhận thức được điều đó, tôi đã nói như vậy trong câu đầu tiên. Nhưng sau khi tôi từ chối trách nhiệm đó, tôi đã trả lời câu hỏi mà anh ta hỏi. –

2

Tricky, vì bạn nên sử dụng tần số ký tự. Nếu bạn đã từng thấy Phần Lan, với tất cả các chữ "i" và "l", bạn sẽ nhận ra rằng ngay cả một phông chữ ASCII thuần túy cũng không có chiều rộng ký tự trung bình được xác định rõ.

Các vấn đề liên quan