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

Delphi 12中为全局提示窗口添加内边距的实现问题

Delphi 12提示框添加内边距的正确实现方式

你之前设置Padding和Margins无效的核心原因:THintWindow是轻量级自定义窗口,它的绘制与布局逻辑并不读取VCL标准的Padding/Margins属性,所以构造函数里的设置完全不会生效。

不需要复杂操作画布,但需要重写THintWindow的两个核心方法来实现内边距:

  • 重写CalculateHintRect:调整提示框整体尺寸,在文本所需空间基础上加上内边距
  • 重写Paint:在调整后的窗口内,偏移内边距绘制提示文本

以下是完整实现代码:

unit MyHintWindow;

interface

uses
  Vcl.Controls, Vcl.Graphics, Winapi.Windows;

type
  TMyHintWindow = class(THintWindow)
  protected
    function CalculateHintRect(MaxWidth: Integer; const AHint: string; AData: Pointer): TRect; override;
    procedure Paint; override;
  end;

implementation

function TMyHintWindow.CalculateHintRect(MaxWidth: Integer; const AHint: string; AData: Pointer): TRect;
var
  TextRect: TRect;
begin
  // 先获取系统默认计算的文本所需矩形
  TextRect := inherited CalculateHintRect(MaxWidth, AHint, AData);
  // 扩展矩形,上下左右各增加10像素内边距
  InflateRect(TextRect, 10, 10);
  Result := TextRect;
end;

procedure TMyHintWindow.Paint;
var
  TextRect: TRect;
begin
  // 绘制提示框背景(使用系统默认提示背景色)
  Canvas.Brush.Color := clInfoBk;
  Canvas.FillRect(ClientRect);

  // 设置文本颜色为系统默认提示文本色
  Canvas.Font.Color := clInfoText;

  // 计算文本绘制区域:从客户端矩形向内收缩10像素
  TextRect := ClientRect;
  InflateRect(TextRect, -10, -10);

  // 绘制提示文本,支持自动换行
  DrawText(Canvas.Handle, PChar(Caption), Length(Caption), TextRect, DT_WORDBREAK or DT_NOPREFIX);
end;

initialization
  // 替换全局提示窗口类为自定义类
  HintWindowClass := TMyHintWindow;

end.

将该单元加入项目后,所有控件的提示框都会自动带上10像素内边距。若需要调整内边距大小,修改InflateRect中的数值即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 10:08:21