Чтение онлайн

на главную - закладки

Жанры

ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Троелсен Эндрю

Шрифт:

 public partial class CarControl: UserControl {

public CarControl {

InitializeComponent;

}

 }

}

Перед тем как двигаться дальше, давайте рассмотрим общую картину того, что мы хотим получить. Тип CarControl отвечает за анимацию серии точечных рисунков, которые будут изменяться в зависимости от внутреннего состояния автомобиля. Если текущая скорость автомобиля значительно ниже предельной скорости, для CarControl циклически будут отображаться три точечных рисунка, представляющие безопасное движение автомобиля. Если текущая скорость всего на 10 км/ч ниже

максимальной, для CarControl используется цикл из четырех рисунков, где четвертый рисунок изображает автомобиль, медленно распадающийся на части. Наконец, если автомобиль превысит максимальную скорость, циклы CarControl будет состоять из пяти рисунков, где пятый рисунок изображает "обреченный" автомобиль.

Создание изображений

В соответствии с представленным выше проектом первым делом нужно создать пять файлов *.bmp для использования в циклах анимации. Если вы хотите создать свои пользовательские изображения, выберите пункт меню Project->Add New Item и укажите пять новых файлов точечных изображений. Если вы не хотите демонстрировать свои художественные способности, можете использовать изображения, предлагаемые с исходным кодом этого примера (но имейте в виду, что я не считаю себя большим специалистом в области художественной графики!). Первые три изображения (Lemon1.bmp, Lemon2.bmp и Lemon3.bmp) демонстрируют вполне безопасное и аккуратное движение автомобиля по дороге. Другие два изображения (AboutToBlow.bmp и EngineBlown.bmp) представляют автомобиль, приближающийся к максимальному верхнему пределу скорости, и его "безвременную кончину".

Создание пользовательского интерфейса режима проектирования

Следующим шагом является использование редактора режима проектирования для типа CarControl. Вы увидите нечто подобное окну проектирования формы, в котором будет изображена клиентская область разрабатываемого вами элемента управления. С помощью окна Toolbox добавьте тип ImageList для хранения точечных рисунков (присвойте этому типу имя carImages), тип Timer (с именем imageTimer) для управления циклом анимации и PictureBox (с именем currentImage) для хранения текущего изображения.

Не беспокойтесь о размерах и размещении типа PictureBox, поскольку характеристики этого элемента в CarControl предполагается задать программно. Однако не забудьте установить в окне свойств значение StretchImage для свойства SizeMode элемента PictureBox. На рис. 21.28 показан желательный результат описанных выше действий.

Рис. 21.28. Создание GUI режима проектирования

Затем, используя окно свойств, настройте коллекцию images типа ImageList. добавив рисунки в список. При этом соответствующие элементы нужно добавлять в список последовательно (Lemon1.bmp, Lemon2.bmp, Lemon3.bmp, AboutToBlow.bmp и EngineBlown.bmp), чтобы гарантировать правильную последовательность цикла анимации. Также следует учитывать то, что по умолчанию ширина и высота файлов *.bmp, вставляемых в Visual Studio 2005, равна 47x47 пикселей. Поэтому ImageSize для ImageList тоже следует установить равным 47x47 (иначе вы получите несколько искаженное изображение). Наконец, настройте свой тип Timer так, чтобы его свойство Interval было равно 200, и он был изначально отключен.

Реализация CarControl

После этой подготовительной работы по созданию пользовательского интерфейса вы можете приступить к реализации членов типа. Сначала создайте новый общедоступный перечень AnimFrames, который будет иметь члены, представляющие каждый элемент из ImageList. Этот перечень будет использоваться для определения текущего фрейма, предназначенного для визуализации в PictureBox.

// Вспомогательный перечень для изображений.

public enum AnimFrames {

 Lemon1, Lemon2, Lemon3,

 AbоutТоBlow, EngineBlown

}

Тип CarControl

поддерживает достаточно большой набор приватных данных, необходимых для представления программной логики анимации. Вот краткое описание каждого из членов.

