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
相关产品推荐
相关产品推荐

