0

我有以下 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区域。我遇到的问题是,画的最后一条线似乎总是比其余的线更小或更大。我的数学一定在某个地方失败了。任何帮助,将不胜感激。

这是一个屏幕截图:

在此处输入图像描述

4

2 回答 2

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);
}
于 2012-05-01T15:43:23.307 回答
0

使 cellHeight 和 yStart 双打,并在调用 DrawRectangle 时将它们转换为整数。您可能需要执行 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;
}
于 2012-05-01T15:15:17.437 回答