2010-06-03 24 views
11

Có bằng cách nào đó có thể kiểm soát khoảng cách chữ khi sử dụng Graphics.DrawString không? Tôi không thể tìm thấy bất kỳ quá tải nào đối với DrawString hoặc Font cho phép tôi làm như vậy.C# Drawstring Letter Spacing

  g.DrawString("MyString", new Font("Courier", 44, GraphicsUnit.Pixel), Brushes.Black, new PointF(262, 638)); 

Bằng khoảng cách chữ I có nghĩa là khoảng cách giữa các chữ cái. Với khoảng cách MyString có thể trông giống như M y S r i n g nếu tôi thêm đủ không gian.

Trả lời

12

Điều đó không được hỗ trợ ngoài hộp. Bạn sẽ phải vẽ từng chữ cái riêng lẻ (khó có được quyền đó) hoặc tự chèn dấu cách vào chính chuỗi đó. Bạn có thể kéo dài các chữ cái bằng cách sử dụng Graphics.ScaleTransform() nhưng trông có vẻ phức tạp.

+0

tôi đã có thể chỉ cần vẽ ra từng chữ cái riêng. – beckelmw

+4

+1. Mặc dù không tốt để nghe, tôi đánh giá cao khi ai đó đi ra và nói với bạn rằng một cái gì đó không được hỗ trợ. – jp2code

1

Nó không được hỗ trợ, nhưng dưới dạng hack, bạn có thể lặp qua tất cả các chữ cái trong chuỗi và chèn ký tự khoảng trống giữa mỗi ký tự. Bạn có thể tạo một hàm đơn giản cho nó như vậy:

Chỉnh sửa - Tôi đã làm điều này trong Visual Studio và các lỗi đã được kiểm tra hiện đã bị xóa.

private string SpacedString(string myOldString) 
{ 

      System.Text.StringBuilder newStringBuilder = new System.Text.StringBuilder(""); 
      foreach (char c in myOldString.ToCharArray()) 
      { 
       newStringBuilder.Append(c.ToString() + ' '); 
      } 

      string MyNewString = ""; 
      if (newStringBuilder.Length > 0) 
      { 
       // remember to trim off the last inserted space 
       MyNewString = newStringBuilder.ToString().Substring(0, newStringBuilder.Length - 1); 
      } 
      // no else needed if the StringBuilder's length is <= 0... The resultant string would just be "", which is what it was intitialized to when declared. 
      return MyNewString; 
} 

Sau đó dòng code của bạn ở trên sẽ chỉ được sửa đổi như sau:

  g.DrawString(SpacedString("MyString"), new Font("Courier", 44, GraphicsUnit.Pixel), Brushes.Black, new PointF(262, 638)); 
+0

Cảm ơn bạn đã nhập mã. Cuối cùng tôi đã có thể chỉ vẽ ra từng nhân vật riêng lẻ. – beckelmw

+0

Không sao. Bạn cũng không phải là một lựa chọn tồi. – David

+0

Nếu bạn sử dụng không gian mỏng, nó sẽ là một câu trả lời thực sự tốt .. – TaW

7

Hoặc bạn có thể sử dụng chức năng GDI API SetTextCharacterExtra(HDC hdc, int nCharExtra) (MSDN documentation):

[DllImport("gdi32.dll", CharSet=CharSet.Auto)] 
public static extern int SetTextCharacterExtra( 
    IntPtr hdc, // DC handle 
    int nCharExtra // extra-space value 
); 

public void Draw(Graphics g) 
{ 
    IntPtr hdc = g.GetHdc(); 
    SetTextCharacterExtra(hdc, 24); //set spacing between characters 
    g.ReleaseHdc(hdc); 

    e.Graphics.DrawString("str",this.Font,Brushes.Black,0,0); 
} 
+0

Tôi biết nó đã được trả lời từ lâu rồi, nhưng tôi không thể làm nó hoạt động được. Tui bỏ lỡ điều gì vậy? – c00000fd

+0

Không làm việc cho tôi nữa. – docesam

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