|
Исходники
Статьи
Языки программирования
.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));
}
//---------------------------------------------------------------------------
В общем-то и тот, и другой метод оперируют с канвой одинаково. Но обратите внимание на размеры кода! Еще у первого варианта есть неприятная особенность перекидываеться на другие объекты пр ошибках. Вот так. Еще забыл сказать, зачем вообще завел тему про канву. Дело в том, что в следующих Шагах часто будут попадаться примеры взаимодействия канвы в приложениях. Так что без теоретических знаний не обойтись. |
Форум Программиста
Новости
Обзоры
Магазин Программиста
Каталог ссылок
Поиск
Добавить файл
Обратная связь |