代码之家  ›  专栏  ›  技术社区  ›  Paul

禁用标题上的窗体还原双击

  •  1
  • Paul  · 技术社区  · 7 年前
    1. 创建空的Delphi VCL项目
    2. 删除主窗体的所有边框图标
    3. 将WindowsState设置为wsMaximized
    4. 运行应用程序。主窗口显示最大化。
    5. 双击窗口标题。主窗口恢复它的大小,没有可能再最大化它。

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

    2 回复  |  直到 7 年前
        1
  •  3
  •   Sertac Akyuz    7 年前

    您可以截获restore和move system命令,通过拖动标题来防止还原。

    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
  •  1
  •   Josef Å vejk    7 年前

    答案已编辑!

    如果我让你做对了,你可能会想禁止双击标题栏,以防止恢复到原来的大小。你可以通过截取 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;
    

    重要提示

    虽然现在无法恢复 最大化 通过双击表单,当鼠标被标题栏捕获时,只需移动它就可以恢复表单。至少,在Windows7上会出现这种效果。
    复制步骤:

    • 运行应用程序;
    • 鼠标左键悬停在标题栏上;
    • 不要释放LMB,轻轻移动鼠标-现在表单恢复其大小。

    补遗

    修复了错误处理其他非客户端HitTest代码的错误 HTCAPTION (感谢用户) 需求侧管理 为了指出这一点!).