Проектирование графического интерфейса пользователя______________277

void_fastcall TFormI:: PanellMouseMove(TObject *Sender,

TShiftState Shift, int X, int Y)
{

if (! move) return;

Canvas->DrawFocusRect(rec);

rec.Left += X - XO;

rec.Right +=•• X - XO;

rec.Top += Y - YO;

rec.Bottom += Y - YO;

XO = X;

YO = Y;

Canvas->DrawFocusRect(rec);

}

В этой процедуре перерисовывается и сдвигается только прямоугольник кон-
тура компонента с помощью метода DrawFocusRect. Первое обращение к этому
методу стирает прежнее изображение контура, поскольку повторная прорисовка
того же изображения по операции ИЛИ (or) стирает нанесенное ранее изображение
(см. главу 5, раздел 5.1.5). Затем изменяются значения, хранимые в переменной
rec, и той же функцией DrawFocusRect осуществляется прорисовка сдвинутого
прямоугольника. При этом сам компонент остается на месте.

Когда пользователь отпускает кнопку мыши, наступает событие OnMouseUp и
срабатывает следующая процедура:

void_fastcall TFormI::Image3MouseUp(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)
{
Canvas->DrawFocusRect(rec);

((TControl *)Sender)->SetBounds(rec.Left + X - XO,

rec.Top + Y - YO, ((TControl *)Sender)->Width,
((TControl *)Sender)->Height);

move = false;

Первый ее оператор стирает последнее изображение контура, а второй опера-
тор перемещает компонент в новую позицию.

Приведенный алгоритм исключает мерцание изображения, так как само пере-
мещение компонента осуществляется только в момент отпускания кнопки мыши.
К тому же при этом в обработчике события OnMouseUp легко предусмотреть ка-
кие-то условия отказа от перемещения (например, нажатую клавишу Alt). Это по-
лезно в некоторых приложениях, связанных с каким-то проектированием тополо-
гии или размещения предметов: прикинув новое положение компонента пользова-
тель может тут же вернуться к предыдущему, если новое расположение не получа-
ется. С другой стороны, для некоторых задач буксировка только контура мало ин-
формативна. Например, при проектировании какой-то мозаики перемещение кон-
тура не даст представления о том, подойдет ли компонент по своему виду к данно-
му месту. В этих случаях предпочтительнее буксировка всего изображения.

Еще один вариант буксировки контура компонента с помощью технологии
Drag & Drop рассмотрен в конце раздела 4.5.

4.7 Формы

Основным элементом любого приложения является форма — контейнер, в ко-
тором размещаются другие визуальные и невизуальные компоненты. С точки зре-
ния пользователя форма — это окно, в котором он работает с приложением. Каж-
дой новой форме, вводимой в приложение, соответствует свой модуль со своим за-
головочным файлом. Рассмотрим некоторые свойства, методы и события, прису-
щие формам.