БлогNot. Visual C++: рисуем светофор на канве формы

Visual C++: рисуем светофор на канве формы

В блоге уже есть развёрнутый пример на PictureBox, показывающий основные операции над картинками, а также примеры на доступ к канве формы и действия с таймером. Теперь решим простую типовую задачку на создание "анимационного" приложения:

На графической канве отобразить работу светофора с задержкой между состояниями "красный-жёлтый-зелёный" 1 сек.

Форма приложения – пустая Windows Forms.

Для решения задачи используем канву формы и программно созданный таймер. Опишем таймер и счётчик состояний в классе формы:

private: Timer ^timer1;
private: int cnt;

По событию загрузки формы (Load) настроим размеры окна и инициализируем таймер:

private: System::Void MyForm_Load(System::Object^  sender, System::EventArgs^  e) {
 this->ClientSize = System::Drawing::Size(100, 300);
 this->DoubleBuffered = true;
 timer1 = gcnew Timer();
 timer1->Interval = 1000;
 timer1->Tick += gcnew EventHandler(this, &MyForm::timer1_Tick);
 timer1->Enabled = true;
 cnt = 0;
}
private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) {
 Invalidate();
 cnt = (cnt + 1) % 3;
}

Обратите внимание, что добавленный обработчик таймера только вызывает перерисовку формы (вызов Invalidate(), отправляющий сообщение стандартному методу пререрисовки Paint()) и меняет счётчик состояний cnt, а саму отрисовку будет делать только Paint:

private: System::Void MyForm_Paint(System::Object^  sender, System::Windows::Forms::PaintEventArgs^  e) {
 array <Pen ^> ^pens = gcnew array <Pen ^>(3) { Pens::Red, Pens::Yellow, Pens::Green };
 for (int i = 0; i < 3; i++)
  e->Graphics->DrawEllipse(pens[i], 0, i * 100, 100, 100); //контуры 3 кружков
 array <Brush ^> ^brushes = 
  gcnew array <Brush ^>(3) { Brushes::Red, Brushes::Yellow, Brushes::Green };
 e->Graphics->FillEllipse(brushes[cnt], 0, cnt * 100, 100, 100); //текущий закрасить
}

Для удобства в функции описаны массивы перьев Pen и кистей Brush нужных цветов.

Альтернативный подход (без привязки к методу Paint) – программно создать Bitmap нужной размерности, выполнять отрисовку на нём, а затем назначить его компоненте PictureBox, как и делалось по ссылкам.

Задача решена полностью, проверено в Visual Studio 2015.

08.12.2015, 12:24 [9245 просмотров]


теги: учебное графика c++/cli

К этой статье пока нет комментариев, Ваш будет первым