Исходники
Статьи
Языки программирования
.NET Delphi Visual C++ Borland C++ Builder C/С++ и C# Базы Данных MySQL MSSQL Oracle PostgreSQL Interbase VisualFoxPro Веб-Мастеру PHP HTML Perl Java JavaScript Протоколы AJAX Технология Ajax Освоение Ajax Сети Беспроводные сети Локальные сети Сети хранения данных TCP/IP xDSL ATM Операционные системы Windows Linux Wap Книги и учебники
Скрипты
Магазин программиста
|
Ishodniki.Ru » Online книги » C++ Builder по шагам Шаг 28 - Канва Технике рисования в C++ Builder вообще можно было бы посвятить отдельный раздел. Но раздела пока нет, так что будем писать сейчас. В основе управления рисованием, или, скажем умнее - управления графикой, лежит GDI - один из интерфейсов WinAPI, предназначенный как раз для этого. Библиотеки OWL или MFC практически не повышали уровень взаимодействия. А это достаточно трудоемкая техника, хотя по своему очень мощная. VCL вводит для этого новый класс - TCanvas. Большинство визуальных компонентов имеют свойство TCanvas. Эо позволяет рисовать на их поверхности. TCanvas инкапсулирует большое число функций и свойств. Как известно, основополагающими понятиями GDI являются Pen и Brush. Чтобы сразу вся было понятно, скажу, что Pen отвечает за выведение обводок и линий, а Brush за заливку. В общем, можно долго говорить оп преимуществах, но лучше показать, правда? Примерчик рисует разноцветные линии на форме по таймеру. Конструктор формы общий. HPEN PenHandle,PHOld; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { randomize(); PenHandle=CreatePen(PS_SOLID,1,RGB(255,0,0)); BrushHandle=CreateSolidBrush(RGB(255,0,0)); } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { PHOld=SelectObject(Canvas->Handle,PenHandle); DeleteObject(PHOld); MoveToEx(Canvas->Handle,ClientWidth/2,ClientHeight/2,0); PenHandle=CreatePen(PS_SOLID,1,RGB(random(255),random(255),random(255))); LineTo(Canvas->Handle,random(ClientWidth),random(ClientHeight)); } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer2Timer(TObject *Sender) { Canvas->MoveTo(ClientWidth/2,ClientHeight/2); Canvas->Pen->Color=RGB(random(255),random(255),random(255)); Canvas->LineTo(random(ClientWidth),random(ClientHeight)); } //--------------------------------------------------------------------------- В общем-то и тот, и другой метод оперируют с канвой одинаково. Но обратите внимание на размеры кода! Еще у первого варианта есть неприятная особенность перекидываеться на другие объекты пр ошибках. Вот так. Еще забыл сказать, зачем вообще завел тему про канву. Дело в том, что в следующих Шагах часто будут попадаться примеры взаимодействия канвы в приложениях. Так что без теоретических знаний не обойтись. |
Форум Программиста
Новости Обзоры Магазин Программиста Каталог ссылок Поиск Добавить файл Обратная связь Рейтинги
|