Графика и мультимедиа___________________________________349

// Рисование рамки
Image3->Canvas->DrawFocusRect(R) ;

RBegin = true;

Эти операторы запоминают координаты мыши Х и Y в переменных ХО и YO, за-
дают начальные координаты прямоугольной области — переменной R типа TRect и
рисуют рамку (пока нулевого размера) методом DrawFocusRect. Устанавливается
также флаг начала выделения фрагмента — переменная RBegin.

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

// Стирание прежней рамки
Image3->Canvas->DrawFocusRect(R) ;

// формирование области R
if (ХО < X) ( R.Left = ХО; R.Right = X; }

else { R.Left = X; R.Right = ХО; }
if (YO < Y) { R.Top = YO; R.Bottom = Y; }

else ( R.Top = Y; R.Bottom = YO; }

// Рисование новой рамки
Image3->Canvas->DrawFocusRect(R) ;

Первый из этих операторов стирает прежнее изображение рамки (напомним,
что метод DrawFocusRect рисует рамку с помощью операции XOR). Два следую-
щих оператора формируют новую область R из начальных координат (ХО, YO) и те-
кущих координат курсора (X, Y). Дело в том, что область, передаваемая в функ-
цию DrawFocusRect, должна быть сформирована «правильно» — значение R.Left
должно быть меньше R.Right, а R.Top — меньше R.Bottom. Поскольку пользова-
тель может перемещать курсор в любом направлении и соотношение координат
(ХО, YO) и (X, Y) может быть любым, требуется упорядочивание координат.

Последний оператор рисует рамку в новом положении.

Итак, рамка, ограничивающая фрагмент нарисована. Теперь рассмотрим про-
цедуру перетаскивания пользователем выделенного фрагмента. Если пользователь
помещает курсор внутрь выделенной области и нажимает кнопку мыши, выполня-
ются операторы:

// Стирание прежней рамки
Image3->Canvas->DrawFocusRect(R);

// Установка флага перетаскивания
RDrag = true;

// Запоминание начального положения курсора мыши

ХО = X;

YO = Y;

// Запоминание начального положения перетаскиваемого фрагмента

RO.TopLeft = R.TopLeft;

RO.BottomRight = R.BottomRight;

// Запоминание изображения
BitMap->Assign(Image3->Picture) ;

// Установка цвета кисти
Image3->Canvas->Brush->Color = Image2->Canvas->Brush->Color;

Первый оператор стирает рамку. Второй — устанавливает флаг перетаскива-
ния — переменную RDrag. Два следующих оператора запоминают начальное поло-
жение перетаскиваемого фрагмента в переменной RO типа TRect. Следующий опе-
ратор запоминает методом Assign изображение в момент начала перетаскивания в
переменной Bitmap. Это необходимо, чтобы в процессе перетаскивания можно