Шаг 77.
Microsoft Visual C++ 2010. Начала.
Программирование. Графика... . Использование метода DrawImage

    На этом шаге мы рассмотрим пример использования указанного метода.

    Программа Digital Clock (рисунок 1) демонстрирует использование метода DrawImage для вывода на графическую поверхность фрагмента битового образа.


Рис.1. Программа Digital Clock

    Цифры, отображаемые в окне, — это фрагменты битового образа (рисунок 2).


Рис.2. Битовый образ

    Форма программы Digital Clock приведена на рисунке 2, конструктор формы и функции обработки событий — в тексте ниже.


Рис.3. Форма программы Digital Clock

    Текст приложения.

.   .   .   .   .
// конструктор 
Form1(void)
{
	InitializeComponent();
	//
	//TODO: добавьте код конструктора
	//
	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: 
	Bitmap^ digits; // цифры 
	// размер кадра (цифры) 
	int wd; 
	int hd; 
	int x0,y0; // левый верхний угол индикатора 
	int s; // счетчик секунд 

// кнопка Пуск/Стоп 
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.

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг