2010-10-30 3 views
0

У меня есть 2 групповых ящика, которые я бы хотел настроить немного больше, и я не хочу прибегать к панели с меткой (это означало бы, что я буду иметь для того чтобы иметь тот же цвет фона для панели и родительского элемента управления, если мне нужна граница, поскольку метка должна иметь набор цветов, чтобы скрыть границу за текстом).C# Groupbox - настройка внешнего вида и надписи

мне удалось изменить цвет границы, захватив событие рисования и, используя следующий код:

Graphics gfx = e.Graphics; 
Pen p = new Pen(Color.FromArgb(86, 136, 186), 3); 

GroupBox gb = (GroupBox)sender; 
Rectangle r = new Rectangle(0, 0, gb.Width, gb.Height); 

gfx.DrawLine(p, 0, 5, 0, r.Height - 2); 
gfx.DrawLine(p, 0, 5, 10, 5); 
gfx.DrawLine(p, 62, 5, r.Width - 2, 5); 
gfx.DrawLine(p, r.Width - 2, 5, r.Width - 2, r.Height - 2); 
gfx.DrawLine(p, r.Width - 2, r.Height - 2, 0, r.Height - 2); 

Моя проблема заключается в том, что, как это, если подпись слишком долго, то он перекрывает границу. Поскольку он перекрывает левую границу границы вверху - это легко решить, просто отрегулировав вторую линию DrawLine. Однако я хотел бы определить размеры и ширину текста, чтобы я мог правильно расположить границы.

Есть ли у кого-нибудь идеи, как это сделать? Некоторое время я смотрел на Google, но на меня ничего не выпрыгивало. Я знаю, что подпись установлена ​​в GroupBox.Text.

Пожалуйста, также скажите, есть ли какие-либо другие измерения, которые могут мне понадобиться, исходя из того, что я меняю толщину границы, поэтому было бы странно, если бы шрифт был крошечным, но граница была 10 пикселей, начиная с половины пути вниз. .

Заранее спасибо.

С уважением,

Ричард

ответ

2

Легко получить размер строки, как я вижу, ты узнал. Но я думаю, что подклассификация элемента управления будет намного проще, позволит лучше посмотреть и дать вам поддержку времени разработки. Вот пример:

public class GroupBoxEx : GroupBox 
{ 
    SizeF sizeOfText; 
    protected override void OnTextChanged(EventArgs e) 
    { 
     base.OnTextChanged(e); 
     CalculateTextSize();    
    } 

    protected override void OnFontChanged(EventArgs e) 
    { 
     base.OnFontChanged(e); 
     CalculateTextSize(); 
    } 

    protected void CalculateTextSize() 
    { 
     // measure the string: 
     using (Graphics g = this.CreateGraphics()) 
     { 
      sizeOfText = g.MeasureString(Text, Font); 
     } 
     linePen = new Pen(Color.FromArgb(86, 136, 186), sizeOfText.Height * 0.1F); 
    } 

    Pen linePen; 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     // Draw the string, we now have complete control over where: 

     Rectangle r = new Rectangle(ClientRectangle.Left + Margin.Left, 
      ClientRectangle.Top + Margin.Top, 
      ClientRectangle.Width - Margin.Left - Margin.Right, 
      ClientRectangle.Height - Margin.Top - Margin.Bottom); 

     const int gapInLine = 2; 
     const int textMarginLeft = 7, textMarginTop = 2; 

     // Top line: 
     e.Graphics.DrawLine(linePen, r.Left, r.Top, r.Left + textMarginLeft - gapInLine, r.Top); 
     e.Graphics.DrawLine(linePen, r.Left + textMarginLeft + sizeOfText.Width, r.Top, r.Right, r.Top); 
     // and so on... 

     // Now, draw the string at the desired location:    
     e.Graphics.DrawString(Text, Font, Brushes.Black, new Point(this.ClientRectangle.Left + textMarginLeft, this.ClientRectangle.Top - textMarginTop)); 
    } 
} 

Вы заметите, что управление делает больше не рисовать себя, вы отвечаете за весь процесс. Это позволяет вам точно знать, где текст нарисован - вы сами рисуете.

(Обратите внимание, что линия 1/10 высоты строки.)

+0

Спасибо, что это должно сработать! – ClarkeyBoy

0

Ну я теперь узнал, как получить длину куска текста ... Я использовал следующее:

SizeF textsize = gfx.MeasureString(gb.Text, gb.Font); 

Где GFX это Графика и gb - GroupBox. Однако я думаю, что стоит просто написать собственный собственный класс, который наследуется от Panel, добавляет к нему ярлык, а затем я смогу сказать ему, чтобы разместить метки 1, 5, 10, 200, 254 и т. Д. даже в процентах дюйма Я также обнаружил, что не могу переопределить стандартную границу - она ​​все еще отображается через границу, которую я добавил, если моя граница 1px - еще один недостаток использования GroupBox.

С уважением,

Ричард