【问题标题】:VirtualStringTree CellPaintVirtualStringTree CellPaint
【发布时间】:2011-09-28 00:01:53
【问题描述】:

好吧,我有以下问题:

我已经根据一些布尔变量将树细胞绘制成不同的颜色。 示例:

  • isProcessService,
  • isProcessInDebugger,
  • isProcessService,
  • isProcessElevated,
  • 是ProcessNet,
  • 是ProcessOwner,
  • isProcessinJob,
  • 是ProcessPacked,
  • isProcessMarkedForDeletion,
  • isProcessMarkedForCreation : 布尔值;

所以在 BeforeCellPaint 中,我将根据以下布尔值绘制单元格背景颜色:

过程 TMainForm.ProcessVstBeforeCellPaint(发件人:TBaseVirtualTree; 目标画布:TCanvas;节点:PVirtualNode;列:TColumnIndex; CellPaintMode:TVTCellPaintMode;单元格矩形:TRect; var ContentRect: TRect); 变量 节点数据:PProcessData; 开始 如果节点 = nil 则 出口; NodeData := Sender.GetNodeData(Node); 如果 NodeData = nil 则 出口; 如果 (NodeData^.isProcessOwner) 那么 开始 TargetCanvas.Brush.Color := $00AAFFFF; TargetCanvas.FillRect(TargetCanvas.ClipRect); 结尾; if (NodeData^.isProcessInDebugger) 那么 开始 TargetCanvas.Brush.Color := $00E5A5A5; TargetCanvas.FillRect(TargetCanvas.ClipRect); 结尾; 如果 (NodeData^.pProcessID = 0) 或 (NodeData^.pProcessID = 4) 那么 开始 TargetCanvas.Brush.Color := $00FFCCAA; TargetCanvas.FillRect(TargetCanvas.ClipRect); 结尾; 如果 (NodeData^.isProcessElevated) 而不是 (NodeData^.isProcessInDebugger) 那么 开始 TargetCanvas.Brush.Color := $0000AAFF; TargetCanvas.FillRect(TargetCanvas.ClipRect); 结尾; if (NodeData^isProcessService) 和 不是 (NodeData^.isProcessPacked) 和 不是(NodeData^.isProcessNet) 然后 开始 TargetCanvas.Brush.Color := $00FFFFCC; TargetCanvas.FillRect(TargetCanvas.ClipRect); 结尾; 如果 (NodeData^.isProcessMarkedForDeletion) 那么 开始 TargetCanvas.Brush.Color := $005D5DFF; TargetCanvas.FillRect(TargetCanvas.ClipRect); 结尾; 如果 (NodeData^.isProcessMarkedForCreation) 然后 开始 TargetCanvas.Brush.Color := $0061E15E; TargetCanvas.FillRect(TargetCanvas.ClipRect); 结尾; 如果 (NodeData^.isProcessNet) 那么 开始 TargetCanvas.Brush.Color := $005CE0BF; TargetCanvas.FillRect(TargetCanvas.ClipRect); 结尾; 结尾;


问题是:

如何根据要创建或删除的进程将单元格涂成绿色或红色(让颜色保持至少一秒钟,然后切换回其原始值?)

换句话说,创建了一个进程,将单元格涂成绿色等待一秒钟,然后切换回原始颜色,具体取决于:isProcessService、is ProcessOwner 等等...

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

如果您仍然无法关注我,我正在尝试模仿 Process Explorer 或 Process Hacker 在创建或删除进程时所做的相同行为。两个应用程序都将这些进程的单元格背景涂成红色或绿色一秒钟,然后切换回单元格的原始颜色。

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

【问题讨论】:

  • 使用CellRect,而不是TargetCanvas.ClipRect
  • 您如何处理进程列表中的更改,您是不断重建树还是根据需要添加/删除节点?顺便说一句,在 VT 中设置单元格背景颜色的正确方法是使用BeforeItemErase 事件(使用EraseAction := eaColor),而不是BeforeCellPaint
  • 你说得对,有点困惑

标签: delphi virtualtreeview tvirtualstringtree


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多