Сделайте квадратные прямоугольники в фиксированной квадратной картинке как сетка - PullRequest
0 голосов
/ 18 января 2020

Я работаю над проектом с использованием c# и Visual Studio (. NET Framework), в котором пользователь может взаимодействовать с некоторыми квадратными прямоугольниками, расположенными в сетке, используя PictureBox. Размер по умолчанию будет 20 x 20. Пользователь может изменить количество квадратов в PictureBox, но размер PictureBox должен остаться прежним. Я использую WinForms.

Код, который я пробовал, используя мои логики c и некоторые целые rnet, я получаю, работая как квадратная сетка с квадратами в них, но, как я увеличение xNum или yNum, сетка начинает становиться все меньше и меньше. Вот моя функция, которая выполняет рисование прямоугольников:

 public Graphics CreateRectangles(int xNum, int yNum, Graphics g)
        {
            rectList.Clear();

            int width = (pictureBox1.Image.Height / xNum) - 1;
            int height = (pictureBox1.Image.Height / yNum) - 1;
            int both = (width + height) / 2;

            Rectangle rect = new Rectangle();
            rect.Size = new Size(both, both);
            for(int x = 0; x < xNum; x++)
            {
                rect.X = x * rect.Width;
                for(int y = 0; y < yNum; y++)
                {
                    rect.Y = y * rect.Height;
                    rectList.Add(rect);
                }
            }
            pictureBox1.Refresh();
            foreach (Rectangle rec in rectList)
            {
                Pen p = new Pen(Color.Blue);
                g.DrawRectangle(p, rec);
            }
            g.DrawLine(new Pen(Color.Blue), 0, yNum * height, xNum * width, yNum * height);
            return g;
        }

Я очищаю экран всякий раз, когда хочу рисовать, по

                pictureBox1.Image = new Bitmap((Screen.PrimaryScreen.Bounds.Width / 8) * 7, (Screen.PrimaryScreen.Bounds.Height / 8) * 7);

Пожалуйста, помогите мне решить проблему, чтобы размер площадь квадрата в pictureBox1 остается самой большой, не превышая других GUI элементов. Заранее спасибо. ?

1 Ответ

0 голосов
/ 18 января 2020

Если число и размер ячеек являются переменными, то вам нужно нарисовать сетку на прокручиваемом холсте. Следующий фрагмент обрабатывает событие paint элемента управления Panel с именем panel1:

в конструкторе формы или событии Load:

panel1.AutoScroll = true;

Событие Paint:

private void Panel1_Paint(object sender, PaintEventArgs e)
{
    var g = e.Graphics;

    //Your inputs
    var xNum = 30;
    var yNum = 25;
    var cellSize = new Size(20, 20);
    //

    using (Matrix m = new Matrix(1, 0, 0, 1, panel1.AutoScrollPosition.X, panel1.AutoScrollPosition.Y))
    {
        g.Transform = m;
        g.Clear(panel1.BackColor);

        for (var i = 0; i < xNum; i++)
        for (var j = 0; j < yNum; j++)
            g.DrawRectangle(Pens.Blue, 
                i * cellSize.Width, 
                j * cellSize.Height, 
                cellSize.Width, cellSize.Height);
    }
    panel1.AutoScrollMinSize = new Size(cellSize.Width * (xNum + 1), cellSize.Height * (yNum + 1));
}

Также вы можете захотеть получить новый класс, который наследует элемент управления Panel, чтобы включить свойство DoubleBuffered, необходимое для уменьшения мерцания при прокрутке:

class PanelEx : Panel
{
    public PanelEx()  
    {
        DoubleBuffered = true;
        AutoScroll = true;
    }
}
...