在用户控件中创建15x15方形网格

时间:2012-03-19 02:14:02

标签: c# winforms user-controls

我有一个WinForms用户控件,我正在尝试绘制15行15个方块。如果控件的大小发生变化,则方块应该变小,但仍然有15行15个方格,如下图所示:

OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO

我正在尝试使用ClientSize.WidthClientSize.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();

2 个答案:

答案 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分别为ColumnCountRowCount的倍数。