2010-03-12 7 views
2

런타임에 GroupBox를 만들고 Text 속성을 설정하고 있습니다. 일반적으로 텍스트는 한 줄에 있지만 때로는 줄 바꿈됩니다. 문제는 GroupBox에 포함 된 컨트롤이 GroupBox의 텍스트를 덮고 있다는 것입니다.System.Windows.Forms.GroupBox의 텍스트가 다음 줄로 넘어갈 때 어떻게 알 수 있습니까?

내가 원하는 것은 텍스트의 줄 바꿈 여부와시기를 결정하는 것입니다. 특히, 줄 바꿈 된 텍스트가 한 줄에 비해 얼마나 많은 추가 높이를 차지하는 지 결정하고 싶습니다. 이렇게하면 GroupBox의 컨트롤을 재배치하고 높이를 조정할 수 있습니다.

처음에는 GroupBox의 CreateGraphics() 메서드를 호출하고 Graphics를 사용하여 문자열을 측정한다고 생각했습니다. 이런 식으로 뭔가가 :

private void SetGroupBoxText(GroupBox grp, string text) 
{ 
    const int somePadding = 10; 

    Graphics g = grp.CreateGraphics(); 
    SizeF textSize = g.MeasureString(text, grp.Font); 
    if (textSize.Width > (grp.Width - somePadding)) 
    { 
     // Adjust height, etc. 
    } 
} 

문제는 g.MeasureString(text, grp.Font)에 의해 생성 된 크기가 정확하지 않는 것이다. 랩을 일으키기에 충분한 단일 문자를 넣은 다음 결과 문자열을 측정하여 정확하지 않다고 판단했습니다.

예를 들어 랩이 발생할 때까지 86 개의 파이프 (|)가 필요했습니다. 그 줄을 측정했을 때 폭은 ~ 253이었습니다. 랩을 강요하는 데 16 자본금이 필요했습니다. 스트링의 너비는 ~ 164였습니다. 이것들은 제가 테스트 한 두 극단이었습니다. 내 GroupBox의 너비는 189입니다. (29 일 걸리고 너비가 ~ 180이었고, O가 22를 가지고 너비가 ~ 189였습니다)

누구 아이디어가 있습니까? (해킹, WinAPI 등 환영 솔루션입니다)

답변

2

이 코드는 참조 소스에서 파생되었으며 매우 가까운 것입니다. 두 줄 이상의 텍스트를 표시 할 때 텍스트 높이에 추가 된 픽셀 수를 반환합니다.

public static int GetGroupboxTextHeightExtra(GroupBox box) { 
     TextFormatFlags flags = TextFormatFlags.Default | TextFormatFlags.TextBoxControl | TextFormatFlags.WordBreak | TextFormatFlags.PreserveGraphicsTranslateTransform | TextFormatFlags.PreserveGraphicsClipping; 
     Rectangle rc = new Rectangle(0, 0, box.Width - 2 * 7, box.Height); 
     Size size; 
     using (Graphics gr = Application.OpenForms[0].CreateGraphics()) { 
      size = TextRenderer.MeasureText(gr, box.Text, box.Font, rc.Size, flags); 
     } 
     return size.Height - box.Font.Height; 
    } 
+0

이것은 완벽합니다. – fre0n

0

나는 이것이 당신의 문제를 직접적으로 해결하지 않는다는 것을 알고 있지만 그룹 상자의 최소 크기를 줄 바꿈을하지 않을 줄 알았던 숫자로 설정할 수 있습니다.

대부분의 경우 그룹 상자의 제목에 많은 텍스트가 없어야합니다. 그룹 상자 아래에 레이블을 추가하면 더 자세히 설명됩니다. 그룹 상자는 유사한 컨트롤을 "그룹화"하기위한 것임을 기억하십시오. 따라서 실제 그룹 상자의 텍스트는 최소한이어야하며 제목을 모방해야합니다.

0

문제에 레이아웃 관리자를 사용하지 않는 이유는 무엇입니까? 레이아웃 관리자 레이아웃은 컨테이너 계산을 수행하지 못하도록 컨테이너를 제어합니다. DevXpress 및 Syncfusion과 같은 공급 업체의 레이아웃 관리자를 찾을 수 있습니다. NET Framework에도 레이아웃 관리자가 있다고 생각합니다.

관련 문제