О чём не пишут в книгах по 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;
Поделиться:
Популярные книги
Черный Маг Императора 6
6. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
7.00
рейтинг книги
Оцифрованный. Том 1
1. Линкор Михаил
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XIV
14. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Штуцер и тесак
1. Штуцер и тесак
Фантастика:
боевая фантастика
альтернативная история
8.78
рейтинг книги
Я снова граф. Книга XI
11. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Болотник
1. Болотник
Фантастика:
попаданцы
альтернативная история
6.50
рейтинг книги
Кодекс Крови. Книга III
3. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Жестокая свадьба
Любовные романы:
современные любовные романы
4.87
рейтинг книги
Стеллар. Трибут
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Голодные игры
1. Голодные игры
Фантастика:
социально-философская фантастика
боевая фантастика
9.48
рейтинг книги
Последняя Арена 8
8. Последняя Арена
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Черный маг императора 2
2. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
6.00
рейтинг книги
Последний Паладин
1. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Измена. Свадьба дракона
Любовные романы:
любовно-фантастические романы
эро литература
5.00