Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms 从与远边不同的约束调整无边界形状的大小?_Winforms_Delphi_Delphi 7_Messages - Fatal编程技术网

Winforms 从与远边不同的约束调整无边界形状的大小?

Winforms 从与远边不同的约束调整无边界形状的大小?,winforms,delphi,delphi-7,messages,Winforms,Delphi,Delphi 7,Messages,我有一个自定义表单,没有任何类型的边框。我正在绘制一些自己的自定义边框,这些边框不会延伸到窗体的远边。相反,通过使用窗体的透明属性,此自定义绘制边界之外的任何内容都是透明的。这使得表单的一小部分可用且可见 我知道有很多解决方案可以做到这一点,我已经找到了最适合的方法来做到这一点。但是,此方法假定用户将鼠标指向窗体的远边。我需要限制它在不同的约束条件下做出反应,例如一个较小的rect 下面是我找到的代码,它已经在边约束旁边的上起作用: procedure WMNCHitTest(var Messa

我有一个自定义表单,没有任何类型的边框。我正在绘制一些自己的自定义边框,这些边框不会延伸到窗体的远边。相反,通过使用窗体的透明属性,此自定义绘制边界之外的任何内容都是透明的。这使得表单的一小部分可用且可见

我知道有很多解决方案可以做到这一点,我已经找到了最适合的方法来做到这一点。但是,此方法假定用户将鼠标指向窗体的远边。我需要限制它在不同的约束条件下做出反应,例如一个较小的rect

下面是我找到的代码,它已经在边约束旁边的上起作用:

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个像素。标准形式rect可能是0、0、100、100,但我希望上面的方法在10、3、90、97的范围内工作。实际上,定义两个常量而不是唯一的EDGEDETECT是有意义的 您要求水平偏移和垂直偏移不同,并从头开始写入,但这里有一个快速补丁:


非常好:D仍然可以使用一些调整,但看起来这样就可以了。在这里我从未见过的新事物是InflateRect、PtInRect和SmallPointPointPointPoint的使用。我相信我会解决所有问题的,谢谢:D@Jerry-不客气!>调整>是的,如果你有时间从头开始写,它会更好。。
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;