2009-10-14 6 views
4

Consolas와 같은 고정 된 크기의 글꼴 (예 : 300)과 글꼴 수를 감안할 때 어떻게 그릴 수있는 최대 문자 수는 GDI +입니까?고정 너비 글꼴 및 최대 너비가 픽셀 인 경우 최대 문자 수를 결정하는 방법

텍스트가 라벨이나 기록 만 그려 GDI + 사용하지 않을 :

public void DrawString(string s, Font font, Brush brush, 
    RectangleF layoutRectangle, StringFormat format); 

을하지만 내가 알아낼 싶은 이유 때문에, 그리기 전에 특정 텍스트 작업을 수행 할 출력 할 수있는 최대 문자 수.

답변

6

System.Drawing.Graphics 방법 MeasureString 문자열 너비에 몇 가지 추가 픽셀이 포함되어 있기 때문에 (그 이유는 모르겠 음) 고정 너비를 측정합니다. -length 문자를 사용 가능한 최대 너비로 나누면 최대 너비에 맞출 수있는 문자 수를 너무 낮게 추정 할 수 있습니다.

문자의 최대 수를 얻으려면, 당신은 다음과 같이 반복적 인 일을해야 할 것 :

using (Graphics g = this.CreateGraphics()) 
{ 
    string s = ""; 
    SizeF size; 
    int numberOfCharacters = 0; 
    float maxWidth = 50; 
    while (true) 
    { 
     s += "a"; 
     size = g.MeasureString(s, this.Font); 
     if (size.Width > maxWidth) 
     { 
      break; 
     } 
     numberOfCharacters++; 
    } 
    // numberOfCharacters will now contain your max string length 
} 

업데이트을 : 당신은 뭔가 새로운 것을 매일 배웁니다. Graphics.MeasureString (및 TextRenderer)는 돌출 된 글리프를 수용하기 위해 경계를 몇 개의 추가 픽셀로 채 웁니다. 의미가 있지만, 성가 시게 될 수 있습니다. 참조 :

http://msdn.microsoft.com/en-us/library/6xe5hazb.aspx이 작업을 수행 할 수있는 더 좋은 방법처럼 보이는 것은 :

그래서, 또한 다른 결과 (이 창 컨트롤을 그릴 때 사용되는 무엇인가를 생산 TextRenderer.MeasureText(),이
using (Graphics g = this.CreateGraphics()) 
{ 
    g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 
    SizeF size = g.MeasureString("a", this.Font, new PointF(0, 0), 
     StringFormat.GenericTypographic); 
    float maxWidth = 50; // or whatever 
    int numberOfCharacters = (int)(maxWidth/size.Width); 
} 
+0

정보를 주셔서 감사합니다. Consolas 글꼴을 사용했지만 사용하는 문자에 따라 "numberOfCharacters"가 반환되었지만 매우 가까이에있는 것을 사용했습니다. 예 : "a"가 50을 반환하면, ""을 사용하면 다른 숫자가 반환됩니다. 나는 Consolas가 Fixed Font - Monospaced라고 생각 했단 말인가? –

+0

마침내 나는 등 폭이 같은 글꼴을 사용하여 다른 문자의 너비와 동일한 값을 얻습니다. 그러나 '- space'는 이상한 '-3.813766E-7' 음수 값을 제공합니다. 어떤 충고? – Gondil

+0

@ Gondil : 이상한 결과이지만 모노 스페이스 글꼴을 사용하고 있기 때문에 문제가되지 않습니까? "m"(예를 들어) 너비를 측정하고이를 모든 문자 (공백 포함)의 너비로 사용할 수 있습니다. – MusiGenesis

0

Drawing.Graphics.MeasureString()을 사용하여 글리프 중 하나의 크기를 얻을 수 있습니다.
그런 다음 그 중 몇 개가 그리기 영역에 들어가는 지 확인하십시오.

0

고정 폭이라면 floor (pixelcount/fontwidth)를 사용하지 않는 이유는 무엇입니까?

+0

고정 폭 글꼴의 경우에만 작동합니다. – devstuff

+0

죄송합니다. 질문을 제대로 읽지 않았습니다. 미안합니다. – devstuff

0

나는 System.Drawing.Graphics.MeasureString()이 당신을 도울 수 있다고 생각합니다. MeasureCharacterRanges와 결합하거나 한 문자의 크기를 측정 한 다음이 값의 픽셀 수를 나눌 수 있습니다. 이처럼 뭔가를하면 결과물을 가지고 놀 수 있습니다. 이 방법이 효과가있을 것이라 확신합니다.) ===

3

그것은 일반적으로 더 정확합니다).

어딘가에 대한 논의가 있지만 지금은 찾을 수 없습니다.

편집 :This MSDN Article 조금 더 자세히 설명되어 있습니다.

+1

http://stackoverflow.com/questions/1087157/accuracy-of-textrenderer-measuretext-results – MusiGenesis

+0

TextRenderer.MeasureText는 Graphics.MeasureString보다 느리지 만 대부분의 경우 중요하지 않습니다. – MusiGenesis

+0

정보를 제공해 주셔서 감사합니다. 나는 오직 1 개의 답을 올바른 것으로 표시 할 수 있고 Musi의 대답은 내가 결국 사용했던 것입니다. –

0

이번 답변이 늦어도 동일한 문제가 발생했습니다.

귀하의 질문에 대한 답변이 귀하의 질문에 있다고 생각합니다. 언급 한 DrawString 함수는 긴 문자열을 자동으로 자르는 기능을 가지고 있습니다. 문서 http://msdn.microsoft.com/en-us/library/19sb1bw6.aspx을 살펴보십시오.

이 함수는 문자열을 트리밍하여 레이아웃 사각형에 맞 춥니 다.매개 변수로 none이 아닌 다른 것으로 전달한 stringformat 객체의 트리밍 속성을 설정해야합니다.

1

내가 몇 사이트를 읽고 같은 솔루션을 마련,

using (System.Drawing.Graphics graphics = CreateGraphics()) 
{ 
    System.Drawing.Size size = TextRenderer.MeasureText(graphics, id, e.Appearance.Font); 
    if (size.Width > e.Column.Width) 
    { 
     int charFit = (int)(((double)e.Column.Width/(double)size.Width) * (double)id.Length); 
     if (id.Length - charFit + 2 < id.Length) 
     { 
      e.DisplayText = string.Format("{0}{1}","...", id.Substring(id.Length - charFit + 2)); 
     } 
    } 
} 

나는 이것이 DevExpress의 격자보기의 CustomDrawCell 이벤트 변경했다. 이 해결책에 결함이 있으면 알려주십시오.

관련 문제