我有一个问题:
我根据一些布尔变量将树形单元格涂上不同的颜色。例如:
isProcessService, isProcessInDebugger, isProcessService, isProcessElevated, isProcessNet, isProcessOwner, isProcessinJob, isProcessPacked, isProcessMarkedForDeletion, isProcessMarkedForCreation:Boolean;
所以在BeforeCellPaint中,我会根据这些布尔值来绘制单元格的背景颜色,如下所示: procedure TMainForm.ProcessVstBeforeCellPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect); var NodeData: PProcessData; begin if Node = nil then Exit;
NodeData := Sender.GetNodeData(Node);
if NodeData = nil then Exit;
if (NodeData^.isProcessOwner) then begin TargetCanvas.Brush.Color := $00AAFFFF; TargetCanvas.FillRect(TargetCanvas.ClipRect); end;
if (NodeData^.isProcessInDebugger) then begin TargetCanvas.Brush.Color := $00E5A5A5; TargetCanvas.FillRect(TargetCanvas.ClipRect); end;
if (NodeData^.pProcessID = 0) or (NodeData^.pProcessID = 4) then begin TargetCanvas.Brush.Color := $00FFCCAA; TargetCanvas.FillRect(TargetCanvas.ClipRect); end;
if (NodeData^.isProcessElevated) and not(NodeData^.isProcessInDebugger) then begin TargetCanvas.Brush.Color := $0000AAFF; TargetCanvas.FillRect(TargetCanvas.ClipRect); end;
if (NodeData^isProcessService) and not (NodeData^.isProcessPacked) and not(NodeData^.isProcessNet) then begin TargetCanvas.Brush.Color := $00FFFFCC; TargetCanvas.FillRect(TargetCanvas.ClipRect); end;
if (NodeData^.isProcessMarkedForDeletion) then begin TargetCanvas.Brush.Color := $005D5DFF; TargetCanvas.FillRect(TargetCanvas.ClipRect); end;
if (NodeData^.isProcessMarkedForCreation) then begin TargetCanvas.Brush.Color := $0061E15E; TargetCanvas.FillRect(TargetCanvas.ClipRect); end;
if (NodeData^.isProcessNet) then begin TargetCanvas.Brush.Color := $005CE0BF; TargetCanvas.FillRect(TargetCanvas.ClipRect); end; end;
问题是:
如何根据进程的创建或删除将单元格涂成绿色或红色(让颜色保持至少一秒钟,然后切换回其原始值)?
换句话说,如果有进程被创建,则将单元格涂成绿色,等待一秒钟,然后根据isProcessService、is ProcessOwner等条件切换回原始颜色。
最大的问题是我需要在非阻塞模式下执行此操作(否则树将冻结,因此颜色更改将不会被注意到)。
简而言之,我想模仿Process Explorer或Process Hacker在创建或删除进程时所做的相同行为。这两个应用程序都会将这些进程的单元格背景涂成红色或绿色,并保持一秒钟,然后切换回单元格原来的颜色。
仅供参考,我将通过wmi收到有关进程创建或删除的通知。
我根据一些布尔变量将树形单元格涂上不同的颜色。例如:
isProcessService, isProcessInDebugger, isProcessService, isProcessElevated, isProcessNet, isProcessOwner, isProcessinJob, isProcessPacked, isProcessMarkedForDeletion, isProcessMarkedForCreation:Boolean;
所以在BeforeCellPaint中,我会根据这些布尔值来绘制单元格的背景颜色,如下所示: procedure TMainForm.ProcessVstBeforeCellPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect); var NodeData: PProcessData; begin if Node = nil then Exit;
NodeData := Sender.GetNodeData(Node);
if NodeData = nil then Exit;
if (NodeData^.isProcessOwner) then begin TargetCanvas.Brush.Color := $00AAFFFF; TargetCanvas.FillRect(TargetCanvas.ClipRect); end;
if (NodeData^.isProcessInDebugger) then begin TargetCanvas.Brush.Color := $00E5A5A5; TargetCanvas.FillRect(TargetCanvas.ClipRect); end;
if (NodeData^.pProcessID = 0) or (NodeData^.pProcessID = 4) then begin TargetCanvas.Brush.Color := $00FFCCAA; TargetCanvas.FillRect(TargetCanvas.ClipRect); end;
if (NodeData^.isProcessElevated) and not(NodeData^.isProcessInDebugger) then begin TargetCanvas.Brush.Color := $0000AAFF; TargetCanvas.FillRect(TargetCanvas.ClipRect); end;
if (NodeData^isProcessService) and not (NodeData^.isProcessPacked) and not(NodeData^.isProcessNet) then begin TargetCanvas.Brush.Color := $00FFFFCC; TargetCanvas.FillRect(TargetCanvas.ClipRect); end;
if (NodeData^.isProcessMarkedForDeletion) then begin TargetCanvas.Brush.Color := $005D5DFF; TargetCanvas.FillRect(TargetCanvas.ClipRect); end;
if (NodeData^.isProcessMarkedForCreation) then begin TargetCanvas.Brush.Color := $0061E15E; TargetCanvas.FillRect(TargetCanvas.ClipRect); end;
if (NodeData^.isProcessNet) then begin TargetCanvas.Brush.Color := $005CE0BF; TargetCanvas.FillRect(TargetCanvas.ClipRect); end; end;
问题是:
如何根据进程的创建或删除将单元格涂成绿色或红色(让颜色保持至少一秒钟,然后切换回其原始值)?
换句话说,如果有进程被创建,则将单元格涂成绿色,等待一秒钟,然后根据isProcessService、is ProcessOwner等条件切换回原始颜色。
最大的问题是我需要在非阻塞模式下执行此操作(否则树将冻结,因此颜色更改将不会被注意到)。
简而言之,我想模仿Process Explorer或Process Hacker在创建或删除进程时所做的相同行为。这两个应用程序都会将这些进程的单元格背景涂成红色或绿色,并保持一秒钟,然后切换回单元格原来的颜色。
仅供参考,我将通过wmi收到有关进程创建或删除的通知。
CellRect
,而不是TargetCanvas.ClipRect
。 - Ondrej KelleBeforeItemErase
事件(带有EraseAction := eaColor
),而不是BeforeCellPaint
。 - ain