Я хочу сделать панель с толстой рамкой. Могу ли я установить это как-нибудь? - PullRequest
4 голосов
/ 05 декабря 2009

Я хочу сделать панель с толстой рамкой. Можно ли как-то установить это?

PS, я использую C #. VS 2008.

Ответы [ 5 ]

9 голосов
/ 05 декабря 2009

Джим,

Я создал пользовательский элемент управления и получил ParentControlDesigner. Как я указал в своем комментарии, это не идеальное решение для того, что вы просите. Но это должно быть хорошей отправной точкой. О, к вашему сведению, у меня тоже есть настраиваемый цвет границы. Я был вдохновлен еще одним таким постом, чтобы заняться этим ... Это было сложнее, чем я ожидал. Для правильной перестановки при установке размера границы выполняется вызов PerformLayout. Переопределение для DisplayRectangle и вызов SetDisplayRectLocation в OnResize вызывают правильное перемещение дочерних элементов управления. Кроме того, дочерние элементы управления не имеют ожидаемого значения «0,0» в верхнем левом углу наиболее ... если ширина границы не установлена ​​на 0 ... И OnPaint предоставляет пользовательский рисунок границы.

Удачи тебе! Создание пользовательских элементов управления, которые являются родительскими, сложно, но не невозможно.

[Designer(typeof(ParentControlDesigner))]
public partial class CustomPanel : UserControl
{
    Color _borderColor = Color.Blue;
    int _borderWidth = 5;

    public int BorderWidth
    {
        get { return _borderWidth; }
        set { _borderWidth = value; 
            Invalidate();
            PerformLayout();
        }
    }

    public CustomPanel()  { InitializeComponent(); }

    public override Rectangle DisplayRectangle
    {
        get 
        { 
            return new Rectangle(_borderWidth, _borderWidth, Bounds.Width - _borderWidth * 2, Bounds.Height - _borderWidth * 2); 
        }
    }

    public Color BorderColor
    {
        get { return _borderColor; }
        set { _borderColor = value; Invalidate(); }
    }

    new public BorderStyle BorderStyle
    {
        get { return _borderWidth == 0 ? BorderStyle.None : BorderStyle.FixedSingle; }
        set  { }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaintBackground(e);
        if (this.BorderStyle == BorderStyle.FixedSingle)
        {
            using (Pen p = new Pen(_borderColor, _borderWidth))
            { 
                Rectangle r = ClientRectangle; 
                // now for the funky stuff...
                // to get the rectangle drawn correctly, we actually need to 
                // adjust the rectangle as .net centers the line, based on width, 
                // on the provided rectangle.
                r.Inflate(-Convert.ToInt32(_borderWidth / 2.0 + .5), -Convert.ToInt32(_borderWidth / 2.0 + .5));
                e.Graphics.DrawRectangle(p, r);
            }
        }
    }

    protected override void OnResize(EventArgs e)
    {
        base.OnResize(e);
        SetDisplayRectLocation(_borderWidth, _borderWidth);
    }
}
3 голосов
/ 23 ноября 2013

Это старый пост, но я все еще нахожу его полезным. И я просто нашел другой способ .

ControlPaint.DrawBorder(e.Graphics, control.ClientRectangle,
                        Color.Black, BORDER_SIZE, ButtonBorderStyle.Inset,
                        Color.Black, BORDER_SIZE, ButtonBorderStyle.Inset,
                        Color.Black, BORDER_SIZE, ButtonBorderStyle.Inset,
                        Color.Black, BORDER_SIZE, ButtonBorderStyle.Inset);
3 голосов
/ 06 декабря 2009

Если речь идет только о презентации, поместите панель, заполняющую форму, цветом фона желаемого цвета рамки и Dock в стиле Fill. Поместите в него еще одну панель со стандартным цветом фона и стилем заливки Dock. Поиграйте с Padding и Margin двух панелей, чтобы получить желаемый размер границы (я забыл, какой параметр применяет корректность к внутренней панели и внешней панели). Поместите ваши элементы управления на внутренней панели. Если для обеих панелей установлено значение Dock = Fill, изменение размера формы выполняется автоматически. Возможно, вам придется поэкспериментировать с некоторыми элементами управления, но я проделывал это много раз без проблем как с основными окнами приложения, так и с всплывающими формами.

3 голосов
/ 06 декабря 2009

Просто реализуйте событие Paint панели и нарисуйте границу. Например:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;

namespace WindowsFormsApplication1 {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
      panel1.Paint += panel1_Paint;
    }
    VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.Button.PushButton.Normal);

    private void panel1_Paint(object sender, PaintEventArgs e) {
      renderer.DrawEdge(e.Graphics, panel1.ClientRectangle,
        Edges.Bottom | Edges.Left | Edges.Right | Edges.Top,
        EdgeStyle.Raised, EdgeEffects.Flat);
    }
  }
}

Поиграйте с аргументами, чтобы найти то, что вам нравится. Вы должны добавить код для отката в ControlPaint.DrawBorder, если визуальные стили не включены. Мех.

0 голосов
/ 05 декабря 2009

Это своего рода фальсификация, но я всегда использовал метку для каждой боковой границы. Вам нужно установить для свойства autosize значение false и пристыковать по одному с каждой стороны (слева, справа, сверху, снизу). Затем просто установите ширину / высоту / цвет фона, чтобы сделать то, что вы хотите.

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

...