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秒钟后更新。是的,我当鼠标移到字体上时,它不能改变字体,但要缓慢。