Канва

Технике рисования в 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));
}
//---------------------------------------------------------------------------

В общем-то и тот, и другой метод оперируют с канвой одинаково. Но обратите внимание на размеры кода! Еще у первого варианта есть неприятная особенность перекидываеться на другие объекты пр ошибках.

 
« Предыдущая статья   Следующая статья »