- •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. Пример выполнения работы
Задание. Реализовать эффект движения простейшего геометрического объекта (круга) внутри области рисования с «отскакиванием от стенок». Предусмотреть возможность изменения его цвета и скорости движения. Изменение цвета круга происходит при щелчке в нем левой кнопкой мыши. Скорость регулируется с помощью компонента TrackBar.
3.1. Визуальное проектирование диалогового окна
Внешний вид главного окна приложения приведен на рисунке 2.7.
Рис. 2.7. Главное окно приложения
Для графической панели pictureBox1 устанавливаются свойства:
Свойство |
Значение |
Описание |
BorderStyle |
Fixed3D |
Стиль границы |
BackColor |
White |
Цвет фона |
Настройки компонента trackBar1 будут рассматриваться далее.
3.2. Проектирование программного кода
3.2.1. Начальное рисование фигуры
Т.к. в данном приложении будет создаваться кисть со штриховой заливкой, прежде всего, необходимо в файл главной формы подключить пространство имен System.Drawing.Drawing2D.
Для рисования круга необходимо иметь координаты его центра и радиус. Для этого нужно объявить соответствующие переменные в классе формы:
int x0, y0;
int radius;
Начальные значения этим переменным можно установить в конструкторе формы или в обработчике события Load. Здесь начальное положение круга – левый нижний угол области рисования, радиус – 30 пикселей.
x0 = 30;
y0 = pictureBox1.Height - 35;
radius = 30;
Рисование круга будет производиться в обработчике события Paint области рисования pictureBox1. Процесс рисования состоит из создания объекта Graphics, очистки области рисования, создания кисти и непосредственного рисования круга. Кисть создается как объект класса HatchBrush (штриховая кисть). При этом первым параметром задается стиль заливки (здесь – HatchStyle.SolidDiamond – «шахматка»), вторым параметром – основной цвет заливки (желтый). Можно указать и третий параметр – «неосновной» цвет или цвет фона (по умолчанию – черный). При рисовании круга (метод FillEllipse()) необходимо задать кисть для заливки, координаты левого верхнего угла прямоугольника, ограничивающего окружность, а также его стороны. Код обработчика приведен ниже:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
//создаем графический объект
Graphics g = e.Graphics;
//очищаем область рисования
g.Clear(Color.White);
//создаем штриховую кисть желтого цвета
HatchBrush brush = new HatchBrush(HatchStyle.SolidDiamond, Color.Yellow);
//рисуем круг
g.FillEllipse(brush, x0 - radius, y0 - radius, 2 * radius, 2 * radius);
}
3.2.2. Реализация движения фигуры
Реализация движения основана на использовании компонента-таймера (Timer). После помещения на форму его свойству Interval (интервал в миллисекундах, через который поступает сигнал от таймера) устанавливается значение 10.
По нажатию кнопки «Start» необходимо активизировать («включить») таймер, а кнопки «Stop» – остановить его.
//кнопка "Start"
private void button1_Click(object sender, EventArgs e)
{
timer1.Start();
}
//кнопка "Stop"
private void button2_Click(object sender, EventArgs e)
{
timer1.Stop();
}
Чтобы заставить фигуру «двигаться», достаточно изменять ее координаты по сигналу таймера, после чего перерисовать фигуру:
private void timer1_Tick(object sender, EventArgs e)
{
//изменяем координаты круга
x0++;
y0--;
//обновляем область рисования (перерисовываем круг)
pictureBox1.Invalidate();
}
В данном случае после нажатия кнопки «Start» круг будет двигаться по диагонали вправо вверх (координата x увеличивается, y – уменьшается), пока не исчезнет за пределами области рисования или пока не будет нажата кнопка «Stop».
