Чтение онлайн

на главную

Жанры

О чём не пишут в книгах по Delphi

Григорьев Антон Борисович

Шрифт:

if Pt.Y >= PanelHole.Height - CornerMouseSensivity then

Msg.Result := HTBOTTOMRIGHT

else Msg.Result := HTRIGHT

else

if Pt.Y < BorderMouseSensivity then

if Pt.X < CornerMouseSensivity then Msg.Result := HTTOPLEFT

else

if Pt.X >= PanelHole.Width - CornerMouseSensivity then

Msg.Result := HTTOPRIGHT

else Msg.Result := HTTOP

else

if Pt.Y >= PanelHole.Height - BorderMouseSensivity then

if Pt.X < CornerMouseSensivity then

Msg.Result := HTBOTTOMLEFT

else

if Pt.X >= PanelHole.Width - CornerMouseSensivity then

Msg.Result := HTBOTTOMRIGHT

else Msg. Result := HTBOTTOM;

 end

 else if Msg.Msg = WM_SIZE then

 begin

//
Пересчитываем регион SetRegion;

// Устанавливаем новые ограничения для размеров окна.

// учитывающие новое положение дырки

Constraints.MinWidth :=

Width - ClientWidth + PanelHole.Left + MinHoleSize + HoleDistance;

Constraints.MinHeight :=

Height - ClientHeight + PanelHole.Top + MinHoleSize + HoleDistance;

 end

 else if Msg.Msg = WM_SIZING then

 begin

// Копируем переданный прямоугольник в переменную R,

// одновременно пересчитывая координаты из экранных

// в клиентские

R.TopLeft := ScreenToClient(PRect(Msg.LParam)^.TopLeft);

R.BottomRight := ScreenToClient(PRect(Msg.LParam)^.BottomRight);

// Если ширина слишком мала, проверяем, за какую

// сторону тянет пользователь. Если за левую -

// корректируем координаты левой стороны, если за

// правую - ее координаты

if R.Right - R.Left < MinHoleSize then

if Msg.WParam in [WMSZ_BOTTOMLEFT, WMSZ_LEFT, WMSZ_TOPLEFT] then

R.Left := R.Right - MinHoleSize

else

R.Right := R.Left + MinHoleSize;

// Аналогично действуем, если слишком мала высота

if R.Bottom - R.Top < MinHoleSize then

if Msg.WParam in [WMSZ_TOP, WMSZ_TOPLEFT, WMSZ_TOPRIGHT] then

R.Top := R.Bottom - MinHoleSize

else R.Bottom := R.Top + MinHoleSize;

//
Сдвигаем стороны, слишком близко подошедшие

// к границам окна

if R.Left < HoleDistance then R.Left := HoleDistance;

if R.Top < HoleDistance then R.Top := HoleDistance;

if R.Right > ClientWidth - HoleDistance then

R.Right := ClientWidth - HoleDistance;

if R.Bottom > ClientHeight - HoleDistance then

R.Bottom := ClientHeight - HoleDistance;

// Копируем прямоугольник R, переводя его координаты

// обратно в экранные

PRect(Msg.LParam)^.TopLeft := ClientToScreen(R.TopLeft);

PRect(Msg.LParam)^.BottomRight := ClientToScreen(R.BottomRight);

 end;

end;

Остается еще одна ситуация, когда границы "дырки" могут подойти к границам окна слишком близко: когда пользователь меняет не границы "дырки", а границы самого окна. Чтобы этого не случилось, нужно отслеживать изменения размеров окна и соответствующим образом менять размеры дырки — для этого нам потребуется изменить размеры панели и пересчитать регион. Пересчет региона необходим и в случае увеличения размеров окна: если его не пересчитать, получится, что часть окна не будет попадать в регион и будет отрезана. Все перечисленные действия выполняются в обработчике сообщения

WM_SIZE
окна (листинг 1.54).

Листинг 1.54. Обработчик сообщения
WM_SIZE
главного окна

procedure TFormHole.WMSize(var Msg: TWMSize);

begin

 inherited;

 // При уменьшении размеров окна уменьшаем размер дырки,

 // если границы окна подошли слишком близко к ней

 if PanelHole.Left + PanelHole.Width > ClientWidth - HoleDistance then

PanelHole.Width := ClientWidth - HoleDistance - PanelHole.Left;

 if PanelHole.Top + PanelHole.Height > ClientHeight - HoleDistance then

PanelHole.Height := ClientHeight - HoleDistance - PanelHole.Top;

 // На случай увеличения окна пересчитываем его регион,

 // иначе та часть, которая добавилась, окажется за его

 // пределами и будет отрезана SetRegion;

 // Пересчитываем координаты стрелок

 CalculateArrows;

 Invalidate;

Поделиться:
Популярные книги

В зоне особого внимания

Иванов Дмитрий
12. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
В зоне особого внимания

Сильнейший ученик. Том 2

Ткачев Андрей Юрьевич
2. Пробуждение крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сильнейший ученик. Том 2

Нищенка в элитной академии

Зимина Юлия
4. Академия юных сердец
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Нищенка в элитной академии

Назад в СССР 5

Дамиров Рафаэль
5. Курсант
Фантастика:
попаданцы
альтернативная история
6.64
рейтинг книги
Назад в СССР 5

Столичный доктор. Том III

Вязовский Алексей
3. Столичный доктор
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Столичный доктор. Том III

Секретарша генерального

Зайцева Мария
Любовные романы:
современные любовные романы
эро литература
короткие любовные романы
8.46
рейтинг книги
Секретарша генерального

Мастер Разума III

Кронос Александр
3. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.25
рейтинг книги
Мастер Разума III

Идеальный мир для Социопата 3

Сапфир Олег
3. Социопат
Фантастика:
боевая фантастика
6.17
рейтинг книги
Идеальный мир для Социопата 3

Ученик

Первухин Андрей Евгеньевич
1. Ученик
Фантастика:
фэнтези
6.20
рейтинг книги
Ученик

Попытка возврата. Тетралогия

Конюшевский Владислав Николаевич
Попытка возврата
Фантастика:
альтернативная история
9.26
рейтинг книги
Попытка возврата. Тетралогия

Ищу жену для своего мужа

Кат Зозо
Любовные романы:
любовно-фантастические романы
6.17
рейтинг книги
Ищу жену для своего мужа

Сила рода. Том 3

Вяч Павел
2. Претендент
Фантастика:
фэнтези
боевая фантастика
6.17
рейтинг книги
Сила рода. Том 3

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

На границе империй. Том 10. Часть 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 4