You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 11 打开子窗体时如何禁用主窗体调整大小并显示悬停提示

解决方案
  • 你现有代码里将Form1.BorderStyle设为bsSingle的逻辑已经能实现基础的禁止调整窗体大小的需求,默认情况下bsSingle边框的窗体本身就不支持拖拽调整尺寸,也不会显示调整大小的光标。如果需要额外实现悬停在边框区域显示禁止光标+“禁止调整大小”提示的自定义效果,才需要补充OnCanResize事件或者消息拦截处理。
  • 完整实现你要求的效果可按以下步骤修改代码:

步骤1:在Form1的类声明中添加私有变量和消息映射

private
  FResizeDisabled: Boolean; // 标记是否禁止调整大小
  procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; // 拦截鼠标命中边框消息

步骤2:修改按钮点击事件,新增禁止状态标记

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;
  Form1.Caption:= 'Main';
  Form1.BorderStyle:= bsSingle;
  FResizeDisabled := True; // 标记为禁止调整状态
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Form1.Caption:= 'Main Form';
  Form1.BorderStyle:= bsSizeable;
  FResizeDisabled := False; // 恢复允许调整状态
  Form2.Hide;
end;

步骤3:添加OnCanResize事件兜底阻止调整

procedure TForm1.FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean);
begin
  // 禁止状态下直接阻断所有调整请求
  if FResizeDisabled then Resize := False;
end;

步骤4:实现WM_NCHitTest消息处理,自定义光标和提示

procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
var
  HitResult: Integer;
begin
  inherited;
  if not FResizeDisabled then Exit;

  HitResult := Message.Result;
  // 判断鼠标是否命中可调整大小的边框区域
  if HitResult in [HTLEFT, HTRIGHT, HTTOP, HTTOPLEFT, HTTOPRIGHT, HTBOTTOM, HTBOTTOMLEFT, HTBOTTOMRIGHT] then
  begin
    Message.Result := HTBORDER; // 将边框标记为不可调整的普通边框
    Screen.Cursor := crNo; // 显示禁止光标
    Hint := '禁止调整大小'; // 设置悬停提示
    Application.ShowHint := True;
  end
  else
  begin
    Screen.Cursor := crDefault; // 非边框区域恢复默认光标
    Hint := '';
  end;
end;
  • 如果你不需要自定义禁止光标和提示文本,仅保留你原来修改BorderStyle的代码即可满足禁止调整大小的基础需求,无需额外添加事件处理。

内容的提问来源于stack exchange,提问作者Femi Mor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:06:04