VirtualStringTree CellPaint - PullRequest
       16

VirtualStringTree CellPaint

5 голосов
/ 04 июля 2011

Ну, у меня есть следующая проблема:

Я нарисовал клетки дерева разными цветами в зависимости от некоторых логических переменных. Пример:

  • 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, is ProcessOwner и т. Д. *

Самая большая проблема - мне нужно это в неблокирующем режиме (я не могу использовать сон, иначе дерево тоже замерзнет, ​​поэтому изменение цвета не будет замечено)

Если вы все еще не можете следить за мной, я пытаюсь имитировать то же поведение, что и Process Explorer или Process Hacker, когда процесс создается или удаляется. Оба приложения на секунду закрашивают фон ячейки для этих процессов красным или зеленым, а затем переключаются обратно на исходный цвет ячейки.

Просто для информации, я получу уведомление о создании или удалении процесса через wmi.

1 Ответ

5 голосов
/ 04 июля 2011

Каждый раз, когда создается процесс, запускайте таймер, связанный с этим процессом, с таймаутом 1 с.isProcessMarkedForCreation имеет значение true, поэтому строка окрашена в зеленый цвет.Когда таймер срабатывает, обработчик устанавливает isProcessMarkedForCreation в false и вызывает перерисовку этой строки, которая удаляет зеленую подсветку.Теперь, когда таймер сделал свою работу, он должен быть удален.Точно такой же подход можно использовать для удаления.

...