加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – VirtualStringTree CellPaint

发布时间:2020-12-15 09:27:51 所属栏目:大数据 来源:网络整理
导读:好吧,我有以下问题: 我根据一些布尔变量绘制了不同颜色的树状单元格. 例: isProcessService, isProcessInDebugger, isProcessService, isProcessElevated, isProcessNet, isProcessOwner, isProcessinJob, isProcessPacked, isProcessMarkedForDeletion, i
好吧,我有以下问题:

我根据一些布尔变量绘制了不同颜色的树状单元格.
例:

> 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并强制重新绘制该行以删除绿色突出显示.现在计时器已经完成了它的工作,它应该被删除.可以使用完全相同的方法进行删除.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读