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 [9362 просмотра]