delphi - 虚拟字符串树单元绘制

标签 delphi virtualtreeview tvirtualstringtree

嗯,我有以下问题:

我根据一些 bool 变量将树单元绘制为不同的颜色。 示例:

  • isProcessService,
  • isProcessInDebugger,
  • isProcessService,
  • isProcessElevated,
  • isProcessNet,
  • isProcessOwner,
  • isProcessinJob,
  • isProcessPacked,
  • isProcessMarkedForDeletion,
  • isProcessMarkedForCreation: bool 值;

因此,在 BeforeCellPaint 中,我将根据以下 bool 值绘制单元格背景颜色:

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 等等...

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

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

仅供引用,我将通过 wmi 收到进程创建或删除的通知。

最佳答案

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

关于delphi - 虚拟字符串树单元绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6569354/

相关文章:

delphi - 禁用键盘快捷键(delphi)

德尔福。反转光标颜色

database - 登录显示错误信息

delphi - TVirtualStringTree - 添加对象而不是记录

Delphi VirtualTreeView在需要重绘时获取绘图 Canvas

delphi - 检测用户是否通过选项卡或单击获得组件的焦点

delphi - 引入/不推荐使用的Delphi语言功能和版本列表

Delphi:从虚拟字符串树中删除节点后更改焦点

delphi - 在 VirtualTreeView 中编辑根节点单元格文本

delphi - 扩展节点时如何更改TVirtualStringTree节点图标