350______________________________________________Глава 5

было восстанавливать испорченные места изображения и чтобы при желании по
льзователя можно было в дальнейшем отменить результат перетаскивания. По-
следний оператор задает цвет кисти равным вспомогательному цвету, хранящему
ся в компоненте Image2.

При событии OnMouseMove компонента Image3, если установлен флаг RDrag.
выполняются операторы:

// Восстановление изображения под перетаскиваемым фрагментом
Image3->Canvas->CopyRect(R,BitMap->Canvas,R) ;

// Если не нажата клавиша Ctrl — стирание изображения в RO
if (! Shift.Contains(ssCtrl))
Image3->Canvas->FillRect(RO) ;

// Формирование нового положения фрагмента
R.Left = R.Left + X - XO;

R.Right = R.Right + X - XO;

R.Top = R.Top + Y - YO;

R.Bottom = R.Bottom + Y - YO;

// Запоминание положения курсора мыши
XO = X;

YO = Y;

// Рисование фрагмента в новом положении

Image3->Canvas->CopyRect(R,BitMap->Canvas,RO) ;

// Рисование рамки

Image3->Canvas->DrawFocusRect(R);

Первый оператор восстанавливает изображение под перетаскиваемым фраг
ментом в его прежней позицией (т.е. стирает фрагмент), копируя соответствую
щую область методом CopyRect из компонента BitMap. Далее, если не нажата к-пс;

виша Ctrl, то очищается область начального размещения фрагмента (осуществляв':

ся вырезание) методом FillRect. В противном случае начальное изображение фраг
мента остается на месте. Затем запоминаются новые координаты курсора и ново'
положение фрагмента, после чего фрагмент и его рамка рисуются в новом положс

НИИ.

Вот в общих чертах и все, что надо сделать для осуществления наиболее слоя:

ных операций — выделения фрагмента и его перетаскивания.

Режимы рисования заполненного и не заполненного прямоугольников проще
Начало этих режимов по событию OnMouseDown и их продолжение по события':

OnMouseMove не отличаются от рассмотренного ранее режима выделения фраг
мента. Отличие только в том, что при завершении формирования пользователе::

прямоугольной рамки, т.е. при событии OnMouseUp, надо в данном случае нарисс
вать прямоугольник. Рисование заполненного прямоугольника осуществляете;

операторами:

Image3->Canvas->Brush->Color = Image2->Canvas->Brush->Color;

Image3->Canvas->Pen->Color = Imagel->Canvas->Brush->Color;

Image3->Canvas->Rectangle(R.Left,R.Top,R.Right,R.Bottom) ;

Они задают цвета кисти и пера и рисуют прямоугольник методом Rectangle.
Рисование не закрашенного прямоугольника осуществляется операторами:

Image3->Canvas->Brush->Color = Imagel->Canvas->Brush->Color;

Image3->Canvas->FrameRect(R) ;

Обратите внимание, что равным основному цвету задается цвет кисти, а г
пера, поскольку метод FrameRect рисует цветом кисти.