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

Первый оператор этой функции запоминает в переменной гес типа TRect ко-
ординаты контура прямоугольника, описывающего ту панель, на которой щелк-
нул пользователь и которая передана в процедуру через параметр Sender. Тип
TRect совпадает с типом свойства BoundsRect, так что можно непосредственно
присваивать друг другу значения переменных этого типа. Поскольку в классе ТОЬ-
ject, к которому относится Sender, свойство BoundsRect не определено, надо ссы-
латься на этот объект как на TPanel, т.е. использовать конструкцию ((TPanel
*)Sender), рассмотренную в предшествующих разделах и в главе 1 в разделе
1.6.6.2.

Второй оператор перемещает панель на место, которое занимает панель Ра-
пе116, соответствующая пустой фишке. Это осуществляется просто присваиванием
свойства BoundsRect панели Рапе116 аналогичному свойству данной панели. Тре-
тий оператор аналогичным образом перемещает панель Рапе116 на место, занимав-
шееся ранее данной панелью и запомненное в переменной гес.

Реальный обработчик должен быть сложнее, учитывать допустимость тех или
иных перемещений и фиксировать окончание игры. Но эти детали не имеют отно-
шения к перемещениям и рассмотрены в сопроводительном тексте к примеру. А
сами перемещения, как вы видите, осуществляются очень просто.

4.6.2 Буксировка компонентов

Рассмотрим теперь буксировку компонентов. В примере на 4.17 различные ва-
рианты буксировки применены к кубикам с изображениями фрагментов картин-
ки. Посмотрим, как можно осуществить буксировку панели с именем Panell.

Введем две переменных: ХО и YO для запоминания координат перемещаемой
панели. Введем также булеву переменную move, которая позволит нам различать
два режима перемещения мыши: буксировку (move = true) и обычное перемеще-
ние без буксировки:             <

int ХО, YO;

bool move = false;

Буксировка начинается при нажатии левой кнопки мыши на соответствующем
компоненте. Поэтому начало определяется событием OnMouseDown перемещаемой
панели, обработчик которого имеет вид:

void_fastcall TFormI:: PanellMouseDown(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)

{
if (Button != mbLeft) return;

XO = X;

YO = Y;

move = t rue;

//Для перемещения поверх других изображений:

Panell->BringToFront() ;

}

Сначала в этой процедуре проверяется, нажата ли именно левая кнопка
мыши (равен ли параметр Button значению mbLeft, обозначающему левую кноп-
ку). Затем в переменных ХО и YO запоминаются координаты мыши Х и Y в этот
момент времени. Задается режим буксировки (переменная move). Последний опера-
тор выдвигает данную панель на передний план с помощью метода BringToFront.
Это позволит ей в дальнейшем перемещаться поверх других компонентов. Данный
оператор не обязателен, но если его не записать, то в процессе буксировки панель
может оказаться под другими компонентами.

Во время буксировки панели работает ее обработчик события OnMouseMove,
имеющий вид: