我正在使用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元素重叠。提前致谢。 👍
如果单元格的数量和大小是变量,则需要在可滚动的画布上绘制网格。以下代码段处理名为paint
的Panel
控件的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;
}
}