2009-06-04 4 views
2

라고 TextRenderer.MeasureText에 측정 할 텍스트와 너비를 지정하면 텍스트를 표시하는 데 필요한 높이가 반환됩니다.TextRenderer.MeasureText보다 많은 공간을 필요로하는 LinkLabel은

private static int CalculateHeight(string text, Font font, int width) 
{ 
    Size size = TextRenderer.MeasureText(text, font, new Size(width, Int32.MaxValue), TextFormatFlags.NoClipping | TextFormatFlags.WordBreak); 
    return size.Height; 
} 

나는에 LinkLabel에 텍스트, 너비와 높이를주는 경우는 아무것도 잘립니다하지와 함께 제공되는 폭과 높이의 텍스트를 표시하는 것입니다.

그러나 LinkLabel.Links 컬렉션에 Link를 넣으면 LinkLabel은 문자 사이에 조금 더 간격이있는 것으로 보이는 텍스트를 그릴 것이고 때로는 텍스트의 끝이 잘 리게됩니다 . 이걸 막기 위해 어쨌든 있습니까? 링크가있을 때 패딩을 추가하려고 시도했지만, 얼마나 많은 공간이 필요한지 정확히 알 수있는 확실한 방법은 없습니다. 이 작업을 수행 할 수있는 다른 방법이 있습니까?

답변

0

TextRenderer.MeasureText는 DrawTextEx API의 관리되는 래퍼입니다. 반환 된 값은 lprc 구조체에서 가져온 값입니다. 자세한 내용은 해당 API를 참조하십시오.

+0

입니다. 올바른 측정을 얻은 다음 LinkLabel 컨트롤을 계속 사용하는 경우 MeasureText 또는 DrawTextEx를 통해 해당 항목을 인식해야합니다. 텍스트는 링크로 표시되지만 아무 것도 그런 식으로 표시되지 않습니다. 질문에서 말했듯이 텍스트가 순수 텍스트로만 표시되는 경우 MeasureText가 올바르게 작동합니다. –

+0

LinkLabel에서 자동 크기 조정을 사용할 수 있습니까? –

+0

아니요, 아니요 ... –

0

나는 밑줄을 만드는 스타일을 삭제할 수 있다고 생각합니다. linkLabel.Styles.Add("text-decoration", "none");하지만 물론 그것은 링크처럼 보이지 않습니다. :/

또 다른 해결책은 내가 추측하는 패딩을 추가하는 것입니다.

int heightBefore = linkLabel.Height; 
int fontHeight = CalculateHeight(linkLabel.Text, linkLabel.Font, linkLabel.Width); 
int paddingHeight = heightBefore - fontHeight; 
linkLabel.Font = otherFont; 
linkLabel.Height = CalculateHeight(linkLabel.Text, otherFont, linkLabel.Width); 
linkLabel.Height += paddingHeight; 

가장 좋은 솔루션은 아니지만 작동한다고 추측 할 수 있습니다.

1

LinkLabel에 두 개 이상의 링크가 포함되어 있거나 링크에있는 텍스트의 일부가있는 경우 TextRenderer.DrawText/MeasureText 대신 Graphics.DrawString/MeasureString을 사용합니다. 당신은 쉽게 렌더링에서 가장 큰 차이는 작은 L 문자 함께 행동에서 볼 수 있습니다

linkLabel1.Text = new string('l', 100); // 100 x small L 
linkLabel1.LinkArea = new LinkArea(0, 50); 
linkLabel2.Text = new string('l', 100); // 100 x small L 
+0

아니요, DrawString은 UseCompatibleTextRendering이 켜져있을 때만 사용됩니다. –

+0

죄송하지만 올바르지 않습니다. 직접 확인하고 다음 코드를 사용하십시오 : linkLabel1.Text = new string ('l', 100); // 100 x small L linkLabel1.LinkArea = new LinkArea (0, 50); linkLabel2.Text = new string ('l', 100); // 100 x small L – LukeSw

+0

일반 Labels 및 LinkLabels를 테스트 할 때 내 테스트 응용 프로그램에서 제안이 효과가 있었지만 실제 응용 프로그램에서는 Control.GetPreferredSize 메서드가 유일한 방법이었습니다. –