Изменение размеров формы без полей от ограничений, отличных от дальних краев? - PullRequest
2 голосов
/ 06 декабря 2011

У меня есть пользовательская форма, которая не имеет границ. Вместо этого я рисую некоторые свои собственные границы, которые не доходят до дальних краев формы. Вместо этого все, что находится за пределами этой нарисованной границы, является прозрачным благодаря использованию прозрачных свойств формы. Это оставляет меньшую часть формы для использования и видимости.

Я знаю, что есть множество решений для достижения этой цели, и я уже нашел самый подходящий метод для этого. Однако этот метод предполагает, что пользователь будет указывать мышью вдоль дальних краев формы. Мне нужно ограничить его, чтобы он реагировал из-за различных ограничений (например, прямоугольник меньшего размера).

Вот код, который я нашел, который уже работает с ограничением «почти до края»:

procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;

....

procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
const
  EDGEDETECT = 7;  //adjust to suit yourself
var
  deltaRect: TRect;  //not really used as a rect, just a convenient structure
begin
  inherited;
  if BorderStyle = bsNone then begin
    with Message, deltaRect do begin
      Left := XPos - BoundsRect.Left;
      Right := BoundsRect.Right - XPos;
      Top := YPos - BoundsRect.Top;
      Bottom := BoundsRect.Bottom - YPos;
      if (Top<EDGEDETECT)and(Left<EDGEDETECT) then
        Result := HTTOPLEFT
      else if (Top<EDGEDETECT)and(Right<EDGEDETECT) then
        Result := HTTOPRIGHT
      else if (Bottom<EDGEDETECT)and(Left<EDGEDETECT) then
        Result := HTBOTTOMLEFT
      else if (Bottom<EDGEDETECT)and(Right<EDGEDETECT) then
        Result := HTBOTTOMRIGHT
      else if (Top<EDGEDETECT) then
        Result := HTTOP
      else if (Left<EDGEDETECT) then
        Result := HTLEFT
      else if (Bottom<EDGEDETECT) then
        Result := HTBOTTOM
      else if (Right<EDGEDETECT) then
        Result := HTRIGHT
    end; 
  end;
end;

Как мне изменить границы, чтобы это реагировало? Например, левый и правый края должны реагировать на 10 пикселей в форме. Прямоугольник стандартной формы может быть (0, 0, 100, 100), но я хочу, чтобы этот метод выше работал в пределах (10, 3, 90, 97)

1 Ответ

5 голосов
/ 06 декабря 2011

На самом деле имеет смысл определить две константы вместо единственной EDGEDETECT, так как вы хотите, чтобы горизонтальные и вертикальные смещения были разными и записывали это с нуля, но вот быстрый патч:

procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
const
  EDGEDETECT = 17;  //adjust to suit yourself    // <- increased to suit outer offset
var
  deltaRect: TRect;  //not really used as a rect, just a convenient structure

  OuterRect: TRect;                              // used as a rect
begin
  inherited;
  if BorderStyle = bsNone then begin
    with Message, deltaRect do begin

     ..
      else if (Right<EDGEDETECT) then
        Result := HTRIGHT;
     ..

      OuterRect := BoundsRect;                    // patch
      InflateRect(OuterRect, -10, -3);
      if not PtInRect(OuterRect, SmallPointToPoint(Message.Pos)) then
        Message.Result := HTTRANSPARENT;

    end;
  end;
end;
...