Радуга

Для начала создадим новый проект статической отрисовки

В конструкторе формы подпишемся на событие Paint

public Form1()
{
    InitializeComponent();
    Paint += Form1_Paint;            
}
        
Если после написания += нажать Tag то студия автоматически создаст хендлер (обработчик) для события Paint. Если этого не произошло то можно самостоятельно написать этот метод.

Для  того чтобы вывести радугу, нарисуем 7 отдельных заполненных прямоугольников с помощью метода FillRectangle

private void Form1_Paint(object? sender, PaintEventArgs e)
{
    int h = ClientSize.Height / 7;
    e.Graphics.FillRectangle(Brushes.Red, 0, 0, ClientSize.Width, h);
    e.Graphics.FillRectangle(Brushes.Orange, 0, h, ClientSize.Width, h);
    e.Graphics.FillRectangle(Brushes.Yellow, 0, 2 * h, ClientSize.Width, h);
    e.Graphics.FillRectangle(Brushes.Green, 0, 3 * h, ClientSize.Width, h);
    e.Graphics.FillRectangle(Brushes.LightBlue, 0, 4 * h, ClientSize.Width, h);
    e.Graphics.FillRectangle(Brushes.Blue, 0, 5 * h, ClientSize.Width, h);
    e.Graphics.FillRectangle(Brushes.Violet, 0, 6 * h, ClientSize.Width, h);
}

 

Запустим программу и увидим следующий результат на экране:

Исходный код данного примера вы можете найти здесь

Возможные артефакты округления

Возможно вы сможете увидить у себя вот такую белую полоску после фиолетовой линии. 

Это вызвано тем что размер окна может не делиться ровно на 7 частей. Поскольку мы используем целочисленный тип данных int, то дробная часть теряется в результате целочисленного деления. В итоге останется незакрашенная часть (от 1 до 6 пикселей). 

Чтобы убрать этот артефакт отрисовки, нужно перейти от целочисленного типа данных int, к типу данных с плавающей точкой float. Сделать это можно следующим образом заменив int на float

float h = ClientSize.Height / 7f;

Остальной код останется таким же, потому что функция FillRectangle имеет перегрузку для float параметров и будет вызвана другая функция с тем же именем не заметно для вас. Остальные переменные будут автоматически конвертированы во float. Полный код хендлера отрисовки

private void Form1_Paint(object? sender, PaintEventArgs e)
{
    float h = ClientSize.Height / 7f;
    e.Graphics.FillRectangle(Brushes.Red, 0, 0, ClientSize.Width, h);
    e.Graphics.FillRectangle(Brushes.Orange, 0, h, ClientSize.Width, h);
    e.Graphics.FillRectangle(Brushes.Yellow, 0, 2 * h, ClientSize.Width, h);
    e.Graphics.FillRectangle(Brushes.Green, 0, 3 * h, ClientSize.Width, h);
    e.Graphics.FillRectangle(Brushes.LightBlue, 0, 4 * h, ClientSize.Width, h);
    e.Graphics.FillRectangle(Brushes.Blue, 0, 5 * h, ClientSize.Width, h);
    e.Graphics.FillRectangle(Brushes.Violet, 0, 6 * h, ClientSize.Width, h);
}

 

Обратите внимание, что наша семерка первратилась в 7f. Это указывает на то что константа 7 явлется типом данных float. Зачем это нужно? Если вы напишите просто 7 (как раньше), то белая полоска снизу не исчезнет (убедитесь самостоятельно), потому что произойдет целочисленное деление как и раньше (по правилам C#, по скольку ClientSize.Height явлется int-ом (можете убедится в этом сами наведя курсор в студии на Height) при делении двух int-ов друг на друга результат тоже будет int, значит наша дробная часть опять потеряется) . Чтобы компилятор понял что нужно произвести именно не целочисленное деление, мы делаем константу 7 типом float (добавляя к ней f). Таким образом деление целочисленной переменной int (ClientSize.Height) и числа с плавающей точкой 7f будет произведено по правилам чисел с плавающей точкой (подъем до высшего типа). В следствии этого дробная часть не потеряется и артефакт с белой линией внизу исчезнет.

Более подробно про привидение типов читай здесь

Упражнения

  • Вывести радугу вертикально
  • Сделать чтобы при изменении размеров окна радуга перерисовывалась (для это смотри опции конструктора )
  • Сделать вывод прямоугольников с помощью массива цветов и цикла for
  • Написать функцию которая выводит радугу в заданный прямоугольник