VirtualStringTree CellPaint

那么,我有以下问题:

根据一些布尔变量,我用不同的颜色绘制了树形单元格。 例:

  • 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,ProcessOwner等等...

    最大的问题是我需要在非阻塞模式下(我不能使用睡眠,否则树会冻结,所以颜色变化不会被注意到)

    如果您仍然无法关注我,我试图模仿Process Explorer或Process Hacker在创建或删除进程时所执行的行为。 这两个应用程序都会将这些进程的单元背景绘制为红色或绿色,然后切换回原始单元格的颜色。

    仅供参考,我会通过wmi收到过程创建或删除的通知。


    每当创建一个进程时,启动一个与该进程相关的定时器,超时时间为1秒。 isProcessMarkedForCreation设置为true,因此该行被涂成绿色。 当计时器触发处理程序集时,将isProcessMarkedForCreation设置为false,并强制重新绘制删除绿色突出显示的那一行。 现在定时器已经完成了它的工作,它应该被删除。 完全相同的方法可用于删除。

    链接地址: http://www.djcxy.com/p/35013.html

    上一篇: VirtualStringTree CellPaint

    下一篇: Is it possible to change the color of a row in a virtual string tree?