【问题标题】:Disable form restoring on title doubleclick在标题双击时禁用表单恢复
【发布时间】:2018-11-30 15:18:50
【问题描述】:
  1. 创建一个空的 Delphi VCL 项目
  2. 删除主窗体的所有BorderIcons
  3. 将 WindowState 设置为 wsMaximized
  4. 运行应用程序。主窗口显示为最大化。
  5. 双击窗口标题。主窗口恢复其大小,无法再次最大化。

如何防止标题双击恢复窗口而不隐藏标题栏?

【问题讨论】:

  • 离开 biMaximize TRUE 使用户能够以两种方式双击窗口标题(也再次最大化)而不显示系统图标。为什么不直接离开这个,而是强制一个残缺的窗口,当桌面分辨率改变时仍然会出现问题?
  • 我的评论显示了一种仅具有优势的方法,甚至指出了为什么您的方法仍然存在缺陷-您是否尝试过?
  • AmigoJack:Sertac Akyuz 的解决方案可以 100% 满足我的需求和客户的需求。加上将此应用设置为外壳,效果非常好。
  • 这些是其他地方没有提到的细节,甚至在问题中也没有 - 因此我想象一个窗口加上任务栏和/或多个监视器。

标签: delphi maximize-window


【解决方案1】:

您可以拦截还原以及移动系统命令,以通过拖动标题来阻止还原。

type
  TForm1 = class(TForm)
  protected
    procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;

...

procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin
  case Message.CmdType and $FFF0 of
    SC_MOVE, SC_RESTORE: Exit;
  end; 
  inherited;
end;

【讨论】:

    【解决方案2】:

    答案已编辑!

    如果我没听错,您可能希望禁止双击标题栏以防止将表单恢复到其原始大小。您可以通过拦截WM_NCLBUTTONDBLCLK 来做到这一点。

    在下面的示例中,我重写了主窗体的 WndProc 方法并挂钩了上述消息。

    procedure TForm1.WndProc(var Message: TMessage);
    begin
      case Message.Msg of
        WM_NCLBUTTONDBLCLK:
          begin
            case TWMNCHitMessage(Message).HitTest of
              HTCAPTION:
                Exit
            else  // Another HitTest-codes are handled here
              Inherited WndProc(Message);
            end;
          end
      else
        Inherited WndProc(Message);
      end;
    end;
    

    重要提示

    虽然现在无法通过双击恢复最大化形式,但在鼠标被标题栏捕获时移动它仍然可以恢复。至少,在 Windows 7 上会呈现这种效果。
    重现步骤:

    • 运行应用程序;
    • 鼠标悬停在标题栏上时按下鼠标左键;
    • 不要松开 LMB 并轻轻移动鼠标 - 现在表单会恢复其大小。

    附录

    修复了错误处理除HTCAPTION 之外的另一个非客户端 HitTest 代码的错误(感谢用户 Dsm 指出这一点!)。

    【讨论】:

    • 如果您按照描述移动表单,您仍然无法以我在 Windows 10 上看到的任何方式最大化表单
    • 抱歉,@dima,你是对的。我将删除我的 cmets 和解决方案。我仍然认为您的解决方案看起来是错误的,因为如果触发了 WM_NCLBUTTONDBLCLICK 事件,则无论 HitTest 是否在标题区域中都不会得到处理。如果您使用调试器进行跟踪,您会明白我的意思。不过,OnDbleClick 发生在 WM_MOUSEDOWN 消息上而不是这个消息上,所以实际上它并不重要。
    • @Dsm,我明白你的意思了。我改变了答案。现在它可以正确处理所有其他 HitTest 代码。
    • 感谢您的努力!没想过拖着标题。看来,我会使用表单的约束。
    • @Paul 我回答中的方法阻止了两种恢复方式。
    【解决方案3】:

    我测试了一些解决方案,其中一个有效的是:

    1. Align属性设置为alClient
    2. BorderIcons 属性中移除 biMaximize
    3. WindowState wsNormal(默认)。

    【讨论】:

      猜你喜欢
      • 2016-06-14
      • 2013-04-11
      • 2017-03-09
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多