在像正方形这样的固定方形Picturebox中制作方形矩形

问题描述 投票:0回答:1

我正在使用c#和visual studio(.NET Framework)进行项目,其中用户可以使用PictureBox与以网格形式排列的一些方形框进行交互。默认尺寸为20 x 20用户可以更改PictureBox中的正方形数,但PictureBox的大小应保持不变。我使用WinForms。

我使用我的逻辑和一些互联网尝试过的代码,我将其用作具有正方形的正方形网格,但是随着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元素重叠。提前致谢。 👍

c# .net rectangles drawrectangle
1个回答
0
投票

如果单元格的数量和大小是变量,则需要在可滚动的画布上绘制网格。以下代码段处理名为paintPanel控件的panel1事件:

在表单的构造函数或Load事件中:

panel1.AutoScroll = true;

绘画事件:

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.