Изменить размер прямоугольника с размером формы в реальном времени? - PullRequest
0 голосов
/ 20 февраля 2019

Ниже приведен следующий прямоугольник:

enter image description here

Когда я изменяю размер формы, мне нужно, чтобы этот прямоугольник соответствовал размеру формы.

При изменении ширины прямоугольника не препятствуйте его видимости в форме.

Я использую следующее:

Примечание:

Я сделал прямоугольник вручную, но если у вас есть готовый прямоугольник, еще лучше!

public Form1()
{
    InitializeComponent();
    this.Paint += Form1_Paint;
    this.rectangles = new Dictionary<string, Rectangle>();
    this.sizeScreen = this.Size;
    this.sizeRectangles = new Size(8, 8);
    this.brush = new SolidBrush(Color.Red);
    FillLeft();
    FillRight();
    FillUp();
    FillDown();
}

private Size sizeScreen;
private Size sizeRectangles;
private SolidBrush brush;
private Dictionary<string, Rectangle> rectangles;
private void FillLeft()
{
    Rectangle rectangle = new Rectangle()
    {
        Height = this.sizeScreen.Height,
        Width = this.sizeRectangles.Width,
        X = 0,
        Y = this.sizeRectangles.Height
    };
    this.rectangles.Add("left", rectangle);
}
private void FillRight()
{
    Rectangle rectangle = new Rectangle()
    {
        Height = this.sizeScreen.Height,
        Width = this.sizeRectangles.Width,
        X = this.sizeScreen.Width - (this.sizeRectangles.Width * 5),
        Y = this.sizeRectangles.Height
    };
    this.rectangles.Add("right", rectangle);
}
private void FillUp()
{
    Rectangle rectangle = new Rectangle()
    {
        Height = this.sizeRectangles.Height,
        Width = this.sizeScreen.Width,
        X = 0,
        Y = this.sizeRectangles.Height
    };
    this.rectangles.Add("up", rectangle);
}
private void FillDown()
{
    Rectangle rectangle = new Rectangle()
    {
        Height = this.sizeRectangles.Height,
        Width = this.sizeScreen.Width,
        X = 0,
        Y = this.sizeScreen.Height - (this.sizeRectangles.Height * 11)
    };
    this.rectangles.Add("down", rectangle);
}

private void Form1_Paint(object sender, PaintEventArgs e)
{
    for (int i = 0; i < this.rectangles.Count; i++)
    {
        e.Graphics.FillRectangles(this.brush, this.rectangles.Values.ToArray());
    }
}

Я хочу установить прямоугольник на форме при его изменении

Это способ, которым я 'm создаю прямоугольник, но он не остается прямо на экране, изменить его размер я не знаю

Ответы [ 4 ]

0 голосов
/ 20 февраля 2019

Примените следующие исправления к коду:

  • Установите для свойства ResizeRedraw формы значение true.Он устанавливает основной стиль для формы, поэтому при каждом изменении размера он отправляет сообщение рисования, и вам не нужно обрабатывать событие Resize.
  • Использовать DrawRectangle и рисовать, используя широкое перо.Так что вам не нужно заполнять несколько прямоугольников.
  • Установите PenAlignment на Inset.Поэтому вам не нужно вычислять местоположение прямоугольника.
  • Утилизируйте ручку, когда она вам не нужна.

Пример

public Form1()
{
    InitializeComponent();
    ResizeRedraw = true;
}
protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    using (var pen = new Pen(Color.Red, PenWidth))
    {
        pen.Alignment = System.Drawing.Drawing2D.PenAlignment.Inset;
        e.Graphics.DrawRectangle(pen, ClientRectangle);
    }
}
0 голосов
/ 20 февраля 2019

Обработайте событие Resize и вызовите Invalidate в обработчике.Создайте перо нужного цвета и ширины и установите его Alignment на Inset.Обработайте событие Paint и в вызове обработчика DrawRectangle передайте ClientRectangle формы.

Вот пример.

const float borderWidth = 8.0f;
Pen borderPen = new Pen(Color.Red, borderWidth) { Alignment = System.Drawing.Drawing2D.PenAlignment.Inset };

public Form2()
{
    InitializeComponent();
    this.Paint += Form2_Paint;
    this.Resize += Form2_Resize;
}

private void Form2_Resize(object sender, EventArgs e)
{
    Invalidate();
}

private void Form2_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawRectangle(borderPen, this.ClientRectangle);
}
0 голосов
/ 20 февраля 2019

Я думаю, что это упростит то, что вы пытаетесь сделать:

const int PenWidth = 10;

private void Form1_Paint(object sender, PaintEventArgs e)
{
    Rectangle r = this.ClientRectangle;
    Pen pen = new Pen(Color.Red, PenWidth);
    e.Graphics.DrawRectangle(pen, r);
}

Вы можете даже добавить поле:

const int PenWidth = 10;
const int PenMargin = 10;

