Технике рисования в 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)); } //---------------------------------------------------------------------------
В общем-то и тот, и другой метод оперируют с канвой одинаково. Но обратите внимание на размеры кода! Еще у первого варианта есть неприятная особенность перекидываеться на другие объекты пр ошибках. |