- •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.3. Программная реализация «отскакивания от стенок»
Для создания подобного эффекта нужно отслеживать координаты круга с учетом его радиуса. В этом случае удобно создать в классе формы две дополнительные переменные, задающие направление движения по каждой из осей координат:
int xDir, yDir;
Переменная xDir принимает значение 1, если круг двигается вправо, и –1, если влево. Переменная yDir равна 1, если идет движение вниз, и –1, если вверх. Поскольку изначально напрвление вижения задается вправо вверх, этим переменным нужно задать соответствующие исходные значения (в конструкторе или в обработчике события Load):
xDir = 1;
yDir = -1;
«Отскакивание от стенок» реализуется за счет изменения значений этих переменных. Если круг «подлетел» к левой стенке, то после этого он должен начать двигаться вправо, т.е. переменной xDir нужно присвоить значение 1, и т.д. Приближение к стенкам отслеживается по значениям переменных x0 и y0 с учетом радиуса круга. При этом при «касании» кругом правой и нижней стенок необходимо вносить корректировку в 5 пикселей из-за наличия трехмерной рамки у области рисования.
Таким образом, обработчик события Tick для таймера модифицируется следующим образом:
private void timer1_Tick(object sender, EventArgs e)
{
//если круг "подлетел" к левой стенке,
if (x0 - radius < 0)
xDir = 1; //то начинаем двигаться вправо
//если к правой стенке,
if (x0 + radius + 5 > pictureBox1.Width)
xDir = -1; //то влево
//если к верхней стенке,
if (y0 - radius < 0)
yDir = 1; //то вниз
//если к нижней стенке,
if (y0 + radius + 5 > pictureBox1.Height)
yDir = -1; //то вверх
//изменяем координаты круга
x0 += xDir;
y0 += yDir;
//обновляем область рисования (перерисовываем круг)
pictureBox1.Invalidate();
}
3.2.4. Изменение скорости движения круга
Для изменения скорости движения нужно изменять интервал поступления сигнала от таймера, что, в свою очередь, будет регулироваться компонентом TrackBar. Интервал сигнала от таймера в данном приложении задается диапазоном от 5 до 50 миллисекунд. Соответствующие настройки задаются и для компонента TrackBar:
Свойство |
Значение |
Описание |
Minimum |
5 |
Минимальное значение |
Maximum |
50 |
Максимальное значение |
Value |
10 |
Текущее значение |
При прокрутке движка компонента TrackBar программе поступает сообщение Scroll, в обработчике которого и нужно изменять значение интервала таймера:
private void trackBar1_Scroll(object sender, EventArgs e)
{
//изменяем значение интервала таймера на выбранное
timer1.Interval = trackBar1.Value;
}
3.2.5. Создание диалоговой панели выбора цвета заливки
Для выбора цвета заливки круга в данном приложении будет использоваться дополнительное диалоговое окно с группой радиокнопок. Внешний вид этого окна приведен на рисунке 2.8.
Рис. 2.8 – Диалоговая панель выбора цвета заливки
В этом окне в компоненте GroupBox расположены 6 радиокнопок (RadioButton)с названиями цветов, а также 2 кнопки: «OK» и «Отмена». На кнопки помимо надписей добавлены соответствующие рисунки.
Рисунки можно добавить на кнопку либо через ее свойство Image, либо, как и сделано в данной программе, через компонент ImageList. Этот компонент представляет собой список изображений, которые потом можно назначать обычным кнопкам, пунктам меню, кнопкам панели инструментов и другим компонентам. После помещения этого компонента на форму нужно настроить его свойство Images, где с помощью отдельного диалогового окна в проект добавляются файлы с изображениями. Каждое добавленное изображение имеет свой индекс (порядковый номер), начиная с 0. В данном приложении рисунок для кнопки «OK» имеет индекс 0, а для кнопки «Отмена» – 1.
Файлы с рисунками и иконками можно найти в папке: C:\Program Files\Microsoft Visual Studio 8\Common 7\VS2005ImageLibrary.
Настройки кнопок «OK» и «Отмена» приведены в таблице:
Свойство |
Значение |
Описание |
ImageList |
imageList1 |
Источник изображений |
ImageIndex |
0 для кнопки «OK», 1 для кнопки «Отмена» |
Индекс изображения в источнике |
ImageAlign |
MiddleCenter |
Выравнивание изображения |
TextAlign |
MiddleCenter |
Выравнивание текста |
TextImageRelation |
ImageBeforeText |
Взаимное расположение текста и изображения |
DialogResult |
OK для кнопки «OK», Cancel для кнопки «Отмена» |
Возвращаемое значение для нажатия кнопки |
Установка значения OK свойству DialogResult для кнопки «OK» означает, что при нажатии на эту кнопку форма закроется и вернет в главное окно значение DialogResult.OK (для кнопки «Cancel» – DialogResult.Cancel).
