Ранее мы рассматривали и использовали копирование одного графического объекта в другой методом Assign. Однако, у канвы имеются и другие методы копирования. Это прежде всего метод CopyRect, позволяющий копировать прямоугольную область источника изображения в прямоугольную область данной канвы. Метод определен следующим образом:
void _fastcall CopyRect(const Windows::TRect &Dest, TCanvas* Canvas, const Windows::TRect &Source);
Параметр Dest определяет прямоугольную область канвы, в которую производится копирование. Параметр Canvas указывает источник, из которого копируется изображение. Это может быть канва любого компонента: типа Tlmage, типа TBitmap и др. В частном случае источником может быть и канва того же компонента, в который производится копирование. Параметр Source определяет прямоугольную область в источнике изображения, которая копируется в область Dest. Обе прямоугольные области и в источнике, и в приемнике имеют тип TRect.
Копирование — это не просто перенос изображения. В общем случае копирование означает сложное взаимодействие копируемого изображения и того, которое было до этого в области, куда производится копирование. Характер этого взаимодействия определяется параметром CopyMode (режим копирования) той канвы, в которую производится копирование. По умолчанию значение CopyMode равно cmSrcCopy. Это единственный режим, при котором производится действительное копирование: изображение в Dest стирается и заменяется скопированным. Есть два значения — cmWhiteness и cmBlackness, при которых собственно никакое копирование не производится: просто область закрашивается соответственно белым или черным цветом. А все остальные режимы определяют сложное взаимодействие копируемого изображения с тем, которое было в Dest. Особый интерес представляет режим cmSrdnvert, при котором изображения канвы и источника комбинируются, используя булеву операцию XOR. Так же, как мы видели это для пера, повторное копирование в подобном режиме восстанавливает прежнее изображение на канве. Интересен также режим cmSrcAnd. Если копируемое изображение представляет собой контурный черный рисунок на белом фоне, то этот рисунок наложится на прежнее изображение канвы, а белый фон будет прозрачным, так что под ним будет видно первоначальное изображение. В режиме cmSrcPaint аналогичный эффект будет, если копируемое изображение представляет собой белый контурный рисунок на черном фоне.
Приведем примеры копирования в различных режимах. Операторы
Imagel->Canvas->CopyMode = cmSrcCopy;
Imagel->Canvas->CopyRect(Rect(0,0,200,200),Image2->Canvas, Rect (0,0,200,200));
обеспечивают копирование изображения фрагмента канвы компонента Image2 в указанную область канвы компонента Imagel. Изображение, которое ранее было на канве компонента Imagel в пределах области с координатами углов (0, 0) и (200, 200), просто заменяется новым. Операторы
Imagel->Canvas->CopyMode = cmSrcinvert;
Imagel->Canvas->CopyRect(Rect(0,0,200,200),Image2->Canvas, Rect (0,0,200,200));
Imagel->Canvas->CopyRect(Rect(0,0,200,200),Image2->Canvas, Rect (0,0,200,200) );
обеспечивают копирование изображения фрагмента канвы компонента Image2 в указанную область канвы компонента Imagel в режиме cmSrcinvert. После выполнения функции CopyRect в первый раз изображения в компонентах Imagel и Image2 налагаются друг на друга, а в результате выполнения функции CopyRect во второй раз исходное изображение на канве компонента Imagel восстанавливается.
Операторы
Imagel->Canvas->CopyMode = cmWhiteness;
Imagel->Canvas->CopyRect(Rect(0,0,200, 200),Image2->Canvas, Rect(0,0,200,200));
просто очищают указанную область канвы компонента Imagel, закрашивая ее белым цветом. При этом изображение в компоненте Image2 никак не участвует в операциях копирования.
Еще один метод копирования — BrushCopy вы можете посмотреть в справочной части книги. Он сохраняется, как заявляют сами авторы C++Builder, только для совместимости с более ранними версиями системы.
Помимо методов копирования свойство CopyMode используется также методом рисования на канве Draw. Его описание:
void _fastcall Draw(int X, int Y, TGraphic* Graphic);
Метод Draw рисует изображение, содержащееся в объекте, указанном параметром Graphic, сохраняя исходный размер изображения в его источнике и перенося изображение в область канвы объекта, верхний левый угол которой определяется параметрами X и Y. Источник изображения может быть битовой матрицей, пиктограммой или метафайлом. Если источник — объект типа TBitmap, то перенос изображения производится в режиме, установленном свойством канвы CopyMode.
Например, оператор
Imagel->Canvas->Draw(10,10,Bitmapl);
рисует на канве компонента Image1 изображение из компонента Bitmap1 в область с координатами левого верхнего угла (10, 10).
Еще один метод рисования — DrawFocusRect. Этот метод рисует изображение прямоугольника в виде, используемом для отображения рамки фокуса, операцией XOR. Функция DrawFocusRect объявлена следующим образом:
void _fastcall DrawFocusRect(const Windows::TRect SRect);
где Rect — прямоугольная область. Поскольку при рисовании используется операция XOR, то повторный вызов этого метода с тем же значением Rect удаляет изображение прямоугольника.
