2010-04-13 5 views

답변

3
class AutoFontLabel : Label 
{ 
    public AutoFontLabel() 
     : base() 
    { 
     this.AutoEllipsis = true; 
    } 

    protected override void OnPaddingChanged(EventArgs e) 
    { 
     UpdateFontSize(); 
     base.OnPaddingChanged(e); 
    } 

    protected override void OnResize(EventArgs e) 
    { 
     UpdateFontSize(); 
     base.OnResize(e); 
    } 

    private void UpdateFontSize() 
    { 
     int textHeight = this.ClientRectangle.Height 
      - this.Padding.Top - this.Padding.Bottom; 

     if (textHeight > 0) 
     { 
      this.Font = new Font(this.Font.FontFamily, 
       textHeight, GraphicsUnit.Pixel); 
     } 
    } 
} 

패딩 처리를위한 컨트롤을 업데이트 한 AMissico에게 감사드립니다. Padding 및 TextAlign 변경이 디자이너에서 어떻게 영향을 받았는지 확인할 수 있습니다.

+0

왜 1f로 여분의 곱셈을해야 할까? 캐스트가 더 빨라지지 않습니까? (중요하지 않음) – AMissico

+0

OnResize 내에서 글꼴을 변경하므로 추가 레이블 크기가 조정됩니까? – AMissico

+0

아니, 나는 시도했다, 여분의 레이블 resieze가 발생하지 않습니다; 기본 OnResieze가 설정됩니다. – serhio

0

이 문제를 해결하고 자신 만의 텍스트를 페인트하려면 페인트 방법을 재정의해야한다고 생각합니다. 그러나 GDI +의 MeasureString 메서드를 사용하여 텍스트의 크기를 가져와야하므로 정확한 글꼴 크기를 알려주는 루틴이 시행 착오의 방식으로 작동합니다.

+0

나는 label.OnResize + label.Font = something을 가지고 트릭으로 생각했다. – serhio