Читаем О чём не пишут в книгах по Delphi полностью

  // тем, что у панели нет неклиентской части, поэтому

  // верхний левый угол окна и верхний левый угол клиентской

  // части совпадают.

  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;

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже