我有一个WinForms用户控件,我正在尝试绘制15行15个方块。如果控件的大小发生变化,则方块应该变小,但仍然有15行15个方格,如下图所示:
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
我正在尝试使用ClientSize.Width
和ClientSize.Height
除以15,但它并不完全正确。任何有关此算法的帮助都将不胜感激!
顺便说一下,这是在C#中。
这是我的代码:
图形g = e.Graphics;
g.DrawRectangle(Pens.Black, 0, 0, ClientSize.Width - 1, ClientSize.Height - 1);
if (ClientSize.Width > ClientSize.Height)
{
int ndx = (int)Math.Ceiling(ClientSize.Height/15f);
for (int x = 0; x < ClientSize.Width; x += ndx)
{
for (int y=0 ; y<ClientSize.Height; y+=ndx)
{
g.DrawLine(Pens.Black, x, y, x + ndx, y);
g.DrawLine(Pens.Black, x, y, x, y + ndx);
}
}
}
else
{
int ndx = (int)Math.Ceiling(ClientSize.Width / 15f);
for (int x = 0; x < ClientSize.Width; x += ndx)
{
for (int y = 0; y < ClientSize.Height; y += ndx)
{
g.DrawLine(Pens.Black, x, y, x + ndx, y);
g.DrawLine(Pens.Black, x, y, x, y + ndx);
}
}
}
g.Dispose();
答案 0 :(得分:1)
因为你有一个完美的方形,所以更容易;如果控件宽度高于高度,则将高度分成15,并将其用作每个正方形的边。如果它比它宽,则将宽度分成15,并将其用作每个正方形的一侧。
答案 1 :(得分:1)
部分问题是,只有当容器的宽度和高度可以被15整除时,你的网格才会适合。尝试向下舍入。
const int ColumnCount = 15;
const int RowCount = 15;
int cellwidth = (int)Math.Floor(ClientSize.Width / ColumnCount);
int cellheight = (int)Math.Floor(ClientSize.Height / RowCount );
绘制网格后,明确地将最后一行和一列的区域遮挡。你将有一个厚厚的黑色边框,但它会清楚地定义15x15网格。
如果您想避开黑色边框,请强制ClientSize.Width
和.Height
分别为ColumnCount
和RowCount
的倍数。