好吧,我有以下问题:
我根据一些布尔变量绘制了不同颜色的树状单元格。 例如:
所以在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,是ProcessOwner等等......
最大的问题是我需要在非阻塞模式下使用它(我不能使用睡眠,否则树会冻结,所以不会注意到颜色变化)
如果您仍然无法关注我,我正在尝试模仿Process Explorer或Process Hacker在创建或删除流程时所执行的相同操作。这两个应用程序将这些过程的单元格背景描绘为红色或绿色一秒,然后切换回单元格的原始颜色。
仅供参考,我将通过wmi收到有关创建或删除流程的通知。
答案 0 :(得分:5)
每当创建进程时,启动与该进程关联的计时器,超时为1秒。 isProcessMarkedForCreation
设置为true,因此该行显示为绿色。当计时器触发时,处理程序将isProcessMarkedForCreation
设置为false并强制重新绘制该行以删除绿色突出显示。现在计时器已经完成了它的工作,它应该被删除。可以使用完全相同的方法进行删除。