C # Groupbox - настройка внешнего вида границы / заголовка - PullRequest
1 голос
/ 30 октября 2010

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

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

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);

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

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

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

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

С уважением,

Ричард

Ответы [ 2 ]

2 голосов
/ 30 октября 2010

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

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 голосов
/ 30 октября 2010

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

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

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

С уважением,

Richard

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...