用等间距线填充空间

时间:2012-05-01 15:12:27

标签: c# winforms gdi+

我有以下C#代码:

int cellHeight = (int)Math.Floor((ClientSize.Height - controlsSpacing) / 25f);

int yStart = MarginSize + controlsSpacing;
for (int i = 0; i < 25; i++)
{
    g.DrawRectangle(Pens.Black, 0 + MarginSize, yStart, ClientSize.Width - MarginSize - 1,
                    cellHeight);
    yStart += cellHeight;
}

我要做的是绘制25条从顶部到底部延伸的线,并且间距相等,以适应ClientSize区域。我遇到的问题是绘制的最后一行似乎总是比其余的更小或更大。我的数学必定在某处失败。任何帮助将不胜感激。

这是一个截图:

enter image description here

2 个答案:

答案 0 :(得分:1)

问题是

int cellHeight = (int)Math.Floor(..)
yStart += cellHeight;

使用Math.Floor删除的分数在每次迭代中都会丢失,并累积到您看到的间隙。

在每次迭代中计算yStart

int cellHeight = (int);

for (int i = 0; i < 24; i++)
{
    float yStart = MarginSize + controlsSpacing +
                 (ClientSize.Height - controlsSpacing) * i / 25f;

    g.DrawRectangle(Pens.Black,
                    MarginSize,
                    yStart,
                    ClientSize.Width - MarginSize - 1,
                    cellHeight);
}

答案 1 :(得分:0)

使cellHeight和yStart加倍,并在调用DrawRectangle时将它们转换为int。您可能需要执行Math.Round()而不是仅仅转换为int。

double cellHeight = (ClientSize.Height - controlsSpacing) / 25.0;

double yStart = MarginSize + controlsSpacing;

for (int i = 0; i < 24; i++)
{
    g.DrawRectangle(Pens.Black, 0 + MarginSize, (int)yStart, ClientSize.Width - MarginSize - 1,
                    (int)cellHeight);
    yStart += cellHeight;
}