首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WM_SIZING中非常小高度窗口的错误侧信息

WM_SIZING中非常小高度窗口的错误侧信息
EN

Stack Overflow用户
提问于 2013-12-01 12:39:27
回答 2查看 420关注 0票数 4
  1. 我创建了一个无标题窗口。
  2. 我手动调整它的大小(或以编程的方式),以便它的高度为30像素或以下。
  3. 然后,当我抓取底部边框垂直调整它的大小时,它的行为就好像我在拖动顶部的边框。实际上,在调试程序时,WM_SIZING参数包含WMSZ_TOP而不是WMSZ_BOTTOM。

我的程序是用Delphi编写的,基本上这个问题可以用下面的FormCreate的主要形式重现:

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-01 14:13:25

在我看来就像操作系统上的窃听器。在测试用例的条件下,命中测试处理是错误的,默认窗口过程在应该返回HTTOP时返回HTBOTTOM。可以重写解决方案的命中测试处理:

代码语言:javascript
复制
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;
票数 7
EN

Stack Overflow用户

发布于 2013-12-01 14:37:38

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

我现在的结局是:

代码语言:javascript
复制
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;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20312184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档