VirtualStringTree CellPaint
那么,我有以下问题:
根据一些布尔变量,我用不同的颜色绘制了树形单元格。 例:
所以在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收到过程创建或删除的通知。
每当创建一个进程时,启动一个与该进程相关的定时器,超时时间为1秒。 isProcessMarkedForCreation
设置为true,因此该行被涂成绿色。 当计时器触发处理程序集时,将isProcessMarkedForCreation
设置为false,并强制重新绘制删除绿色突出显示的那一行。 现在定时器已经完成了它的工作,它应该被删除。 完全相同的方法可用于删除。
上一篇: VirtualStringTree CellPaint
下一篇: Is it possible to change the color of a row in a virtual string tree?