Delphi Tokyo运行时设置ListView项加粗失效问题求助
Delphi 10.2 Tokyo中ListView自定义绘制加粗失效的解决办法
我之前也碰到过这个一模一样的问题!在Delphi 10.2 Tokyo里,TListView的CustomDrawItem事件对字体加粗的处理确实和10.1 Berlin不一样了——颜色能正常生效,但加粗样式会被后续的默认绘制流程给覆盖掉,这是因为Tokyo调整了VCL控件的绘制逻辑,尤其是结合VCL Styles的时候,这种情况更明显。
给你两种靠谱的解决方式:
方式一:关闭默认绘制,手动绘制Item内容
这种方法最直接,完全掌控绘制过程,不会被默认逻辑干扰:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); begin // 先关闭默认绘制,接下来我们自己画 DefaultDraw := False; // 先继承ListView的默认字体设置,避免样式混乱 Sender.Canvas.Font.Assign(Sender.Font); if Item.Caption = 'Item2' then begin Sender.Canvas.Font.Style := Sender.Canvas.Font.Style + [fsBold]; Sender.Canvas.Font.Color := clRed; end else begin // 确保移除加粗样式 Sender.Canvas.Font.Style := Sender.Canvas.Font.Style - [fsBold]; end; // 绘制Item的标题文本,位置对应Item的坐标 Sender.Canvas.TextOut(Item.Left, Item.Top, Item.Caption); // 如果你的ListView有子项,这里可以添加子项的绘制逻辑 // 比如循环Item.SubItems,计算位置后调用TextOut end;
方式二:改用AdvancedCustomDrawItem事件
如果你不想自己手动绘制全部内容,可以用AdvancedCustomDrawItem事件,它能在绘制的不同阶段介入,我们在预绘制阶段修改字体,这样默认绘制会使用我们修改后的样式:
procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean); begin // 只在预绘制阶段修改字体,这个阶段的设置会被默认绘制采纳 if Stage = cdPrePaint then begin if Item.Caption = 'Item2' then begin Sender.Canvas.Font.Style := Sender.Canvas.Font.Style + [fsBold]; Sender.Canvas.Font.Color := clRed; end else begin Sender.Canvas.Font.Style := Sender.Canvas.Font.Style - [fsBold]; end; end; end;
两种方式都能解决你的问题,第一种更灵活,第二种更贴近原来的开发习惯,你可以根据自己的需求选。
内容的提问来源于stack exchange,提问作者Marty Loftus
相关产品推荐
相关产品推荐

