Компоненты отображения графической информации План



бет7/8
Дата26.09.2022
өлшемі456.68 Kb.
#461398
1   2   3   4   5   6   7   8
Lek - 17 Компоненты отображения графической информации

Рисунок 6. Digital Clock



Рисунок 7. Битовый образ



Рисунок 8. Форма программы Digital Clock

Листинг 3. Digital Clock

private:
Bitmap^ digits; // цифры
// размер кадра (цифры)
int wd;
int hd;
int x0,y0; // левый верхний угол индикатора
int s; // счетчик секунд


// конструктор
public: Form1(void)
{
InitializeComponent();
digits = gcnew Bitmap(Application::StartupPath + "\\digits_1.bmp");
// размер битового образа цифры
hd = digits->Height;
wd = (digits->Width)/10;
// положение левого верхнего угла индикатора (2 цифры) в поле pictureBox
x0 = (pictureBox1->Width — 2*wd)/2; y0 = (pictureBox1->Height — hd) /2;
s = 0;
}


// кнопка Пуск/Стоп
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
timer1->Enabled = ! timer1->Enabled;
if (timer1->Enabled)
{
button1->Text = "Стоп"; button2->Enabled = false;
}


else
{
button1->Text = "Пуск"; button2->Enabled = true;
}
}


// сигнал от таймера
private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) {
if (s < 59) s++;
else s = 0;
// перерисовать компонент pictureBox1
pictureBox1->Refresh();
}


private: System::Void pictureBox1_Paint(System::Object^ sender,
System::Windows::Forms::PaintEventArgs^ e) {
int d0,d1;
d0 = s % 10; // кол-во единиц секунд (младший разряд)
d1 = s / 10; // кол-во десятков секунд (старший разряд)
Rectangle r1; // куда копировать фрагмент битового образа
Rectangle r2; // откуда (положение и размер копируемого фрагмента)


// **** старший разряд (десятки секунд) ****
// куда копировать
r1.X = x0; r1.Y= y0;
r1.Width = wd; r1.Height = hd;


// задать положение фрагмента, в котором находится нужная цифра
r2.X = d1*wd; r2.Y= 0;
r2.Width = wd; r2.Height = hd;


//копировать фрагмент битового образа digits на поверхность компонента picturePox1
e->Graphics->DrawImage(digits,r1,r2,GraphicsUnit::Pixel);


// **** секунды (младший разряд) ****
r1.X = r1.X + wd; // куда копировать
r2.X = d0*wd; // откуда копировать

e->Graphics->DrawImage(digits,r1,r2,GraphicsUnit::Pixel);


}


// кнопка Сброс
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
s = 0;
pictureBox1->Refresh();
}

Конструктор загружает битовый образ из файла, и, используя информацию о размере загруженного битового образа, функция устанавливает значения характеристик кадра: высоту и ширину (в файле находится изображение 10 цифр, поэтому ширина кадра равна 1/10 ширины загруженного битового образа). Основную работу в программе выполняет функция обработки события Paint компонента PictureBox. Она определяет цифры, которые надо вывести, и выводит их на графическую поверхность компонента. Положение фрагмента битового образа (координата х левого верхнего угла) для старшего разряда индикатора определяется умножением текущего значения d0 (количество десятков секунд) на ширину кадра. Аналогичным образом определяется положение фрагмента битового образа для младшего разряда индикатора. Событие Paint компонента PictureBox возникает с периодом, равным периоду возникновения события Timer — таймер путем вызова метода Refresh инициирует возникновение события Paint компонента PictureBox.


В программе Digital Clock для формирования динамической картинки использовался "классический" подход создания анимации, предполагающий наличие заранее подготовленной серии картинок (кадров), последовательное отображение которых и создает эффект анимации. Возможен и другой подход к созданию динамических изображений, когда картинка (кадр) формируется из заранее подготовленных фрагментов "на лету", во время работы программы.
Типичным примером такой анимации является перемещение объекта на фоне какой-либо картинки. Чтобы у наблюдателя сложилось впечатление, что объект движется, надо вывести изображение объекта, затем, через некоторое время, стереть его и снова вывести, но уже на некотором расстоянии от первоначального положения. Подбором времени между удалением и выводом изображения, а также расстояния между новым и предыдущим положением объекта (шага перемещения) можно добиться эффекта равномерного движения.
Программа "Полет" (ее форма и окно приведены на рис. 9, а текст — в листинге 4) демонстрирует принципы создания анимации "на лету", показывает, как заставить объект двигаться.









Достарыңызбен бөлісу:
1   2   3   4   5   6   7   8




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет