Delphi 11.1中自定义SmallImages高度时ListView复选框居中问题
Delphi 11.1 TListView 复选框垂直居中解决方案
方法一:自定义绘制复选框(最可靠)
通过开启OwnerDraw并手动绘制复选框,直接控制其垂直居中位置,不受系统默认逻辑限制:
设置ListView核心属性:
- 将
OwnerDraw设为True - 确保
ViewStyle为vsReport(带复选框的报表视图模式)
- 将
编写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来增加行间距,可以直接通过系统消息设置行间距,同时配合自定义绘制确保复选框居中:
- 设置行间距(在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;
- 复用方法一的自定义绘制代码,确保复选框在新行高中垂直居中。
关键注意事项
- 高DPI适配:所有坐标和尺寸必须用
MulDiv按当前DPI缩放,避免在高分屏上出现偏移或模糊。 - 动态适配行高:计算垂直偏移时直接使用
Item.Height,无论SmallImages高度或行间距如何变化,都能自动居中。 - OwnerDraw技巧:设置
DefaultDraw := True保留系统默认的文本绘制逻辑,只替换复选框的绘制,减少自定义代码量。
内容的提问来源于stack exchange,提问作者user2972081
相关产品推荐
相关产品推荐

