// тем, что у панели нет неклиентской части, поэтому
// верхний левый угол окна и верхний левый угол клиентской
// части совпадают.
Pt:= PanelHole.ScreenToClient(Point(Msg.LParamLo, Msg.LParamHi));
if Pt.X < BorderMouseSensivity then
if Pt.Y < CornerMouseSensivity then Msg.Result:= HTTOPLEFT
else
if Pt.Y >= PanelHole.Height — CornerMouseSensivity then
Msg.Result:= HTBOTTOMLEFT
else Msg.Result:= HTLEFT
else
if Pt.X >= PanelHole.Width — BorderMouseSensivity then
if Pt.Y < CornerMouseSensivity then Msg.Result:= HTTOPRIGHT
else
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;