private void Form1_Paint(object sender, PaintEventArgs e)
{
    Rectangle r = this.ClientRectangle;
    r.Inflate(-PenMargin, -PenMargin);
    Pen pen = new Pen(Color.Red, PenWidth);
    e.Graphics.DrawRectangle(pen, r);
}

Чтобы предотвратить следы (предложено Wyck):

private void Form1_Resize(object sender, EventArgs e)
{
    Invalidate();
}
0 голосов
/ 20 февраля 2019

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

У меня есть класс с именем clsResize, и я вызываю его при загрузке формы.Сначала вы должны инициализировать класс внутри формы, а затем создать 2 новых метода.

см. Пример ниже

 public partial class frmNewForm : Form
    {

        clsResize _form_resize;
        public string selectedProd;



        public frmNewForm()
        {
            InitializeComponent();
            _form_resize = new clsResize(this);
            this.Load += _Load;
            this.Resize += _Resize;
        }
        private void _Load(object sender, EventArgs e)
        {
            _form_resize._get_initial_size();
        }
        private void _Resize(object sender, EventArgs e)
        {
            _form_resize._resize();
        }
}

и вот класс, который я использовал.

public class clsResize
{
    List<System.Drawing.Rectangle> _arr_control_storage = new List<System.Drawing.Rectangle>();
    private bool showRowHeader = false;
    public clsResize(Form _form_)
    {
        form = _form_; //the calling form
        _formSize = _form_.ClientSize; //Save initial form size
        _fontsize = _form_.Font.Size; //Font size
    }

    private float _fontsize  { get; set; }

    private System.Drawing.SizeF _formSize {get;set; }

    private Form form { get; set; }

    public void _get_initial_size() //get initial size//
    {
        var _controls = _get_all_controls(form);//call the enumerator
        foreach (Control control in _controls) //Loop through the controls
        {
            _arr_control_storage.Add(control.Bounds); //saves control bounds/dimension            
            //If you have datagridview
            if (control.GetType() == typeof(DataGridView))
                _dgv_Column_Adjust(((DataGridView)control), showRowHeader);
        }
    }

    public void _resize() //Set the resize
    {
        double _form_ratio_width = (double)form.ClientSize.Width /(double)_formSize.Width; //ratio could be greater or less than 1
        double _form_ratio_height = (double)form.ClientSize.Height / (double)_formSize.Height; // this one too
        var _controls = _get_all_controls(form); //reenumerate the control collection
        int _pos = -1;//do not change this value unless you know what you are doing

        try
        {
            foreach (Control control in _controls)
            {
                // do some math calc
                _pos += 1;//increment by 1;
                System.Drawing.Size _controlSize = new System.Drawing.Size((int)(_arr_control_storage[_pos].Width * _form_ratio_width),
                    (int)(_arr_control_storage[_pos].Height * _form_ratio_height)); //use for sizing

                System.Drawing.Point _controlposition = new System.Drawing.Point((int)
                (_arr_control_storage[_pos].X * _form_ratio_width), (int)(_arr_control_storage[_pos].Y * _form_ratio_height));//use for location

                //set bounds
                control.Bounds = new System.Drawing.Rectangle(_controlposition, _controlSize); //Put together

                //Assuming you have a datagridview inside a form()
                //if you want to show the row header, replace the false statement of 
                //showRowHeader on top/public declaration to true;
                if (control.GetType() == typeof(DataGridView))
                    _dgv_Column_Adjust(((DataGridView)control), showRowHeader);


                //Font AutoSize
                control.Font = new System.Drawing.Font(form.Font.FontFamily,
                 (float)(((Convert.ToDouble(_fontsize) * _form_ratio_width) / 2) +
                  ((Convert.ToDouble(_fontsize) * _form_ratio_height) / 2)));

            }
        }
        catch(Exception e)
        {
            MessageBox.Show(e.Message);
            return;
        }

    }

    private void _dgv_Column_Adjust(DataGridView dgv, bool _showRowHeader) //if you have Datagridview 
    //and want to resize the column base on its dimension.
    {
        int intRowHeader = 0;
        const int Hscrollbarwidth = 5;
        if (_showRowHeader)
            intRowHeader = dgv.RowHeadersWidth;
        else
            dgv.RowHeadersVisible = false;

        for (int i = 0; i < dgv.ColumnCount; i++)
        {
            if (dgv.Dock == DockStyle.Fill) //in case the datagridview is docked
                dgv.Columns[i].Width = ((dgv.Width - intRowHeader) / dgv.ColumnCount);
            else
                dgv.Columns[i].Width = ((dgv.Width - intRowHeader - Hscrollbarwidth) / dgv.ColumnCount);
        }
    } 




    private static IEnumerable<Control> _get_all_controls(Control c)
    {
        return c.Controls.Cast<Control>().SelectMany(item =>
            _get_all_controls(item)).Concat(c.Controls.Cast<Control>()).Where(control => 
            control.Name != string.Empty);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...