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