public partial class CarControl: UserControl {

 // Данные состояния.

 private AnimFrames currFrame = AnimFrames.Lemon1;

 private AnimFrames currMaxFrame = AnimFrames.Lemon3;

 private bool IsAnim;

 private int currSp = 50;

 private int maxSp = 100;

 private string carPetName= "Lemon";

 private Rectangle bottomRect = new Rectangle;

 public CarControl {

InitializeComponent;

 }

}

Как видите, здесь есть данные, представляющие текущую и максимальную скорости, название автомобиля, а также два члена типа AnimFrames. Переменная currFrame используется для указания того, какой из членов ImageList следует отобразить. Переменная currMaxFrame используется для обозначения текущего верхнего предела в ImageList (напомним, что в цикле анимации CarControl используются от трех до пяти изображений, в зависимости от скорости автомобиля). Элемент данных IsAnim используется для определения того, что автомобиль в настоящий момент находится в режиме использования анимации. Наконец, член Rectangle(bottomRect) используется для представления нижней части области CarControl. Позже в этой части элемента управления будет отображаться название автомобиля.

Чтобы разделить CarControl на две прямоугольных области, создайте приватную вспомогательную функцию с именем StretchBox. Задачей этого члена будет вычисление правильных размеров члена bottomRect и гарантия того, что элемент PictureBox будет растянут на верхние примерно две трети поверхности типа CarControl.

private void StretchBox {

 // Конфигурация окна изображения.

 currentImage.Top = 0;

 currentImage.Left = 0;

 currentImage.Height = this.Height – 50;

 currentImage.Width = this.Width;

 currentImage.Image = carImages.Images[(int)AnimFrames.Lemon1];

 // Выяснение размеров нижнего прямоугольника.

 rect.bottomRect.X = 0;

 bottomRect.Y = this.Height – 50;

 bottomRect.Height = this.Height – currentImage.Height;

 bottomRect.Width = this.Width;

}

После установки размеров каждого прямоугольника в рамках конструктора, заданного по умолчанию, вызывается StretchBox.

public CarControl {

 InitializeComponent;

 StretchBox;

}

Определение пользовательских событий

Тип CarControl обеспечивает поддержку двух событий, отправляемых содержащей тип форме в зависимости от текущей скорости автомобиля. Первое событие, AboutToBlow, генерируется тогда, когда скорость CarControl приближается к верхнему пределу. Событие BlewUp отправляется контейнеру тогда, когда текущая скорость становится больше позволенного максимума. Каждое из этих событий использует пользовательский делегат (CarEventHandler), который может содержать адрес любого метода, возвращающего void и получающего System.String в качестве параметра. Мы обработаем эти события чуть позже, a пока что добавьте к группе открытых элементов CarControl следующие члены.

Поделиться:
Популярные книги

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Последняя Арена 6

Греков Сергей
6. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 6

По воле короля

Леви Кира
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
По воле короля

Душелов. Том 4

Faded Emory
4. Внутренние демоны
Фантастика:
юмористическая фантастика
ранобэ
фэнтези
фантастика: прочее
хентай
эпическая фантастика
5.00
рейтинг книги
Душелов. Том 4

Темный Лекарь 2

Токсик Саша
2. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 2

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

(Не) моя ДНК

Рымарь Диана
6. Сапфировые истории
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
(Не) моя ДНК

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Измена. Наследник для дракона

Солт Елена
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Измена. Наследник для дракона

Неудержимый. Книга II

Боярский Андрей
2. Неудержимый
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга II

Камень. Книга 4

Минин Станислав
4. Камень
Фантастика:
боевая фантастика
7.77
рейтинг книги
Камень. Книга 4

Измена. Право на сына

Арская Арина
4. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на сына

Инквизитор Тьмы 4

Шмаков Алексей Семенович
4. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы 4

Кротовский, сколько можно?

Парсиев Дмитрий
5. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кротовский, сколько можно?