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

Delphi 11.1中自定义SmallImages高度时ListView复选框居中问题

Delphi 11.1 TListView 复选框垂直居中解决方案

方法一:自定义绘制复选框(最可靠)

通过开启OwnerDraw并手动绘制复选框,直接控制其垂直居中位置,不受系统默认逻辑限制:

  1. 设置ListView核心属性:

    • 将OwnerDraw设为True
    • 确保ViewStyle为vsReport(带复选框的报表视图模式)
  2. 编写OnCustomDrawItem事件代码:

procedure TYourForm.ListView1CustomDrawItem(Sender: TCustomListView; Item: TListItem;
  State: TCustomDrawState; var DefaultDraw: Boolean);
var
  CheckRect: TRect;
  CheckState: TCheckBoxState;
  DPI: Integer;
  YCenterOffset: Integer;
begin
  // 保留系统默认绘制文本和其他元素,仅重绘复选框
  DefaultDraw := True;

  // 获取当前显示器DPI,适配高分辨率屏幕
  DPI := Screen.PixelsPerInch;
  // 计算高DPI下的复选框尺寸(默认13x13,按DPI比例缩放)
  CheckRect := Rect(0, 0, MulDiv(13, DPI, 96), MulDiv(13, DPI, 96));
  
  // 调整复选框水平位置(默认左侧间距4,按DPI缩放)
  CheckRect.Left := MulDiv(4, DPI, 96);
  // 计算垂直居中偏移:行高减去复选框高度的一半
  YCenterOffset := (Item.Height - CheckRect.Height) div 2;
  CheckRect.Top := Item.Top + YCenterOffset;
  CheckRect.Bottom := CheckRect.Top + CheckRect.Height;

  // 判断复选框状态(选中/未选中/灰色)
  if Item.Checked then
    CheckState := IfThen(Item.Grayed, cbGrayed, cbChecked)
  else
    CheckState := cbUnchecked;

  // 先覆盖系统默认绘制的复选框区域(避免重叠)
  Sender.Canvas.Brush.Color := ListView1.Color;
  Sender.Canvas.FillRect(Rect(CheckRect.Left, Item.Top, CheckRect.Right, Item.Top + Item.Height));
  // 绘制居中的复选框
  DrawCheckListBoxCheck(Sender.Canvas, CheckRect, CheckState);
end;

方法二:结合LVM_SETITEMSPACING调整行高(替代SmallImages方案)

如果不想依赖SmallImages来增加行间距,可以直接通过系统消息设置行间距,同时配合自定义绘制确保复选框居中:

  1. 设置行间距(在Form创建或ListView初始化时):
procedure TYourForm.FormCreate(Sender: TObject);
var
  DPI: Integer;
  DefaultItemHeight: Integer;
  Spacing: DWORD;
begin
  DPI := Screen.PixelsPerInch;
  // 计算系统默认行高的高DPI适配值
  DefaultItemHeight := MulDiv(16, DPI, 96);
  // 垂直间距 = 目标行高 - 默认行高;水平间距设为0
  Spacing := MakeLong(0, 28 - DefaultItemHeight);
  // 发送消息设置行间距
  ListView1.Perform(LVM_SETITEMSPACING, 0, Spacing);
end;
  1. 复用方法一的自定义绘制代码,确保复选框在新行高中垂直居中。

关键注意事项

  • 高DPI适配:所有坐标和尺寸必须用MulDiv按当前DPI缩放,避免在高分屏上出现偏移或模糊。
  • 动态适配行高:计算垂直偏移时直接使用Item.Height,无论SmallImages高度或行间距如何变化,都能自动居中。
  • OwnerDraw技巧:设置DefaultDraw := True保留系统默认的文本绘制逻辑,只替换复选框的绘制,减少自定义代码量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:57:14