- •1. Цель работы
- •2. Краткая теория
- •2.1. Работа с перьями
- •2.2. Работа с кистью
- •2.2.1. Кисть для сплошной закраски
- •2.2.2. Кисти типа HatchBrush
- •2.2.3. Кисти типа TextureBrush
- •2.2.4. Градиентные кисти
- •2.3. Проверка попадания в область изображения
- •2.4. Проверка попадания в область, отличную от прямоугольной
- •2.5. Определение цветовых значений
- •2.6. Стандартное диалоговое окно выбора цвета
- •3. Пример выполнения работы
- •3.1. Визуальное проектирование диалогового окна
- •3.2. Проектирование программного кода
- •3.2.1. Начальное рисование фигуры
- •3.2.2. Реализация движения фигуры
- •3.2.3. Программная реализация «отскакивания от стенок»
- •3.2.4. Изменение скорости движения круга
- •3.2.5. Создание диалоговой панели выбора цвета заливки
- •3.2.6. Создание свойства для получения цвета
- •3.2.7. Проверка попадания курсора мыши внутрь круга
- •If (прямоугольник.Contains(точка_курсора))
- •3.2.8. Изменение цвета круга
- •4. Варианты заданий для самостоятельной работы
3.2.6. Создание свойства для получения цвета
После отображения на экране диалогового окна значение выбранного цвета необходимо передать в главную форму программы. Непосредственно значение выбранной радиокнопки передать не удастся, т.к. переменные, описывающие компоненты формы, закрыты (private). Поэтому для решения этой проблемы необходимо создать в классе Form2 общедоступное свойство для получения выбранного цвета, а также для установки текущего цвета круга (соответствующая радиокнопка становится выбранной). Тип свойства – Color. Код свойства приведен далее:
public Color CircleColor
{
get
{
//если выбрана первая радиокнопка,
if (radioButton1.Checked)
//то вернуть черный цвет
return Color.Black;
if (radioButton2.Checked) //и т.д.
return Color.Gray;
if (radioButton3.Checked)
return Color.Red;
if (radioButton4.Checked)
return Color.Yellow;
if (radioButton5.Checked)
return Color.Green;
return Color.Blue;
}
set
{
//если текущий цвет круга - черный,
if (value == Color.Black)
//то сделать выбранной первую радиокнопку
radioButton1.Checked = true;
if (value == Color.Gray) //и т.д.
radioButton2.Checked = true;
if (value == Color.Red)
radioButton3.Checked = true;
if (value == Color.Yellow)
radioButton4.Checked = true;
if (value == Color.Green)
radioButton5.Checked = true;
if (value == Color.Blue)
radioButton6.Checked = true;
}
}
3.2.7. Проверка попадания курсора мыши внутрь круга
Изменение цвета круга в программе должно происходить при щелчке левой кнопкой мыши внутри круга (событие MouseClick для компонента pictureBox1). Для этого необходимо отслеживать координаты курсора мыши: попал ли он в момент щелчка внутрь круга.
Если область изображения прямоугольная, то такая проверка осуществляется достаточно просто:
If (прямоугольник.Contains(точка_курсора))
//выполнить нужные действия
Если же область изображения – не прямоугольная (круг, как в нашем случае, или более сложная фигура), нужно использовать компоненты класса GraphicsPath для формирования сложных фигур. Объект этого типа описывается в классе Form1
GraphicsPath path;
и в конструкторе класса формы ему выделяется память:
path = new GraphicsPath();
Когда на экране рисуется очередной новый круг, его изображение помещается в предварительно очищенный объект GraphicsPath. Таким образом, в конец метода pictureBox1_Paint надо добавить следующие строки:
//очищаем фигуру
path.Reset();
//начинаем формирование фигуры
path.StartFigure();
//добавляем круг в фигуру
path.AddEllipse(x0-radius, y0 - radius, 2 * radius, 2 * radius);
//завершаем формирование фигуры
path.CloseFigure();
Если изображение состоит из нескольких элементов (не только из одного круга, как в нашем случае), их все нужно добавить в объект GraphicsPath.
