Delphi 高度非常小的窗的WM_尺寸中的错误侧信息 我创建了一个无标题窗口 我手动(或编程)调整它的大小,使其高度小于等于30像素 然后,当我抓住底部边框以垂直调整其大小时,它的行为如下 如果我拖动上边框。实际上,在调试程序时,WM_size参数包含WMSZ_TOP而不是WMSZ_BOTTOM

Delphi 高度非常小的窗的WM_尺寸中的错误侧信息 我创建了一个无标题窗口 我手动(或编程)调整它的大小,使其高度小于等于30像素 然后,当我抓住底部边框以垂直调整其大小时,它的行为如下 如果我拖动上边框。实际上,在调试程序时,WM_size参数包含WMSZ_TOP而不是WMSZ_BOTTOM,delphi,winapi,window,Delphi,Winapi,Window,我的程序是用Delphi编写的,基本上问题可以通过以下FormCreate的主窗体重现: procedure TForm2.FormCreate(Sender: TObject); var oldStyle : LongInt; var newStyle : LongInt; begin // Adapt windows style. oldStyle := WINDOWS.GetWindowLong ( handle,

我的程序是用Delphi编写的,基本上问题可以通过以下FormCreate的主窗体重现:

procedure TForm2.FormCreate(Sender: TObject);

  var oldStyle : LongInt;
  var newStyle : LongInt;

begin
  //  Adapt windows style.

  oldStyle := WINDOWS.GetWindowLong (
                          handle,
                          GWL_STYLE);

  newStyle := oldStyle              and
              (not WS_CAPTION)      and
              (not WS_MAXIMIZEBOX);

  WINDOWS.SetWindowLong(
              handle,
              GWL_STYLE,
              newStyle);

  //  SetWindowPos with SWP_FRAMECHANGED needs to be called at that point
  //  in order for the style change to be taken immediately into account.

  WINDOWS.SetWindowPos(
              handle,
              0,
              0,
              0,
              0,
              0,
              SWP_NOZORDER     or
              SWP_NOMOVE       or
              SWP_NOSIZE       or
              SWP_FRAMECHANGED or
              SWP_NOACTIVATE);
end;

在我看来,操作系统是个bug。在测试用例的条件下,命中测试处理是错误的,默认窗口过程在应该返回
HTBOTTOM
时返回
HTTOP
。您可以为解决方案覆盖命中测试处理:

procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
begin
  inherited;
  if (Message.Result = HTTOP) and
      (Message.Pos.Y > Top + Height - GetSystemMetrics(SM_CYSIZEFRAME)) then
    Message.Result := HTBOTTOM;
end;

干得好,谢谢。我确认这是一个操作系统错误,与delphi无关(我能够通过使用WindowsAPI创建的一个简单窗口重现该问题)

我现在的结局是:

procedure TForm2.WMNcHitTest(
                     var msg : TWMNCHitTest);
begin
  inherited;

  case msg.result of

      HTTOP:
        begin
          if msg.pos.y > top + height div 2 then
              msg.result := HTBOTTOM;
        end;

      HTTOPRIGHT:
        begin
          if msg.pos.y > top + height div 2 then
              msg.result := HTBOTTOMRIGHT;
        end;

      HTTOPLEFT:
        begin
          if msg.pos.y > top + height div 2 then
              msg.result := HTBOTTOMLEFT;
        end;

  end;
end;

请注意,最好通过
CreateParams
设置窗口样式。您好,欢迎您的建议。但是,出于某种原因,如果我按如下方式使用CreateParams,我的表单会出现一个标题:继承的CreateParams(params);使用参数do style:=样式和(非WS_标题)和(非WS_最大化盒子)@艾曼纽-不客气。我还没有测试过,但如果您需要对左右和/或角尺寸使用类似的覆盖,我不会感到惊讶。你可能需要扩展它,但你明白了。