Delphi 如何动态更改子项';鼠标悬停在TListView的子项上时的字体?

Delphi 如何动态更改子项';鼠标悬停在TListView的子项上时的字体?,delphi,Delphi,出于某种原因,我想在鼠标移动到子项上时突出显示它,将其字体更改为[fsUnderline,fsBold]。但当鼠标移开时,子项的字体将更改为默认状态 但是我不知道如何实现这个功能。有人能给我一些帮助吗?是的,根据David的建议,我实现了MouseMove功能,它运行: procedure TCnCustBuildForm.lstTaskMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var Rect:TRect; I

出于某种原因,我想在鼠标移动到子项上时突出显示它,将其字体更改为
[fsUnderline,fsBold]
。但当鼠标移开时,子项的字体将更改为默认状态


但是我不知道如何实现这个功能。有人能给我一些帮助吗?

是的,根据David的建议,我实现了MouseMove功能,它运行:

procedure TCnCustBuildForm.lstTaskMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var
Rect:TRect;
I, J: Integer;
S: string;
ItemWidth: Integer;
begin
if taskRowNum > 0 then
for J := 0 to lstTask.Items.Count - 1 do
begin
    Rect  := lstTask.Items[J].DisplayRect(drBounds);

    Rect.Left := Rect.Left + lstTask.Columns.Items[0].Width;

    for I := 1 to lstTask.Columns.Count - 2 do
    begin
      S := taskContent[J, I];

      ItemWidth := ListView_GetStringWidth(lstTask.Handle, PChar(S));

      //if ItemWidth > lstTask.Column[I].Width then
      //  ItemWidth := lstTask.Column[I].Width;

      if (taskContent[J, I] = 'error') and (x > Rect.Left) and (y > Rect.Top) and (x < Rect.Left + ItemWidth ) and (y < Rect.Bottom) then
      begin
          TListView(Sender).Cursor := crHandPoint;

          //InvalidateRect(lstTask.Handle, Rect, True);

          if lstTaskMouseMoveTrackingRect <> Rect then
          begin
            InvalidateRect(lstTask.Handle, lstTaskMouseMoveTrackingRect, True);
            InvalidateRect(lstTask.Handle, Rect, True);
          end;
          lstTaskMouseMoveTrackingRect := Rect;
          Exit;
      end;

      Rect.Left := Rect.Left + lstTask.Columns.Items[I].Width;
    end;
end;

TListView(Sender).Cursor := crDefault;
InvalidateRect(lstTask.Handle, lstTaskMouseMoveTrackingRect, True);
end;
过程TCnCustBuildForm.lstTaskMouseMove(发送方:ToObject;Shift:TShiftState;
十、 Y:整数);
变量
Rect:TRect;
一、 J:整数;
S:字符串;
ItemWidth:整数;
开始
如果taskRowNum>0,则
对于J:=0到lstask.Items.Count-1 do
开始
Rect:=lstTask.Items[J].DisplayRect(drBounds);
Rect.Left:=Rect.Left+lstask.Columns.Items[0]。宽度;
对于I:=1到lstask.Columns.Count-2 do
开始
S:=任务内容[J,I];
ItemWidth:=ListView_GetStringWidth(lstTask.Handle,PChar);
//如果ItemWidth>lstTask.Column[I].Width,则
//ItemWidth:=lstTask.Column[I]。宽度;
如果(taskContent[J,I]=“error”)和(x>Rect.Left)和(y>Rect.Top)和(x
相关,和。将ListView的
热跟踪
属性设置为true,然后使用事件绘制子项,并检查该属性的值是否为cdsHot。谢谢。但在添加以下代码之后,当我在不同的列中水平移动鼠标时,子项参数是相同的(=4,即最后一列)。过程TCnCustBuildForm.lstaskAdvancedDrawSubItem(发送方:TCustomListView;项:TListItem;子项:整数;状态:TCustomDrawState;阶段:TCustomDrawStage;变量DefaultDraw:Boolean);开始如果(状态中的cdsHot)和(taskContent[Item.Index,SubItem]='error'),然后开始Sender.Canvas.Font.Style:=Sender.Canvas.Font.Style+[fsUnderline,fsBold];end end;您需要
RowSelect
True
才能
hotrack
为子项提供所需的效果。我已经将RowSelect设置为True。我发现当我垂直移动鼠标时,UI会立即更新。但在水平方向上,当我将鼠标移动到下一个子项上时,字体会在7秒钟后更新。是的,我当鼠标移到字体上时,它不能改变字体,但要缓慢。