// Выбор имени машины.
public string PetName {
get { return carPetName; }
set {
CarPetName = value;
Invalidate();
}
}
Далее, у нас есть свойство Speed. Вдобавок к простому изменению члена currSp, свойство Speed – это элемент, "стимулирующий" генерирование событий AboutToBlow и BlewUp, в зависимости от текущей скорости CarControl. Вот как выглядит соответствующая программная логика.
// Проверка currSp и currMaxFrame и генерирование событий.
public int Speed {
get { return currSp; }
set {
// В пределах безопасной скорости?
if (currSp ‹= maxSp) {
currSp = value;
currMaxFrame = AnimFrames.Lemon3;
}
// Вблизи взрывоопасной ситуации?
if ((maxSp – currSp) ‹= 10) {
if (AboutToBlow != null) {
AboutToBlow("Чуть помедленнее, парень!");
currMaxFrame = AnimFrames.AboutToBlow;
}
}
// Превышаем?
if (currSp ›= maxSp) {
currSp = maxSp;
if (BlewUp != null) {
BlewUp("М-да… тебе крышка… ");
currMaxFrame = AnimFrames.EngineBlown;
}
}
}
}
Как видите, если текущая скорость становится лишь на 10 км/ч ниже максимальной допустимой скорости, вы генерируете событие AboutToBlow и сдвигаете верхний предел фреймов анимации к значению AnimFrames.AboutToBlow. Если пользователь превышает возможности вашего автомобиля, вы генерируете событие BlewUp и сдвигаете верхнюю границу фреймов к AnimFrames.EngineBlown. Если скорость ниже максимальной, верхний предел фреймов остается равным AnimFrames.Lemon3.
Следующей задачей является обеспечение гарантий того, что тип Timer сместит текущий фрейм визуализации в рамках PictureBox. Снова напомним, что число фреймов в цикле анимации зависит от текущей скорости автомобиля. Необходимость изменений изображений в PictureBox возникает только тогда, когда свойство Animate равно true (истина). Начните с обработки события Tick для типа Timer, используя следующий программный код.
private void imageTimer_Tick(object sender, EventArgs s) {
if (IsAnim) currentImage.Image = carImages.Images[(int)currFrame];
// Сдвиг фрейма.
int nextFrame = ((int)currFrame) + 1;
currFrame = (AnimFrames)nextFrame;
if (currFrame › currMaxFrame) currFrame = AnimFrames.Lemon1;
}
Чтобы завершить создание элемента управления, вы должны отобразить название автомобиля. Для этого обработайте событие Paint для CarControl и в рамках обработчика этого события отобразите PetName вашего CarControl в нижней прямоугольной области клиента.
private void CarControl_Paint(object sender, PaintEventArgs e) {
// Отображение названия в нижнем прямоугольнике.
Graphics g = e.Graphics;
g.FillRectangle(Brushes.GreenYellow, bottomRect);
g.DrawString(PetName, new Font("Times New Roman", 15), Brushes.Black, bottomRect);
}
На этом начальный этап построения CarControl завершается. Теперь выполните компоновку своего проекта.
Тестирование типа CarControl
При запуске или отладке проекта Windows Control Library в Visual Studio 2005 иcпользуется UserControl Test Container (испытательный контейнер пользовательских элементов управления). Это управляемый вариант теперь уже устаревшего ActiveX Control Test Container (испытательный контейнер элементов управления ActiveX). Этот инструмент автоматически загружает ваш элемент управления в окружение испытательного стенда режима проектирования. Как показывает рис. 21.29, этот инструмент позволяет установить для проверки значение любого пользовательского свойства (как и любого наследуемого).
Рис. 21.29. Тестирование CarControl в испытательном контейнере
Установив для свойства Animate значение true (истина), вы увидите цикл анимации CarControl с использованием первых трех файлов *.bmp. Однако с помощью этой утилиты тестирования вы не сможете обрабатывать события. Чтобы проверить эту возможность вашего элемента интерфейса, нужно построить пользовательскую форму.
Создание пользовательской формы для CarControl
Как и в случае любого другого .NET-типа, вы можете использовать свой элемент управления в рамках любого языка, совместимого со средой CLR. Закройте текущее рабочее пространство и создайте новый C#-проект Windows Application с именем CarControlTestForm. Чтобы сослаться на пользовательские элементы управления из Visual Studio 2005, щелкните правой кнопкой мыши в любом месте окна Toolbox и выберите пункт меню Choose Item (Выбрать элемент). Используя кнопку Browse (Просмотр) на вкладке .NET Framework Components (Компоненты .NET), перейдите к своей библиотеке CarControlLibrary.dll. После щелчка на кнопке OK вы обнаружите в панели инструментов новую пиктограмму с названием, конечно же, CarControl.
Читать дальше