Я создаю GroupBox во время выполнения и устанавливаю его свойство Text. Обычно текст находится только в одной строке, но иногда он переносится. Проблема в том, что элементы управления, содержащиеся в GroupBox, скрывают текст GroupBox.
То, что я хотел бы сделать, это определить, если и когда текст переносится. В частности, я бы хотел определить, сколько дополнительной высоты занимает обернутый текст по сравнению с одной строкой. Таким образом, я могу переместить элементы управления GroupBox и настроить его высоту.
Изначально я думал, что сделаю это, вызвав метод CreateGraphics()
GroupBox и используя 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 заглавных букв W, чтобы вызвать перенос - его строка имела ширину ~ 164. Это были две крайности, которые я тестировал. Ширина моего GroupBox составляла 189. (a занимает 29 и имеет ширину ~ 180, O занимает 22 и имеет ширину ~ 189)
У кого-нибудь есть идеи? (взломать, WinAPI и т. д. приветствуются решения)