Создание квадратной сетки 15x15 в пользовательском элементе управления - PullRequest
0 голосов
/ 19 марта 2012

У меня есть пользовательский элемент управления 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();

Ответы [ 2 ]

1 голос
/ 19 марта 2012

Отчасти проблема заключается в том, что ваша сетка будет соответствовать только в том случае, если ширина и высота контейнера делятся точно на 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 соответственно.

1 голос
/ 19 марта 2012

Так как у вас есть идеальный квадрат, это намного проще; если элемент управления шире, чем высокий, разделите высоту на 15 и используйте ее в качестве стороны каждого квадрата. Если он выше, чем широкий, разделите ширину на 15 и используйте ее в качестве стороны каждого квадрата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...